net mvc framework dataannotations data asp asp.net-mvc-3 viewmodel data-annotations partial-classes

asp.net-mvc-3 - framework - view model mvc c#



Anotaciones de datos de ASP.Net MVC 3 ViewModel (1)

Siempre utilizo View Models y AutoMapper para ayudarme a simplificar la asignación entre mi dominio y los modelos de visualización.

ver modelo:

public class TeamViewModel { [DisplayName("Team Name")] [Required(ErrorMessage = "Please enter a Team Name")] public string Description { get; set; } }

y luego un patrón comúnmente utilizado:

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

Estoy desarrollando una aplicación Web ASP.Net MVC 3 con Entity Framework 4.1 y estoy un poco confundido con respecto al uso de anotaciones de datos para la validación de formularios. Siempre devuelvo ViewModel a una Vista en lugar de pasar el objeto real, ya que me doy cuenta de que esto es una práctica deficiente. Por ejemplo:

public class ViewModelTeam { public Team Team { get; set; } }

Mi vista podría tener algo como esto

@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>

Para validar esta Vista, he creado Anotaciones de datos en una clase parcial como tal

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

Y luego en mi crear controlador tengo esto

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

Ahora, esto funciona bien, sin embargo, cuanto más leo sobre ViewModels y la validación, más parece que es el ViewModel el que debe validarse, porque al final del día, es el ViewModel que se muestra en la Vista. no el objeto

Por lo tanto, cambié mi ViewModel para que se vea como el siguiente

public class ViewModelListItem { public int teamID { get; set; } [DisplayName("Item Name")] [Required(ErrorMessage = "Please enter a Team Name")] public string description { get; set; }

Y también cambié mi controlador de creación a este

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

Nuevamente, esto funciona, pero tengo la sensación de que el segundo método es un poco desordenado o no tan eficiente en la primera forma de hacer esto.

Me interesaría escuchar los pensamientos de otras personas sobre esto. Gracias por su ayuda y me disculpo por una publicación tan larga.