2015-03-31 5 views
0

Я пишу веб-приложение, в котором пользователи могут зарегистрироваться и войти на веб-сайт.C# database connection model

У меня есть веб-форма ASP.NET с серией текстовых полей и кнопкой отправки. Когда я сделал то же самое в PHP, когда была нажата кнопка отправки, был создан класс User, а содержимое текстовых полей было передано функции addUser(), которая взяла эти параметры и вставила их в базу данных, и теперь я Я пытаюсь сделать то же самое в C#.

В идеале, я хочу использовать тип MVC. Контроллер (текстовые поля и кнопка) должен собирать информацию в текстовых полях и передавать ее в модель (класс пользователя), которая должна подключаться к базе данных и выполнять необходимую инструкцию insert. Как сделать подключение класса к базе данных? Какие параметры нужны?

Нужен ли мне объект SqlDataSource на странице, которую я передаю конструктору класса User? Или что-то другое?

+0

Нет, модель должна * не * подключаться к базе данных. Ваш уровень данных должен отвечать за это, а не за модель. ** Разделение проблем! ** – mason

+0

Причина, по которой модель не должна подключаться к базе данных, заключается в том, что это не работа с моделями. Модель должна содержать только информацию о объекте домена и любой логике домена (бизнеса). Таким образом, вы можете изменить базу данных, не затрагивая модель. У меня есть пример этого в [демонстрационном проекте] (https://github.com/mason-mcglothlin/FancyStoreDemo), который я создал, где вы можете поменять местами и слоями данных без необходимости изменять модель, поскольку это следует принцип разделения идей. – mason

+0

Я никогда не слышал о «слое данных». Я предполагаю, что могу сделать это без модели - просто введите код в методе нажатия кнопки, который подключается к базе данных, но это кажется каким-то неудовлетворительным ... –

ответ

3

Ваш контроллер должен выглядеть следующим образом:

[HttpPost] 
[ActionName("MyAction")] 
public ActionResult MyAction(MyModel model) { 
    // ... model has been loaded with data from the form, now work with it. 
    // ex: MyDataLayer.Save(model); 
} 

Установить форму вашего взгляда на POST, чтобы «MyAction» и ваша модель будет создана и предварительно загруженной с помощью model binding.

1

Ну, в вашей Razor .cshtml View, у вас должна быть модель для регистрации пользователей.

Это точка зрения Бритвы. Чтобы связать данные с вашим HTML.

Это будет выглядеть ..

@model YourProject.Models.UserRegister 

@using (Html.BeginForm()) 
{ 
    @Html.ValidationSummary(true) 
    @Html.AntiForgeryToken() 

    <div class="form-horizontal"> 
     <h4>User Registration</h4> 
     <hr /> 
     @Html.ValidationSummary(true, "", new { @class = "text-danger" }) 
     <div class="form-group"> 
      @Html.LabelFor(model => model.UserName, htmlAttributes: new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       @Html.EditorFor(model => model.UserName, new { htmlAttributes = new { @class = "form-control" } }) 
       @Html.ValidationMessageFor(model => model.UserName, "", new { @class = "text-danger" }) 
      </div> 
     </div> 

это будет точная копия вашего User класса.

Когда пользователь нажимает кнопку отправки в вашей форме, вам понадобится метод в контроллере для обработки этого POST, на что ссылается Джош М.. Поскольку вы использовали свойства модели выше для привязки к элементам HTML, пользователь заполняет свойства вашей модели User, и мы ее поймаем в контроллере.

Я бы не использовал логин базы данных сам по себе в контроллере, но для простоты это зависит от того, как вы взаимодействуете с базой данных (Entity Framework, Enterprise Library и т. Д.).

Здесь вы можете позвонить dbContext и использовать Linq, чтобы зафиксировать изменения, или вы можете написать встроенный SQL, чтобы записать их в базу данных или вызвать хранимую процедуру. Затем вам необходимо сопоставить эти свойства вашего класса User с параметрами SQL.

Таким образом, весь поток:

Пользователь заполняет модель -> сообщений для управления -> Сопоставьте свойства SQL параметров или Зафиксируйте изменения, используя ваш DbContext для Entity Framework.

+0

Я не знаю, что такое Razor, и этот код выглядит совершенно незнакомым. Это часть C#? –

+0

Итак, в MVC есть механизм просмотра под названием Razor. «Html.DisplayFor» позволяет привязывать данные из вашей модели (пользовательский класс) к элементам HTML. –

+0

@ Invent-Animate Я думаю, что проблема в том, что Sophie использует Web Forms вместо MVC, а Web Forms не может использовать Razor. – mason

1

Это краткий отрывок из созданного мной sample project.

Необходимо определить объект модели. Вместо пользователей (потому что обработка паролей немного сложна), этот пример будет для продуктов в магазине.

Вам необходимо определить интерфейс для вашего уровня данных.

public interface IStoreRepository 
    { 
    Product GetProductById(int id); 

    List<Product> GetAllProducts(); 

    void AddNewProduct(Product product); 

    void UpdateProduct(Product product); 

    void DeleteProduct(int id); 
    } 

Тогда вы бы написать конкретный класс орудия граничного слоя данных и выполняете фактическую CR (Create Read Update Delete). Вот как выглядит MS SQL Server.

public class MsSqlStoreRepository : IStoreRepository 
    { 
    private string ConnectionString { get; set; } 

    public MsSqlStoreRepository(string connectionString) 
     { 
     ConnectionString = connectionString; 
     } 

    private Product GenerateProductFromDataRow(DataRow row) 
     { 
     return new Product() 
     { 
      Id = row.Field<int>("id"), 
      Name = row.Field<string>("name"), 
      Description = row.Field<string>("description"), 
      Price = row.Field<double>("price") 
     }; 
     } 

    public Product GetProductById(int id) 
     { 
     var command = new SqlCommand("select id, name, description, price from products where [email protected]"); 
     command.Parameters.AddWithValue("id", id); 
     var dt = MsSqlDatabaseHelpers.GetDataTable(command, ConnectionString); 
     return dt.AsEnumerable().Select(r => GenerateProductFromDataRow(r)).Single(); 
     } 

    public List<Product> GetAllProducts() 
     { 
     var command = new SqlCommand("select id, name, description, price from products"); 
     var dt = MsSqlDatabaseHelpers.GetDataTable(command, ConnectionString); 
     return dt.AsEnumerable().Select(r => GenerateProductFromDataRow(r)).ToList(); 
     } 

    public void AddNewProduct(Product product) 
     { 
     var command = new SqlCommand("insert into products (id, name, description, price) values (@id, @name, @description, @price)"); 
     command.Parameters.AddWithValue("id", product.Id); 
     command.Parameters.AddWithValue("name", product.Name); 
     command.Parameters.AddWithValue("description", product.Description); 
     command.Parameters.AddWithValue("price", product.Price); 
     MsSqlDatabaseHelpers.ExecuteNonQuery(command, ConnectionString); 
     } 

    public void UpdateProduct(Product product) 
     { 
     var command = new SqlCommand("update products set [email protected], [email protected], [email protected] where [email protected]"); 
     command.Parameters.AddWithValue("id", product.Id); 
     command.Parameters.AddWithValue("name", product.Name); 
     command.Parameters.AddWithValue("description", product.Description); 
     command.Parameters.AddWithValue("price", product.Price); 
     MsSqlDatabaseHelpers.ExecuteNonQuery(command, ConnectionString); 
     } 

    public void DeleteProduct(int id) 
     { 
     var command = new SqlCommand("delete from products where id=:id"); 
     command.Parameters.AddWithValue("id", id); 
     MsSqlDatabaseHelpers.ExecuteNonQuery(command, ConnectionString); 
     } 
    } 

Теперь мы следили за разделом проблем, и единственное, что осталось, - написать фактическую логику пользовательского интерфейса. Предполагая, что вы используете веб-форму, это может выглядеть следующим образом:

[Inject] //using Ninject to inject MsSqlStoreRepository 
public IStoreRepository Repo { get; set; } 

protected void AddProductBtn_Click(object sender, EventArgs e) 
{ 
    Product product = new Product() 
    { 
     Id = Int32.Parse(IdTB.Text), 
     Name = NameTB.Text, 
     Description = DescriptionTB.Text, 
     Price = Double.Parse(PriceTB.Text) 
    }; 
    Repo.AddNewProduct(product); 
    //now clear the form or show success message etc 
} 

Обратите внимание, что мой веб-страница не имеет ни малейшего представления о о MsSqlStoreRepository, потому что это только общается через IStoreRepository. Это делает абсолютно уверенным, что я не выполняю какие-либо материалы, связанные с базой данных на своей веб-странице, и что я могу свободно менять базы данных по своему усмотрению, создавая новый конкретный класс, который наследуется от IStoreRepository. И если вы посмотрите на ссылку в верхней части моего ответа, вы увидите, что я сделал именно это.

+0

А, я вижу, что ты там делаешь! Я думаю, что было недопонимание. Моя манипуляция «Пользователь» - это просто получение материала и добавление материала в базу данных, поэтому я создал класс обработки данных и назвал его «Пользователь». У меня нет класса User в традиционном смысле, просто класс уровня данных, который касается информации о пользователе. Это достаточно маленький проект, который я могу уйти от таких вещей. –

+1

@SophieBrown Ну, вы должны. Вы заявили о себе в своем вопросе о том, что вам нужна архитектура Model-View-Controller. Ваша модель не должна выполнять манипуляции, это нужно для слоя данных. – mason