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

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

学无止境,精益求精

   最近在做自学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

谢谢

@陈卧龙的博客

MVC4之ModelBinder-模型绑定的更多相关文章

  1. 《ASP.NET MVC4 WEB编程》学习笔记------Model模型绑定

    本文转载自haiziguo Asp.net mvc中的模型绑定,或许大家经常用,但是具体说他是怎么一回事,可能还是会有些陌生,那么,本文就带你理解模型绑定.为了理解模型绑定,本文会先给出其定义,然后对 ...

  2. Asp.net MVC4高级编程学习笔记-模型学习第四课基架与模型绑定20171027

    MVC模型 一.构建基架. MVC中的基架可以为应用程序提供CURD各种功能生成所需要的样板代码.在添加控制器的时候可以选择相应的模板以及实体对象来生成相应的模板代码. 首先定义一个模型类如下所示: ...

  3. ASP.NET Core 中文文档 第四章 MVC(2.1)模型绑定

    原文:Model Binding 作者:Rachel Appel 翻译:娄宇(Lyrics) 校对:许登洋(Seay).何镇汐 模型绑定介绍 ASP.NET Core MVC 中的模型绑定从 HTTP ...

  4. Nancy之ModelBinding(模型绑定)

    过年前的最后一篇博客,决定留给Nancy中的ModelBinding 还是同样的,我们与MVC结合起来,方便理解和对照 先来看看MVC中简单的ModelBinding吧 // POST: Author ...

  5. 白话学习MVC(六)模型绑定

    一.什么是模型绑定? 模型绑定存在的意义就是为Action的参数提供值,例如:如下表单中提交了数据,那么Action(即:Index)的参数Id,Name的值就是表单中对应的name属性相同的值,而表 ...

  6. ASP.NET MVC模型绑定的6个建议(转载)

    ASP.NET MVC模型绑定的6个建议 发表于2011-08-03 10:25| 来源博客园| 31 条评论| 作者冠军 validationasp.netmvc.netasp 摘要:ASP.NET ...

  7. ASP.NET MVC中的模型绑定

    模型绑定的本质   任何控制器方法的执行都受action invoker组件(下文用invoker代替)控制.对于每个Action方法的参数,这个invoker组件都会获取一个Model Binder ...

  8. Asp.net Mvc 中的模型绑定

    asp.net mvc中的模型绑定可以在提交http请求的时候,进行数据的映射. 1.没有模型绑定的时候 public ActionResult Example0() { ) { string id ...

  9. ASP.NET MVC 常用扩展点:过滤器、模型绑定等

    一.过滤器(Filter) ASP.NET MVC中的每一个请求,都会分配给对应Controller(以下简称“控制器”)下的特定Action(以下简称“方法”)处理,正常情况下直接在方法里写代码就可 ...

随机推荐

  1. phpstorm配置svn

    phpstorm配置svn 发表于3年前(2013-02-28 10:50)   阅读(8249) | 评论(0) 4人收藏此文章, 我要收藏 赞1 9月19日成都 OSC 源创会正在报名,送机械键盘 ...

  2. 10 位顶级 PHP 大师的开发原则

    10 位顶级 PHP 大师的开发原则 ruby_chen 发布于: 2013年03月28日 (61评) 分享到:    收藏 +139 #深圳# 6月10日 亚马逊AWSome Day云计算免费培训报 ...

  3. Yii源码阅读笔记(三)

    接着上次的继续阅读BaseYii.php vendor/yiisoft/yii2/BaseYii.php—— public static function getRootAlias($alias)// ...

  4. 学习VS生活

    很多时候,失败的原因归结为一点:我没有时间...代码敲不完,我真的是没有时间么?很多时候是没意识的浪费时间 我每次进教室,总能看到吴刚和赵东亮在敲代码,为啥他们有时间呢?很多时候,时间就像那啥,挤一挤 ...

  5. a computer-centered view of information systems to a database-centered view

    Code.Complete.Second.Edition 2004 Bachman compared the Ptolemaic-to-Copernican change in astronomy t ...

  6. http安全篇

    一.app与服务端交互确保来源的安全 作为一个移动互联网App,天生是需要和服务器通信的.那么,服务器如何识别客户端的身份?我们如何保证数据传输过程中的安全性?要靠两个东西:使用AppKey做身份识别 ...

  7. Comparable与Comparator

    转载 Comparable与Comparator的区别 (转载) Comparable & Comparator 都是用来实现集合中元素的比较.排序的,只是 Comparable 是在集合内部 ...

  8. AutoLayout技术选型和应用

    前言:这篇文章是笔者在项目中对布局技术进行技术选型和应用的相关介绍,供大家参考. && [self.buttonscount] > 0) { UIButton *button = ...

  9. XCode中的单元测试:编写测试类和方法(内容意译自苹果官方文档)

    当你在工程中通过测试导航栏添加了一个测试target之后, xcode会在测试导航栏中显示该target所属的测试类和方法. 这一章演示了怎么创建测试类,以及如何编写测试方法. 测试targets, ...

  10. 对于HIVE架构的理解

    1.Hive  能做什么,与 MapReduce 相比优势在哪里 关于hive这个工具,hive学习成本低,入手快,对于熟悉sql语法的人来说,操作简单,熟悉. 2.为什么说 Hive 是 Hadoo ...