【发布时间】:2010-01-08 19:17:07
【问题描述】:
我一直在用 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 属性似乎没有注意到 IPhoto 实现的 [Required] 属性中的无效值(例如,null)。
我怀疑我忽略了在我的 ModelBinder 实现中设置一些重要的状态。有什么提示吗?
【问题讨论】: