• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

ASP.NETMVC3ModelBinder遇到的一个问题

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

  最近在项目中遇到一个问题,在前端调用Action的时候,MVC会使用DefaultModelBinder做默认的数据类型映射。但是会把前端的string.Empty映射为null。

  感谢http://blog.csdn.net/dz45693/article/details/8169656这篇博客,提供了ModelBinder的映射过程的说明,找到了BindProperty这个方法应该是映射的具体实现。然后通过Reflector.exe这个强大的反编译工具,在System.Web.Mvc.dll这个dll,找到了BindProperty这个方法的内部实现,具体是通过GetPropertyValue这个方法去给参数赋值的。具体代码如下: 

 1 protected virtual object GetPropertyValue(ControllerContext controllerContext, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor, IModelBinder propertyBinder)
 2 {
 3     object objA = propertyBinder.BindModel(controllerContext, bindingContext);
 4     if (bindingContext.ModelMetadata.ConvertEmptyStringToNull && object.Equals(objA, string.Empty))
 5     {
 6         return null;
 7     }
 8     return objA;
 9 }
10 
11  
12 
13  

可以很清楚的看到,会把string.Empty给转换成为null。那么就只要override GetPropertyValue方法,就可以解决问题了。具体代码如下:

 1  protected override object GetPropertyValue(ControllerContext controllerContext, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor, IModelBinder propertyBinder)
 2         {
 3             object objA = propertyBinder.BindModel(controllerContext, bindingContext);
 4             if (bindingContext.ModelMetadata.ConvertEmptyStringToNull && object.Equals(objA, string.Empty))
 5             {
 6                 return string.Empty;
 7             }
 8             return objA;
 9 
10         }

然后在Application_Start里使用刚刚重写的ModelBinder作为默认的ModelBinder就可以了。

1  System.Web.Mvc.ModelBinders.Binders.DefaultBinder = new ModelBinderProvider();

  MVC 3 的ModelBinder机制还是挺强大的,支持各种复杂类型的映射,包括各种集合类型的映射。你也可以去实现IModelBinder这个接口去实现一个自定义的ModelBinder。在此推荐一下博客http://blog.csdn.net/dz45693/article/details/8169656这个系列文章,里面是MVC的源码分析,帮你能更深入的理解MVC的运行机制。

    


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
asp.net中Response.Redirect方法在新窗口中弹出方法发布时间:2022-07-10
下一篇:
ASP.NET页面跳转的三种方法比较发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap