ASP.NET MVC - создайте новую модель или используйте класс платформы Entity - PullRequest
7 голосов
/ 27 марта 2012

Я занимаюсь разработкой приложения ASP.NET MVC 3, сначала я использую код структуры сущностей для создания классов своего приложения, а также у меня есть хранилище для выполнения операций над ним, сохраняя чистоту DBContext. и определения DBEntities.

Мои сомнения касаются визуализации видов и способа сохранения модели редактирования.

Если у меня есть этот объект, который представляет пользователя, хранящегося в моей БД:

//Entity:
public class User 
{
    [Key]
    public int IdUser { get; set; }
    public string UserName { get; set; }   
    public string Password { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Email { get; set; }
}

И я хочу показать представление с именами FirstName, LastName, Email и NewPassword, ConfirmPasword и CurrentPassword, чтобы позволить пользователю изменять свои данные, вводя CurrentPassword для подтверждения изменений, поэтому я сомневаюсь, что файлы похожи на ConfirmPasword и CurrentPassword не входят в мою сущность, поэтому мне нужно создать новую модель для этого представления и скопировать необходимую информацию из моей новой модели в мою базу данных, чтобы сохранить ее? Как:

public class UpdateUserModel
{

    [Required]
    [Display(Name = "Name")]
    public string FirstName{ get; set; }

    [Required]
    [Display(Name = "Last Name")]
    public string LastName{ get; set; }

    [Required]
    [DataType(DataType.EmailAddress)]
    [Display(Name = "Not valid email")]
    public string Email { get; set; }      

    [DataType(DataType.Password)]
    [Display(Name = "New password")]
    public string NewPasword{ get; set; }

    [DataType(DataType.Password)]
    [Display(Name = "Confirm the New Pasword")]
    [Compare("NewPasword", ErrorMessage = "Password doesn´t mach.")]
    public string ConfirmPasword{ get; set; }

    [Required(ErrorMessage = "Need to specify the current password to save changes")]
    [DataType(DataType.Password)]
    [Display(Name = "Current Password")]
    public string CurrentPassword { get; set; }
}

и в контроллере я сделал:

public ActionResult UpdateUser(UpdateUserModel model)
{              
    User u = (User)Membership.GetUser();            
    u.FirstName = model.FirstName;
    u.LastName = model.LastName;
    u.Email = model.Email;

    if (!String.IsNullOrEmpty(model.NewPassword))
    {
        u.Password = FormsAuthentication.HashPasswordForStoringInConfigFile(model.NewPassword.Trim(), "md5");
    }

    repository.UpdateUser(u);

    return View();
}

Есть любой способ сделать это с контроллером, подобным:

public ActionResult UpdateUser(User u)
{               
    repository.UpdateUser(u);              
    return View();
}

Потому что, если у меня есть это, как я могу добавить поле, например, ConfirmPassword или CurrentPassword, чтобы выполнить проверку для этого конкретного представления.

Ответы [ 2 ]

6 голосов
/ 27 марта 2012

На вашем месте я бы не использовал модель предметной области в своем уровне представления. Я хотел бы создать модель представления (другой класс), которая будет очень похожа на мою модель предметной области. Затем я использовал бы инструмент автоматического сопоставления для сопоставления моей модели предметной области с моделью представления.

Это очень распространенный сценарий, поэтому, если вы используете Google для моделей "просмотр и домен", вы должны найти все, что вам нужно.

public class User {
        [Key]
        public int IdUser { get; set; }
        public string UserName { get; set; }   
        public string Password { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string Email { get; set; }

}

public class UpdateUserViewModel {
    // Original fields

    public string Password  { get; set; }

    public string PasswordConfirmation { get; set;
}

Затем вы можете настроить автоматическое отображение для удаления кода вашей котельной плиты:

public ActionResult ShowUser()
{
    var domainModel = new User(); // I'm assuming that properties are set somewhere
    var viewModel = new UserViewModel();  

    Autommaper.Map(domainModel, viewModel);

    return View(viewModel);
}

Это очень грубо, но, надеюсь, у вас есть идея.

Обновление 1: **

Как я понял, лучше создать новую модель для каждого вида, а затем сопоставить ее с сущностью

Это не просто лучше, оно обеспечивает лучшее разделение задач, делает ваш код легко тестируемым. Просто взглянув на имя класса, я могу увидеть его назначение (UpdateUserViewModel, RegisterUserViewModel и т. Д.).

Исходные поля в этом классе должны быть Метаданными с проверкой, а это не так?

Под оригинальными полями я имею в виду:

public class UserViewModel{
   public string UserName { get; set; }
   public string FirstName { get; set; }

}

Эти поля уже находятся в вашем классе User, поэтому я сэкономил свое время, не вводя их снова.

Это изменит мою модель с MVC на MVVM или не из-за того, что у меня все еще есть контроллер?

Я полагаю, что то, что я предложил, все еще является паттерном MVC, а не MVVM.

Об Automaper, используете ли вы github.com/AutoMapper/AutoMapper?

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

Удачи.

1 голос
/ 27 марта 2012

Обычно я использую области для разных частей моего проекта, а также место для размещения этого дополнительного кода.

В значительной степени вы собираетесь добавить в папку вашей модели класс viewmodel.cs.Внутри этого класса будут храниться ваши определения того, как данные будут смоделированы в представлении.Эти viewmodels будут отражать части сущности, с которыми вы хотите, чтобы пользователь взаимодействовал.Взаимодействие будет осуществляться в контроллерах через [HttpGet], где вы передаете модель представления, с которой будете взаимодействовать, и [HttpPost], где вы отправляете модель обратно и затем сопоставляете ее с сущностью.

ViewModels.cs:

public class UserViewModel
{
 public string UserName { get; set; }
}

SomeController:

public ActionResult getView()
{
 var uvm = new UserViewModel();
 return View(uvm);
}

Просмотр getView.cshtml:

@model project.namespace.UserViewModel

@using (Html.BeginForm())
{
 @Html.EditorFor(m => m.UserName)
 <input type="submit" value="New User Name" />
}

Назад в контроллер:

[HttpPost]
public ActionResult getView(UserViewModel model)
{
 var entity = new ActualEntity();
 entity.username = model.UserName;
 //more mapping
 //commit changes somewhere
 return RedirectToAction("getView");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...