MVC4之ModelBinder-模型绑定

简介: 最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来。   十年河东十年河西,莫欺少年穷   学无止境,精益求精   最近在做自学MVC,遇到的问题很多,索性一点点总结下。

   最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来。

   十年河东十年河西,莫欺少年穷

   学无止境,精益求精

   最近在做自学MVC,遇到的问题很多,索性一点点总结下。

   MVC ModelBinder是MVC模型绑定的核心,本节以简单示例讲解MVC模型绑定,涉及到基本类型绑定和复合类型绑定两种。

   如下:

   做过webForm项目的童鞋都知道,后端如果要接收前段HTML Input标签的值,必须采用Request.Form["Key"]的方式,MVC自诞生以来,就摈弃了这种方式,使得程序更简洁,减少了程序员的开发量及代码量

   Model Binder(模型绑定器),顾名思义,可以形象的理解为将数据绑定到一个 Model 的工具。这个 Model 是 Action 方法需要用到的某个类型(既可以是方法参数的类型也可以是方法内部对象的类型),要绑定到它上面的值可以来自于多种数据源。

   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,客户端上传的文件。

   DefaultModelBinder 按照该顺序来查找需要的值。

  1. Request.Form["Key"]
  2. RouteData.Values["Key"]
  3. Request.QueryString["Key"]
  4. Request.Files["Key"]

   下面以简单示例说明:

   首先:我们在Models下创建一个Person类,如下:

    public class Person
    {
        public string pName { get; set; }//姓名
        public string pSex { get; set; }//性别
        public int pAge { get; set; }//年龄
        public string pAddress { get; set; }//地址
        
    }

   其次:我们创建一个控制器,如下:

    public class PersonController : Controller
    {

        public ActionResult Index( )
        {
            return View(new Person());
        }

        [HttpPost]
        public ActionResult IndexDeatail(Person model)
        {
            return View(model);
        }

    }

   根据控制器,我们创建如下两个View

   1、index.cshtml,用于提交

@{
    ViewBag.Title = "MVC Model Binding 解读及示例";
}
@using WeiXinApi.Models
@model Person
<form id="form1" action="Person/IndexDeatail" method="post">
    &nbsp;&nbsp;&nbsp;姓名:@Html.EditorFor(m=> m.pName)
     <br />
    &nbsp;&nbsp;&nbsp;性别:@Html.EditorFor(m=> m.pSex)
     <br />
    &nbsp;&nbsp;&nbsp;年龄:@Html.EditorFor(m=> m.pAge)
     <br />
    &nbsp;&nbsp;&nbsp;地址:@Html.EditorFor(m=> m.pAddress)
    <br />

    <div style="height:15px; clear:both;"></div>
     &nbsp;&nbsp;&nbsp;<input id="Submit1" type="submit" value="submit" />
</form>

   2、IndexDeatail.cshtml,用于展示提交的数据

@{
    ViewBag.Title = "MVC Model Binding 解读及示例";
}
@using WeiXinApi.Models
@model Person
    <div style="height:15px; clear:both;"></div>
       &nbsp;&nbsp;&nbsp;<span>@Model.pName</span><br />
       &nbsp;&nbsp;&nbsp;<span>@Model.pSex</span><br />
       &nbsp;&nbsp;&nbsp;<span>@Model.pAge</span><br />
       &nbsp;&nbsp;&nbsp;<span>@Model.pAddress</span><br />

   运行结果如下:

   

   现在我们将Person作如下修改,改为复合类型:

    public class Person
    {
        public string pName { get; set; }//姓名
        public string pSex { get; set; }//性别
        public int pAge { get; set; }//年龄
        public string pAddress { get; set; }//地址
        public card cardInfo { get; set; }//银行卡信息
    }

    public class card
    {
        public string BankName { get; set; }//所属银行
        public string CardNum { get; set; }//账号
    }

   控制器方法不变,View作如下变化:

   

   

   运行结果如下:

   

   当然,我们如果不采用modelBinder,我们也可采用如下【表单收集】方法进行接收数据:

        public ActionResult Index( )
        {
            return View(new Person());
        }

        [HttpPost]
        public ActionResult IndexDeatail(FormCollection FormCollection)
        {
            Person model = new Person();
            card cardModel = new card();
            foreach (var key in FormCollection.AllKeys)
            {
                var Value = FormCollection[key].ToString();
                switch (key)
                {
                    case "pName": model.pName = Value; break;
                    case "pSex": model.pSex = Value; break;
                    case "pAge": model.pAge = Convert.ToInt32(Value); break;
                    case "pAddress": model.pAddress = Value; break;
                    case "cardInfo.BankName": cardModel.BankName = Value; break;
                    case "cardInfo.CardNum": cardModel.CardNum = Value; break;
                }
            }
            model.cardInfo = cardModel;
            return View(model);
        }

   当然,用此方法就等于回到了webForm了,不建议使用

   除此之外,我们也可以采用webFrom的方法就行收集数据

        public ActionResult Index( )
        {
            return View(new Person());
        }

        [HttpPost]
        public ActionResult IndexDeatail()
        {
            Person model = new Person();
            card cardModel = new card();
            model.pName = Request.Form["pName"];
            model.pSex = Request.Form["pSex"];
            model.pAge = Convert.ToInt32(Request.Form["pAge"]);
            model.pAddress = Request.Form["pAddress"];
            cardModel.BankName = Request.Form["ardInfo.BankName"];
            cardModel.CardNum = Request.Form["ardInfo.CardNum"];
            model.cardInfo = cardModel;
            return View(model);
        }

   如果想更深层次了解MVC ModelBinder 建议参考老A的博客:http://www.cnblogs.com/artech/archive/2012/05/21/2511086.html   

   谢谢

   @陈卧龙的博客

 

相关文章
|
存储 设计模式 前端开发
QTChart实现柱状图的mvc模型
QTChart实现柱状图的mvc模型
131 1
|
7月前
|
设计模式 存储 前端开发
MVC(模型-视图-控制器)是一种在Web应用程序开发中广泛使用的软件设计模式
【5月更文挑战第12天】MVC模式是Web应用开发中的常见设计模式,将逻辑、数据和界面分离,提升代码可维护性和重用性。模型处理数据逻辑,视图展示数据,控制器协调用户输入与模型视图交互。优点包括代码分离、易维护、可扩展和组件重用,促进高效灵活的开发。
71 2
|
6月前
|
设计模式 前端开发 安全
理解最常用的MVC分层模型及其变种
【6月更文挑战第24天】 本文介绍架构模式如MVC、MVVM和MVP是解决软件结构问题的通用方案。。每种模式有其优缺点,适用场景不同。
436 0
理解最常用的MVC分层模型及其变种
|
6月前
|
安全 前端开发 测试技术
安全开发-PHP应用&模版引用&Smarty渲染&MVC模型&数据联动&RCE安全&TP框架&路由访问&对象操作&内置过滤绕过&核心漏洞
安全开发-PHP应用&模版引用&Smarty渲染&MVC模型&数据联动&RCE安全&TP框架&路由访问&对象操作&内置过滤绕过&核心漏洞
|
7月前
|
前端开发 Java PHP
信息系统架构模型(1) MVC
信息系统架构模型(1) MVC
94 0
|
7月前
|
设计模式 前端开发 数据处理
MVC架构中,控制器和模型之间是如何交互的
MVC架构中,控制器和模型之间是如何交互的
86 0
|
7月前
|
存储 设计模式 前端开发
请解释 Web 应用程序的 MVC(模型-视图-控制器)架构。
【2月更文挑战第26天】【2月更文挑战第89篇】请解释 Web 应用程序的 MVC(模型-视图-控制器)架构。
59 0
|
7月前
|
JSON 前端开发 Java
开发必备技能:探索Spring MVC请求映射和参数绑定的奇妙之旅!
开发必备技能:探索Spring MVC请求映射和参数绑定的奇妙之旅!
|
7月前
|
前端开发 JavaScript Java
让你了解什么是spring MVC模型数据(附大量代码)
让你了解什么是spring MVC模型数据(附大量代码)
82 0
|
前端开发
前端学习笔记202305学习笔记第三十一天-什么是mvc-vc和路由的绑定2
前端学习笔记202305学习笔记第三十一天-什么是mvc-vc和路由的绑定2
54 1