validate tag route net mvc for dropdownlist asp asp.net-mvc validation viewmodel

asp.net-mvc - tag - validate dropdownlist mvc



ValidaciĆ³n en ViewModels en ASP.NET MVC (2)

La mayoría de los consejos sobre cómo implementar la validación en ASP.NET MVC parecen centrarse en el Modelo (ya sea construyendo capas de servicio entre el modelo y el controlador o decorando las propiedades del modelo con atributos de validación).

En mi aplicación, uso ViewModels para todas las comunicaciones entre los controladores y las vistas.

Tengo un ViewModel para mi página de inicio de sesión llamado ''LoginViewModel'' con una propiedad llamada ''EmailAddress''.

Cuando el usuario ingresa su dirección de correo electrónico y hace clic en enviar, este modelo de vista se completa y se envía al controlador, donde se valida la dirección de correo electrónico.

Debe ser una dirección de correo electrónico válida, y el usuario debe ser de un dominio que está registrado en el sistema.

¿Cuál sería una forma conveniente de agregar validación a esto? ¿Debería poner la validación en el ViewModel mismo? ¿O debería permanecer en el controlador?


Los tutoriales de NerdDinner muestran que la validación se produce en las clases parciales del modelo (es decir, Linq to SQL o Entity Framework). Pero ya que está usando View Models, puede poner allí la lógica de validación.

La lógica de validación no entra en el controlador. Por el contrario, está enganchado desde el controlador con una propiedad de comprobación, es decir, ModelState.IsValid

[AcceptVerbs(HttpVerbs.Post)] public ActionResult Create(Dinner dinner) { if (ModelState.IsValid) { try { dinner.HostedBy = "SomeUser"; dinnerRepository.Add(dinner); dinnerRepository.Save(); return RedirectToAction("Details", new { id=dinner.DinnerID }); } catch { ModelState.AddModelErrors(dinner.GetRuleViolations()); } } return View(new DinnerFormViewModel(dinner)); }

Los detalles completos están aquí:

Construyendo el Modelo
http://nerddinnerbook.s3.amazonaws.com/Part3.htm

y aquí:

ViewData y ViewModel
http://nerddinnerbook.s3.amazonaws.com/Part6.htm


"¿Debería poner la validación en el ViewModel mismo? ¿O debería permanecer en el controlador?" Estoy de acuerdo con Robert, pero agregaría un conector para una automatización adicional.

Si observa una herramienta como xVal , puede ver que la validación de rutina (por ejemplo, campos obligatorios, números dentro de rangos, cadenas que coinciden con expresiones regulares) se puede hacer automáticamente decorando campos de sus clases de datos. De hecho, xVal puede escribir automáticamente el JavaScript para validaciones de rutina para que se lleve a cabo en el lado del cliente. Todo sin escribir ningún código. Las validaciones más profundas (por ejemplo, ¿este usuario es miembro de un dominio registrado en nuestra base de datos?) Pasan por el lado del servidor dentro de la capa del modelo en sí.

Usar el modismo de ViewModel puede plantear algunos desafíos a este esquema. Mi enfoque actual es incrustar mis objetos de entidad dentro de mi modelo de vista, por ejemplo

public class Contact { [Required] string Name { get; set; } } public class ContactView { public Contact Contact { get; set; } public string SomeOtherViewProperty { get; set; } }

y luego en el controlador, la validación superficial ocurre al actualizar el modelo:

UpdateModel(contactViewModel.Contact, "Contact");

y las validaciones que requieren más información o cálculos más complicados suceden dentro de la propia capa del modelo.

Otro enfoque no es incrustar el objeto de la entidad, sino simplemente asignar los campos individuales entre los dos. Recientemente me di cuenta de una herramienta llamada AutoMapper que vincula automáticamente campos entre dominios y ver objetos modelo. Parece que debería ser compatible con este método de validación, aunque todavía no lo he usado.