博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MVC3 ModelBinder
阅读量:5893 次
发布时间:2019-06-19

本文共 3442 字,大约阅读时间需要 11 分钟。

 

1、Model Binder从哪些地方获取数据(找到数据后会停止继续寻找)

MVC 框架内置默认的 Model Binder 是 DefaultModelBinder 类。当 Action Invoker 没找到自定义的 Binder 时,则默认使用 DefaultModelBinder。默认情况下,DefaultModelBinder 从如下 4 种途径查找要绑定到 Model 上的值:

  1. Request.Form,HTML form 元素提供的值。
  2. RouteData.Values,通过应用程序路由提供的值。
  3. Request.QueryString,所请求 URL 的 query string 值。
  4. Request.Files,客户端上传的文件。

如果是HttpGet:一般是从RouteData.Values获取路由的值

如果是HttpPost:一般是从Request.Form获取路由的值

 

2、绑定复合类型

绑定复合类型时会一一绑定复合类型的公共属性

也可以绑定数组:通过相同的Name属性绑定

也可以绑定到集合,具体参考:

 

3、手动调用绑定(UpdateModel方法)

public ActionResult Address() {    IList
addresses = new List
(); UpdateModel(addresses, new FormValueProvider(ControllerContext)); return View(addresses);}

手动绑定即把从各种途径(主要由4个途径)获取的数据手动和Model进行绑定

 

4、自定义Model Binding(自定义绑定可对数据进行过滤及操作)

  4.1 继承于DefaultModelBinder

    

public class MyModelBinder : DefaultModelBinder    {        protected override void SetProperty(ControllerContext controllerContext,         ModelBindingContext bindingContext,         System.ComponentModel.PropertyDescriptor propertyDescriptor, object value)        {            trim(propertyDescriptor, ref value);            antiSqlInject(propertyDescriptor, ref value);            base.SetProperty(controllerContext, bindingContext,                                propertyDescriptor, value);        }        ///         /// 去除两边空格        ///         ///         ///         private void trim(System.ComponentModel.PropertyDescriptor propertyDescriptor, ref object value)        {            if (propertyDescriptor.PropertyType == typeof(string))            {                var stringValue = (string)value;                if (!string.IsNullOrWhiteSpace(stringValue))                {                    stringValue = stringValue.Trim();                }                value = stringValue;            }        }        ///         /// 防止SQL注入        ///         ///         ///         private void antiSqlInject(System.ComponentModel.PropertyDescriptor propertyDescriptor, ref object value)        {            if (propertyDescriptor.PropertyType == typeof(string))            {                var stringValue = (string)value;                if (!string.IsNullOrWhiteSpace(stringValue))                {                    stringValue = AntiInjectUtil.StripAllTags(stringValue);                }                value = stringValue;            }        }

将默认的ModelBinder(DefaultModelBinder)替换为自定义的ModelBinder,作用于为全局

protected void Application_Start()        {            ModelBinders.Binders.DefaultBinder = new MyModelBinder();        }

 

     4.2 继承于IModelBinder

public class AddressBinder : IModelBinder {    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) {        Address model = (Address)bindingContext.Model ?? new Address();        model.City = GetValue(bindingContext, "City");        model.Country = GetValue(bindingContext, "Country");        return model;    }    private string GetValue(ModelBindingContext context, string name) {        name = (context.ModelName == "" ? "" : context.ModelName + ".") + name;        ValueProviderResult result = context.ValueProvider.GetValue(name);        if (result == null || result.AttemptedValue == "")             return "
"; else return (string)result.AttemptedValue; }}

注册ModelBinder

protected void Application_Start(){    ModelBinders.Binders.Add(typeof(Address), new AddressBinder());}

 

 

 

转载于:https://www.cnblogs.com/gossip/p/3656814.html

你可能感兴趣的文章
PHP 程序员的技术成长规划
查看>>
python基础教程_学习笔记19:标准库:一些最爱——集合、堆和双端队列
查看>>
js replace,正则截取字符串内容
查看>>
作业2
查看>>
nginx的信号量
查看>>
云im php,网易云IM
查看>>
开源 java CMS - FreeCMS2.3字典管理
查看>>
block,inline和inline-block概念和区别
查看>>
移动端常见随屏幕滑动顶部固定导航栏背景色透明度变化简单jquery特效
查看>>
javascript继承方式详解
查看>>
win7家庭版添加组策略编辑器
查看>>
lnmp环境搭建
查看>>
自定义session扫描器精确控制session销毁时间--学习笔记
查看>>
【转】EDK简单使用流程(3)
查看>>
仿射变换
查看>>
分页器(自定制)
查看>>
视频直播点播nginx-rtmp开发手册中文版
查看>>
PHP队列的实现
查看>>
单点登录加验证码例子
查看>>
[T-SQL]从变量与数据类型说起
查看>>