He estado realizando algunos experimentos con ASP.NET MVC2 y me he encontrado con un problema interesante.Validaciones de la anotación de datos y Custom ModelBinder
Me gustaría definir una interfaz alrededor de los objetos que se utilizarán como Modelos en la aplicación MVC. Además, me gustaría aprovechar funcionalmente la nueva DataAnnotation marcando los miembros de esta interfaz con atributos de validación.
lo tanto, si mi sitio tiene un objeto "Foto", voy a definir la interfaz siguiente:
public interface IPhoto
{
[Required]
string Name { get; set; }
[Required]
string Path { get; set; }
}
Y voy a definir la siguiente implementación:
public class PhotoImpl : IPhoto
{
public string Name { get; set; }
public string Path { get; set; }
}
Mi MVC App El controlador puede incluir métodos como:
public class PhotoController : Controller
{
[HttpGet]
public ActionResult CreatePhoto()
{
return View();
}
[HttpPost]
public ActionResult CreatePhoto(IPhoto photo)
{
if(ModelState.IsValid)
{
return View();
}
else
{
return View(photo);
}
}
}
Y, por último, para vincular PhotoImpls a los parámetros en estos ac métodos ción, que podrían llevar a cabo las siguientes ampliaciones de la DefaultModelBinder:
public class PhotoModelBinder : DefaultModelBinder
{
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
if(bindingContext.ModelType == typeof(IPhoto))
{
IPhoto photo = new PhotoImpl();
// snip: set properties of photo to bound values
return photo;
}
return base.BindModel(controllerContext, bindingContext);
}
}
Todo parece trabajar muy bien, excepto que la propiedad ModelState.IsValid en mi controlador no parece darse cuenta de valores no válidos (por ejemplo, null) en las propiedades [Requerido] de la implementación de IPhoto.
Sospecho que estoy descuidando establecer alguna pieza importante de estado en mi implementación de ModelBinder. ¿Algún consejo?
Gracias por la respuesta. No parece ser un problema con la ubicación del atributo [Requerido]. El problema continúa si muevo los atributos a PhotoImpl, cambio el controlador para operar en un PhotoImpl y cambio el ModelBinder para que actúe en las solicitudes de un PhotoImpl. Por el contrario, si le indico a mi ModelBinder que no actúe sobre PhotoImpl y que recurra a la implementación predeterminada de ModelBinder, las validaciones funcionan correctamente. –