2012-03-27 30 views
18

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 un 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:ASP.Net MVC 3 ViewModel Anotaciones de datos

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

Mi Ver a continuación, 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 al igual que

[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 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 
     { 
      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, he cambiado de modelo de vista a tener 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 he cambiado de Controlador de crear 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); 
    } 

Una vez más, esto funciona, pero acabo de tener la sensación de la El segundo método es un poco desordenado o no es tan eficiente en la primera forma de hacer esto.

Me gustaría escuchar las opiniones de otras personas sobre esto. Gracias por su ayuda y me disculpo por una publicación tan larga.

Respuesta

11

Siempre uso los modelos de vista y AutoMapper para ayudarme a simplificar la asignación entre mi dominio y los modelos de visualización.

vista del modelo:

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

y luego un patrón de uso común:

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

Qué pasa si mi modelo de vista representa un objeto que tenía decir 30 propiedades, dentro del controlador de crear, si el crear falla, entonces tendría que asignar cada propiedad de nuevo al ViewModel, es decir, viewModel.property1 = team.prop1, viewModel.property2 = team.prop2, viewModel.property3 = team.prop3 ... viewModel.property30 = team.prop30 etc. Esto parece ineficiente, pero tal vez eso es lo que hace AutoMapper? Nunca lo he usado antes – tgriffiths

+0

Esto tiene mucho sentido. Gran respuesta. Gracias. – tgriffiths

+0

Gracias Darin Dimitrov por compartir. Solo una pregunta, entonces ¿solo usas DataAnnoration en tu ViewModel y nunca en el Modelo? Eche un vistazo a este http://forums.asp.net/t/1502378.aspx – GibboK

Cuestiones relacionadas