zoukankan      html  css  js  c++  java
  • ASP.NET MVC 3 ModelBinder遇到的一个问题

      最近在项目中遇到一个问题,在前端调用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的运行机制。

        

  • 相关阅读:
    Python 开发中easy_install的安装及使用
    Python 对象的深拷贝与浅拷贝 -- (转)
    Python 语言使用中遇到的问题汇总
    Python 源码学习之内存管理 -- (转)
    Python 对象模型 -- (转)
    Python3.3.3 安装(Linux系统)
    angular-file-upload API angular文件上传插件
    html5上传文件并监听进度
    angular 服务
    skrollr 中文教程
  • 原文地址:https://www.cnblogs.com/LoveJerryZhang/p/3067376.html
Copyright © 2011-2022 走看看