asp.net-mvc - DataAnnotation 验证和自定义 ModelBinder

标签 asp.net-mvc asp.net-mvc-2

我一直在用 ASP.NET MVC2 进行一些实验,并遇到了一个有趣的问题。

我想围绕将用作 MVC 应用程序中的模型的对象定义一个接口(interface)。此外,我想通过使用验证属性标记此接口(interface)的成员,从而在功能上利用新的 DataAnnotation。

因此,如果我的网站有一个“照片”对象,我将定义以下接口(interface):

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 App Controller 可能包括以下方法:
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 绑定(bind)到这些操作方法中的参数,我可能会为 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);
 }
}

一切似乎都很好,除了我的 Controller 中的 ModelState.IsValid 属性似乎没有注意到 IPhoto 实现的 [Required] 属性中的无效值(例如,null)。

我怀疑我忽略了在我的 ModelBinder 实现中设置一些重要的状态。有什么提示吗?

最佳答案

我遇到过同样的问题。答案不是在您的自定义模型绑定(bind)器中覆盖 BindModel(),而是覆盖 CreateModel()...

protected override object CreateModel(ControllerContext controllerContext, ModelBindingContext bindingContext, System.Type modelType)
{
    if (modelType == typeof(IPhoto))
    {
        IPhoto photo = new PhotoImpl();
        // snip: set properties of photo to bound values
        return photo;
    }

    return base.CreateModel(controllerContext, bindingContext, modelType);
}

然后,您可以让基础 BindModel 类通过验证来完成它的工作:-)

关于asp.net-mvc - DataAnnotation 验证和自定义 ModelBinder,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2030059/

相关文章:

asp.net - 找不到不变名称 'System.Data.SqlClient;' 的 ADO.NET 提供程序( Entity Framework MVC)

Jquery post从 Controller 接收数据但不会渲染

c# - antiforgeryToken 以保护从 angularjs 应用程序调用的 web api 上的某些操作

asp.net-mvc - 查找 System.Web.Mvc

database - 每 5 分钟更新一次全表

c# - NuGet 以代码 -1 退出 - 结果构建失败

ASP.Net MVC - 请求生命周期

c# - MVC Ajax.ActionLink 找不到 POST 方法

sql-server - 博客应用程序的最佳数据库(关系型 - SQL 与 NoSQL)

asp.net-mvc - @using 默认在 Razor View MVC 5