• 使用ModelBinder处理Actin实体类型参数


    一,关于DefaultModelBinder(无需额外代码就从表单提交的字符串转换实体类)

    比如一个Action要传入Person类型的参数,而不是普通的字符串。

            public ActionResult AddPerson(Person model)
            {
                return View(model);
            }

    MVC其实已经做了处理,如果html表单中的元素和Person类中属性名称一样,就会自动生成一个Person类,然后赋值给对应的属性字段

     public class Person
        {
            public string name { get; set; }
            public string age { get; set; }
            public string sex { get; set; }
            public Company company { get; set; }
        }
    
        public class Company
        {
            public string name { get; set; }
            public string address { get; set; }
        }

    Html表单形式。

    其中Company又是一个实体类型属性,使用company.name的表单名称来指定

    <form action="/home/addperson">
    <input id="name" name="name" />
    <input id="age" name="age" />
    <input id="company.name" name="company.name"/>
    <input type="submit" value="submit" />
    </form>

    这样在传入Action的时候就会自动生成Person类实例

            public ActionResult AddPerson(Person model)
            {
                return View(model);
            }

    内部的实现的原理是因为有个DefaultModelBinder,这是一个默认的Model绑定转换类

    二。实现一个自定义的Modelbinder并且在controller中使用

    如果要实现一个自定义的ModelBinder必须要继承一个接口IModelBinder,实现这个方法BindModel

        public class PersonBinder : IModelBinder
        {
            public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
            {
                string name = controllerContext.RequestContext.HttpContext.Request["name"];
                string age = controllerContext.RequestContext.HttpContext.Request["age"];
                Person p = new Person() { name = name, age=age };
                return p;
            }
        }

    在Controller中要指定才能使用,这样在处理到这个Action的时候会先去PersonBinder 中处理接收的参数

            public ActionResult AddPerson([ModelBinder(typeof(PersonBinder))]Person model)
            {
                return View(model);
            }

    三。在MVC中添加新的默认modelbinder

    如何让自定义的ModelBinder默认执行,如果一个Modelbinder可以针对每个action都适用

    比如可以自定义一个Modelbinder对所有输入的字符串都进行Trim()。最好的方式是让这个ModelBinder在每个Action中都默认执行,而不是需要每次都在

    Controller中显式的指定。

    这个Modelbinder需要继承DefaultModelBinder

     public class StringTrimBinder : DefaultModelBinder
        {
            public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
            {
                var value = base.BindModel(controllerContext, bindingContext);
                if (value is string)
                {
                    return value.ToString().Trim();
                }
                else
                {
                    return value;
                }
            }
        }

    在Global。asax文件中

     protected void Application_Start()
      {
                AreaRegistration.RegisterAllAreas();
    
                RegisterGlobalFilters(GlobalFilters.Filters);
                RegisterRoutes(RouteTable.Routes);
                
                ModelBinders.Binders.Add(typeof(string), new StringTrimBinder());
      }

    这样在Controller中无需指定Modelbinder就可以执行

            public ActionResult AddPerson(Person model)
            {
                return View(model);
            }
  • 相关阅读:
    自定义服务与调用--------factory
    如果没有开启keepalive 默认发送等超时
    你知道数据中台,但你肯定没听过报表中台,我靠它征服百万数据人
    数据库规范化:模式分解算法(3NF,BCNF分解,附带口诀,通俗易懂)
    直播丨 SQL大赛冠军怀晓明:深入解析Oracle存储过程中的性能瓶颈
    数据库服务器主机重启故障诊断分析
    不看可惜!无需代码,小白都会的可视化大屏,领导不重用你都难
    Docker 安装 ActiveMQ 修改账号密码
    使用Hexo 搭建你的技术博客
    【LeetCode】235.二叉搜索树的最近公共祖先(递归+迭代,详细图解,java实现)
  • 原文地址:https://www.cnblogs.com/zjypp/p/2586409.html
Copyright © 2020-2023  润新知