ASP.Net MVC 3 ViewModel Аннотации данных

Я занимаюсь разработкой веб-приложения ASP.Net MVC 3 с Entity Framework 4.1, и меня немного смущает использование аннотаций данных для проверки формы. Я всегда возвращаю ViewModel в View, а не передаю фактический объект, поскольку понимаю, что это плохая практика. Например:

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);
    }

Теперь это работает нормально, однако, чем больше я читаю о ViewModel и валидации, тем больше кажется, что именно ViewModel следует проверять, потому что в конце дня именно ViewModel отображается в View , а не объект.

Поэтому я изменил свою ViewModel, чтобы выглядеть следующим образом

public class ViewModelListItem
{

    public int teamID { get; set; }

    [DisplayName("Item Name")]
    [Required(ErrorMessage = "Please enter a Team Name")]
    public string 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();
     viewModel.description = team.description;

        return View(viewModel);
    }

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

Мне было бы интересно услышать мысли других людей по этому поводу. Спасибо за вашу помощь, и я прошу прощения за такой длинный пост.

Ответы на вопрос(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");
    }
}
 Darin Dimitrov29 июн. 2012 г., 09:38
@GibboK, лично я вообще не использую аннотации данных. я используюFluentValidation.NET вместо. И в зависимости от специфики данного проекта, над которым я работаю, у меня могут быть валидаторы, не имеющие моделей представления и моделей предметной области, или только модели представления. Должна быть, по крайней мере, проверка модели представления, а что касается модели предметной области, то бизнес-правила будут диктовать.
 tcode27 мар. 2012 г., 16:06
Что если бы моя ViewModel представляла Объект, который имел 30 свойств, внутри контроллера создания, если создание не удалось, мне пришлось бы затем назначить каждое свойство обратно ViewModel, т.е. viewModel.property1 = team.prop1, viewModel.property2 = team.prop2, viewModel.property3 = team.prop3 ... viewModel.property30 = team.prop30 и т. д. Это кажется неэффективным, но, возможно, именно это и делает AutoMapper? Я никогда не использовал это раньше.
 tcode27 мар. 2012 г., 16:09
Это имеет большой смысл. Отличный ответ. Спасибо.
 GibboK30 июн. 2012 г., 11:30
Спасибо, Дарин, за то, что поделился, я буду рассматривать FluentValidation.NET и для моего проекта
 GibboK29 июн. 2012 г., 09:20
Спасибо Дарину Димитрову за то, что поделились. Просто вопрос, так что вы используете только DataAnnoration на вашей ViewModel и никогда на модели? Посмотри на этоforums.asp.net/t/1502378.aspx

Ваш ответ на вопрос