Pregunta

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 servicios entre el modelo y el controlador o decorando las propiedades del modelo con atributos de validación).

En mi aplicación utilizo ViewModels para toda la comunicación 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 ViewModel 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 pertenecer a un dominio registrado en el sistema.

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

¿Fue útil?

Solución

"¿Debo poner la validación en el propio modelo de vista? ¿O debe permanecer en el controlador" Estoy de acuerdo con Robert, pero me gustaría añadir un enchufe para la automatización adicional.

Si nos fijamos en una herramienta como XVal , se puede ver que la validación de rutina (por ejemplo, los campos requeridos, números dentro de los rangos, cadenas que coinciden con las expresiones regulares) se puede hacer automáticamente mediante la decoración de los 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 el lado del cliente. Todo ello sin necesidad de escribir código. validaciones más profundas (por ejemplo, es este usuario un miembro de un dominio registrado en nuestra base de datos?) pasar del lado del servidor dentro de la propia capa de modelo.

Usando el lenguaje modelo de vista puede plantear algunos problemas a este esquema. Mi enfoque actual es la de insertar mi entidad de objetos 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 después en el controlador, la validación superficial ocurre cuando la actualización del 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 de modelo.

Otro enfoque no es para incrustar el objeto entidad, sino que simplemente asignar campos individuales entre los dos. Recientemente me he dado cuenta de una herramienta llamada AutoMapper que enlaza automáticamente los campos entre los objetos de dominio y la vista del modelo. Parece que se debe apoyar este método de validación, aunque no he usado todavía.

Otros consejos

El Tutoriales de NerdDinner muestre que la validación ocurre en sus clases parciales del modelo (es decir,Linq a SQL o Entity Framework).Pero como estás usando Ver modelos, puedes poner la lógica de validación allí.

La lógica de validación no va en el controlador.Más bien, se engancha desde el controlador con una propiedad de verificación, es decir.EstadoModelo.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í:

Ver datos y ver modelo
http://nerddinnerbook.s3.amazonaws.com/Part6.htm

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top