第22章 模型绑定

    模型绑定(Model Binding)是指用浏览器以HTTP请求方式发送的数据来创建.NET对象的过程。

  动作方法的参数依赖于模型绑定过程(通过模型绑定器来实现)。利用整个HTTP请求所携带的数据(用户在表单中输入的数据、路由数据、请求URL中的查询字符串、请求中上传的文件)构造动作方法所需要参数对象的过程。

    模型绑定过程(模型绑定器要做的事):

      1.检测确认目标对象(要创建的对象,指动作方法的参数)的名称和类型;(动作方法参数的名称和类型

      2.通过对象名称查找数据源(请求),并找到可用数据(通常是字符串);(在请求数据中找到名称匹配的字符串数据

      3.根据对象类型将找到的数据值转换成目标类型;(将字符串类型数据转换成动作方法参数的类型

      4.通过对象名称、对象类型、和这种经过处理的数据来构造目标对象;(利用上述数据构造一个动作方法参数的对象

      5.将构造好的对象传送给动作调用器,并由动作调用器将对象注入到目标动作方法中去。(将目标对象传递给动作方法

        调用器:IActionInvoker

        默认调用器:ControllerActionInvoker

        模型绑定器:IModelBinder

        默认模型绑定器:DefaultModelBinder

        请求:Request

        请求数据:Request.Form、Request.Files、RouteData.Values、Request.QueryString

        模型:Model

        模型属性:Model.Name

        属性类型:String

        控制器:Controller

        动作方法:Action

        动作参数:ActionParam

        参数类型:string

        参数值:"aa"

  一、默认模型绑定器

 DefaultModelBinder类查找参数数据的顺序(找到便停止)

数据源 描述 示例
Request.Form 由用户在HTML的表单中提供(填写)的数据 Request.Form["id"]
RouteData.values 用应用程序路由获得的值 RouteData.Values["id"]
Request.QueryString 包含在请求URL中的查询字符串的部分数据 Request.QueryString["id"]
Request.Files 请求中上传的文件 Request.Files["id"]

    1.复合类型绑定:当动作方法的参数是复合类型时(不能用TypeConverter类进行转换的属性(简单类型:string、int....)),用反射来获取public属性集,然后依次绑定。

      (1)易于绑定的HTML:

      

    <div>@Html.LabelFor(m => m.HomeAddress.City)
         @Html.EditorFor(m => m.HomeAddress.City)
    </div>
    

    <div><label for="HomeAddress_City">城市</label>
         <input class="text-box single-line" id="HomeAddress_City" name="HomeAddress.City" type="text" value="" />
    </div>

      (2)指定自定义前缀:

       绑定前缀为“HomeAddress”的数据

        public ActionResult DisplaySummary([Bind(Prefix = "HomeAddress")]AddressSummary summary)
        {
            return View(summary);
        }

      (3)有选择地绑定属性:

          排除Country属性的绑定

        public ActionResult DisplaySummary([Bind(Prefix = "HomeAddress",Exclude = "Country")]AddressSummary summary)
        {
            return View(summary);
        }

          指定绑定的属性

      绑定此类时,只绑定City属性,排除其他属性

    [Bind(Include = "City")]
    public class AddressSummary
    {
        public string City { get; set; }
        public string Country { get; set; }
    }

二、手工调用模型绑定

  1.UpdateModel(参数列表)方法:

public ActionResult Address(IList<AddressSummary> addresses)
        {
            addresses = addresses ?? new List<AddressSummary>();
            UpdateModel(addresses,new FormValueProvider(ControllerContext)); //限制绑定源为表单内容
            return View(addresses);
        }

    值提供器:IValueProvider

内建IValueProvider实现

数据源 IValueProvider实现
Request.Form FormValueProvider
RouteData.values RouteDataValueProvider
Request.QueryString QueryStringValueProvider
Request.Files HttpFileCollectionValueProvider

  改进:最常用限制只查找表单值的方法:

 public ActionResult Address(FormCollection formData)
        {
            IList<AddressSummary> addresses = new List<AddressSummary>();
            UpdateModel(addresses, formData);
            return View(addresses);
        }

  2.处理绑定错误

注:当自动调用模型绑定时,绑定错误不会发出异常信号。必须通过ModelState.IsValid属性来检查结果。

InvalidOperationException异常表示绑定错误
public ActionResult Address(FormCollection formData)
        {
            IList<AddressSummary> addresses = new List<AddressSummary>();
            if (TryUpdateModel(addresses, formData))
            {
               //todo:绑定正常  操作
            }
            else
            {
                //todo:绑定异常  操作
            }

            return View(addresses);
        }

三、定制模型绑定系统(IModelBinder)

  1.自定义值提供器

ModelBindingContext类所定义的最有价值的属性

属性 描述
Model 如果是手工调用绑定,可返回传递给UpdateModel方法的模型对象
ModelName 返回被绑定模型的名称
ModelType 返回被创建模型的类型
ValueProvider 返回能用于从请求中获取数据值的IValueProvider实现

  提示:ModelBinder注解属性和自定义模型绑定器来改变默认模型绑定器。

时间: 2024-10-25 12:52:08

第22章 模型绑定的相关文章

4.20日第13次作业.,20章战略管理,21章业务流程管理和重组,22章知识管理,高项,29-田哲琦

4.20日第13次作业.,20章战略管理,21章业务流程管理和重组,22章知识管理,高项,29-田哲琦 20章.战略管理1.企业战略的特点有哪些?P420-421 答:1).全局性 2).长远性 3).抗争性 4).纲领性 2.企业战略决策的特点有哪些?P421答:1).决策的对象是复杂的,很难把握住它的结构,并且是没有先例的,对其处理上也是没有经验可循. 2).面对的问题常常是突发性的.难以预料的.所依靠的是来自外部的关于未来如何变化的很少的情报. 3).决策的性质直接涉及到企业的前途. 4)

Kendo UI Grid 模型绑定

开篇 接触 Asp.net MVC 时间较长的童鞋可能都会了解过模型绑定(Model Binding),而且在一些做 Web 项目的公司或是Team面试中也经常会被问到.项目中有很多 Action 中都使用了自定义的模型绑定,但是业务逻辑太过复杂不适合做为例子与大家分享,而今天在做一个 Kendo UI 的功能时觉得可以用 Kendo UI 做为例子与大家分享与探讨一个典型的 Model Binding 的过程. 写的比较随性,欢迎大家讨论及拍砖! 背景介绍 Kendo UI: 它是一个非常出名

Asp.Net MVC在过滤器中使用模型绑定

废话不多话,直接上代码 1.创建MVC项目,新建一个过滤器类以及使用到的实体类: 1 public class DemoFiltersAttribute : AuthorizeAttribute 2 { 3 public override void OnAuthorization(AuthorizationContext filterContext) 4 { 5 var person = new Person(); 6 //过滤器中使用模型绑定 7 BindModel<Person>(filt

ASP.NET MVC学习之模型绑定(2)

3.手工调用模型绑定 很多情况下我们都是通过形参的方式接收来自http流中的数据,这看似是完美的,但是缺少了很多过程中的控制,所以我们就需要使用手工的方式进行绑定.下面我们通过一个例子来说明,首先打开Views/Home/Index.cshtml页面,并输入如下代码: 1 @{ 2 ViewBag.Title = "Index"; 3 } 4 5 @if (TempData.ContainsKey("msg")) 6 { 7 <h1> 8 @TempDa

ASP.NET MVC——模型绑定

这篇文章我们来讲讲模型绑定(Model Binding),其实在初步了解ASP.NET MVC之后,大家可能都会产生一个疑问,为什么URL片段最后会转换为例如int型或者其他类型的参数呢?这里就不得不说模型绑定了.模型绑定是指,用浏览器以HTTP请求方式发送的数据来创建.NET对象的过程.每当定义具有参数的动作方法时,一直是在依赖着这种模型绑定过程. 准备项目 我们先来创建一个MVC项目,名叫MVCModels,并在Models文件夹中创建一个新的类文件Person. 1 using Syste

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

一.什么是模型绑定? 模型绑定存在的意义就是为Action的参数提供值,例如:如下表单中提交了数据,那么Action(即:Index)的参数Id,Name的值就是表单中对应的name属性相同的值,而表单提交的值是如何赋值给Action的参数的呢?模型绑定就是来完成从用户提交的请求中提取数据,并赋值给Action的参数.此例是从表单中的提取数据,并赋值给Action的参数,模型绑定还可以完成完成从地址Url.路由Route.上传文件等中获取数据,并赋值给Action相应的参数. <form id=

MVC数组模型绑定

ASP.NET MVC数组模型绑定 在ASP.NET MVC中使用Razor语法可以在视图中方便地展示数组,如果要进行数组模型绑定,会遇到索引断裂问题,如下示例: <input type="text" name="[0].Name" /> <input type="text" name="[1].Name" /> <input type="text" name="[2

MVC模型绑定

视图: 1 @model RegisterViewModel 2 @{ 3 ViewData["Title"] = "Register"; 4 } 5 6 <h2>@ViewData["Title"]</h2> 7 8 <div class="row"> 9 <div class="col-md-4"> 10 <form asp-route-return

ASP.NET没有魔法——ASP.NET MVC 模型绑定解析(上篇)

前面文章介绍了ASP.NET MVC中的模型绑定和验证功能,本着ASP.NET MVC没有魔法的精神,本章内容将从代码的角度对ASP.NET MVC如何完成模型的绑定和验证进行分析,已了解其原理. 本文的主要内容有: ● ModelBinder ● ValuePrivoder ● ModelMetadata ● 简单模型与复杂模型 ● 小结 ModelBinder ModelBinder是ASP. NET MVC用于模型绑定的核心组件,所有的ModelBinder都实现了IModelBinder