Я провел несколько экспериментов с ASP.NET MVC2 и столкнулся с интересной проблемой.
Я бы хотел определить интерфейс вокруг объектов, которые будут использоваться в качестве моделей в приложении MVC. Кроме того, я хотел бы функционально использовать преимущества новой DataAnnotation, помечая элементы этого интерфейса атрибутами проверки.
Итак, если на моем сайте есть объект «Фото», я определю следующий интерфейс:
public interface IPhoto
{
[Required]
string Name { get; set; }
[Required]
string Path { get; set; }
}
И я определю следующую реализацию:
public class PhotoImpl : IPhoto
{
public string Name { get; set; }
public string Path { get; set; }
}
Мой контроллер приложения MVC может содержать такие методы, как:
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);
}
}
}
И, наконец, чтобы связать PhotoImpls с параметрами в этих методах действия, я мог бы реализовать следующие расширения 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);
}
}
Кажется, что все работает отлично, за исключением того, что свойство ModelState.IsValid в моем контроллере не замечает недопустимых значений (скажем, null) в свойствах [Required] реализации IPhoto.
Я подозреваю, что я пренебрегаю установкой некоторого важного элемента состояния в моей реализации ModelBinder. Есть намеки?