ASP.NET MVC 3 ModelBinder遇到的一个问题
2013-05-08 18:33
162 查看
最近在项目中遇到一个问题,在前端调用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这个方法去给参数赋值的。具体代码如下:
可以很清楚的看到,会把string.Empty给转换成为null。那么就只要override GetPropertyValue方法,就可以解决问题了。具体代码如下:
然后在Application_Start里使用刚刚重写的ModelBinder作为默认的ModelBinder就可以了。
MVC 3 的ModelBinder机制还是挺强大的,支持各种复杂类型的映射,包括各种集合类型的映射。你也可以去实现IModelBinder这个接口去实现一个自定义的ModelBinder。在此推荐一下博客http://blog.csdn.net/dz45693/article/details/8169656这个系列文章,里面是MVC的源码分析,帮你能更深入的理解MVC的运行机制。
感谢http://blog.csdn.net/dz45693/article/details/8169656这篇博客,提供了ModelBinder的映射过程的说明,找到了BindProperty这个方法应该是映射的具体实现。然后通过Reflector.exe这个强大的反编译工具,在System.Web.Mvc.dll这个dll,找到了BindProperty这个方法的内部实现,具体是通过GetPropertyValue这个方法去给参数赋值的。具体代码如下:
protected virtual object GetPropertyValue(ControllerContext controllerContext, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor, IModelBinder propertyBinder) { object objA = propertyBinder.BindModel(controllerContext, bindingContext); if (bindingContext.ModelMetadata.ConvertEmptyStringToNull && object.Equals(objA, string.Empty)) { return null; } return objA; }
可以很清楚的看到,会把string.Empty给转换成为null。那么就只要override GetPropertyValue方法,就可以解决问题了。具体代码如下:
protected override object GetPropertyValue(ControllerContext controllerContext, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor, IModelBinder propertyBinder) { object objA = propertyBinder.BindModel(controllerContext, bindingContext); if (bindingContext.ModelMetadata.ConvertEmptyStringToNull && object.Equals(objA, string.Empty)) { return string.Empty; } return objA; }
然后在Application_Start里使用刚刚重写的ModelBinder作为默认的ModelBinder就可以了。
System.Web.Mvc.ModelBinders.Binders.DefaultBinder = new ModelBinderProvider();
MVC 3 的ModelBinder机制还是挺强大的,支持各种复杂类型的映射,包括各种集合类型的映射。你也可以去实现IModelBinder这个接口去实现一个自定义的ModelBinder。在此推荐一下博客http://blog.csdn.net/dz45693/article/details/8169656这个系列文章,里面是MVC的源码分析,帮你能更深入的理解MVC的运行机制。
相关文章推荐
- ASP.NET MVC:如何实现一个自己的ModelBinder?
- ASP.NET MVC:如何实现一个自己的ModelBinder?
- 注意!ASP.NET MVC 3 的一个 OutputCache 问题
- asp.net mvc 在 post 和 get 方式下的 ModelBinder
- Asp.net MVC DefaultModelBinder分析
- Asp.Net Mvc: Implement your custom ModelBinder
- 一起谈.NET技术,ASP.NET MVC & EF 构建智能查询 二、模型的设计与ModelBinder
- 返璞归真asp.net mvc 1.0(5) - Action Filter, UpdateModel, ModelBinder, Ajax, Unit Test【转】
- asp.net mvc源码分析-Action篇 DefaultModelBinder
- asp.net mvc项目中遇到的古怪的问题,(项目中有frame框架)
- 一起谈.NET技术,ASP.NET MVC 2扩展点之Model Binder
- 抛开visual studio,纯手工创建asp.net mvc遇到的问题
- 返璞归真 asp.net mvc (5) - Action Filter, UpdateModel, ModelBinder, Ajax, Unit Test
- ASP.NET MVC基于标注特性的Model验证:一个Model,多种验证规则
- Asp.Net Mvc 4 使用Ajax 遇到的问题
- ASP.NET MVC & EF 构建智能查询 二、模型的设计“.NET研究”与ModelBinder
- ASP.NET mvc 自定义XSLT视图引擎 遇到的问题【高手请进有疑难杂症】
- 解决asp.net mvc UpdateModel更新对象后出现null问题的方法
- ASP.NET MVC:创建 ModelBinder 自动 Trim 所有字符串
- ASP.NET MVC:如何提供 Controller 继承体系使用的 ModelBinder?