ASP.Net MVC 3 аннотации данных ViewModel
Я разрабатываю веб-приложение ASP.Net MVC 3 с Entity Framework 4.1, и я немного запутался в отношении использования аннотаций данных для проверки формы.
Я всегда возвращаю ViewModel в представление, а не передачу фактического объекта, поскольку я понимаю, что это плохая практика. Например:
public class ViewModelTeam
{
public Team Team { get; set; }
}
В моем представлении может быть что-то вроде этого
@model UI.ViewModels.ViewModelTeam
@Html.HiddenFor(model => model.Team.teamID)
<div class="editor-label">
@Html.LabelFor(model => model.Team.description)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Team.description)
@Html.ValidationMessageFor(model => model.Team.description)
</div>
Чтобы проверить этот вид, я создал аннотации данных в частичном классе, например
[MetadataType(typeof(TeamMetaData))]
public partial class Team
{
public class TeamMetaData
{
[DisplayName("Team Name")]
[Required(ErrorMessage = "Please enter a Team Name")]
public object description { get; set; }
И затем в моем контроллере создания у меня есть это
[HttpPost]
public ActionResult Create(Team team)
{
if (ModelState.IsValid)
{
//Add team and redirect
}
//Got this far then errors have happened
//Add Model State Errors
ViewModelTeam viewModel = new ViewModelTeam
{
Team = team
};
return View(viewModel);
}
Теперь это прекрасно работает, однако чем больше я читаю о ViewModels и проверке, тем больше кажется, что это ViewModel, который должен быть проверен, потому что в конце дня отображается ViewModel в представлении, а не в объекте.
Поэтому я изменил свой ViewModel, чтобы выглядеть следующим образом
public class ViewModelListItem
{
public int teamID { get; set; }
[DisplayName("Item Name")]
[Required(ErrorMessage = "Please enter a Team Name")]
public string description { get; set; }
И я также изменил свой Create Controller на этот
[HttpPost]
public ActionResult Create(Team team)
{
if (ModelState.IsValid)
{
//Add team and redirect
}
//Got this far then errors have happened
//Add Model State Errors
ViewModelTeam viewModel = new ViewModelTeam();
viewModel.description = team.description;
return View(viewModel);
}
Опять же, это работает, но я просто чувствую, что второй метод немного беспорядочен или неэффективен при первом способе этого.
Мне было бы интересно услышать мысли других народов об этом. Спасибо за вашу помощь, и я прошу прощения за такой длинный пост.
Ответы
Ответ 1
Я всегда использую модели просмотра и AutoMapper, чтобы упростить сопоставление между моделями моего домена и просмотра.
просмотреть модель:
public class TeamViewModel
{
[DisplayName("Team Name")]
[Required(ErrorMessage = "Please enter a Team Name")]
public string Description { get; set; }
}
а затем обычно используемый шаблон:
public class TeamsController: Controller
{
public ActionResult Create()
{
var model = new TeamViewModel();
return View(model);
}
[HttpPost]
public ActionResult Create(TeamViewModel model)
{
if (!ModelState.IsValid)
{
return View(model);
}
Team team = Mapper.Map<TeamViewModel, Team>(model);
Repository.DoSomethingWithTeam(team);
return RedirectToAction("Success");
}
}