模型绑定与验证笔记

模型绑定

1.1模型绑定:以HTTP请求方式发送的数据来创建.NET对象的过程。每当定义具有参数的动作方法时,一直是在依赖着这种模型绑定过程

当导航到/Home/Index/1时,该URL的最后一个片段会被付给id路由变量,它指定了用户感兴趣的对象。

默认的动作调用器,ControllerActionInvoker,要依靠模型绑定器来生成调用动作所需要的数据对象。模型绑定器由IModelBinder定义。

namespace System.Web.Mvc{

    // 摘要:

    //     定义模型联编程序所需的方法。

    public interface IModelBinder{

        // 摘要:

        //     使用指定的控制器上下文和绑定上下文将模型绑定到一个值。

        // 参数:

        //   controllerContext:

        //     控制器上下文。

        //   bindingContext:

        //     绑定上下文。

        // 返回结果:

        //     绑定值。

        object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext);

    }

}

备注模型绑定过程是通过模型绑定器来实现的,其目的是用请求中所包含的数据创建对象

模型绑定的步骤:

检测目标对象的名称和类型

通过对象名称查找数据源,并找到可用数据

根据对象类型将找到的数据值转换成目标类型

通过对象名称、对象类型、和这种经过处理的数据来构建目标对象

将构建好的对象送给动作调用器,并由动作调用器将对象注入到目标动作方法中

1.3默认模型绑定器

DefaultModelBinder类查找参数数据的顺序



描述


Request.Form


有用户在HTML的form元素中提供


RouteData.Values


用应用程序路由获得的值


Request.QueryString


包含在请求URL中的查询字符串部分的数据


Request.Files


请求中上传的文件

只要找到一个值,搜索便停止。

绑定简单类型

当处理简单参数类型时,DefaultModelBinder会尝试使用System.ComponentModel.TypeDescriptor类,将已经从请求数据获得的字符串值转换成参数类型;也称基元类型。

绑定符合类型

当动作方法参数是复合类型时,DefaultModelBinder类将用反射来获取public属性集,然后依次逐一进行绑定。

public class HomeController : Controller{

        public ActionResult CreatePerson(){

            return View(new Person());

        }

        [HttpPost]

        public ActionResult CreatePerson(Person p) {

            return View("Index", p);

        }

}

首先不带参数的CreatePerson重载创建了一个新的Person对象,并将其传递给View(),渲染Views/Home/Createperson.cshtml视图,用于展示新创建Person对象页。

在表单提交给CreatePerson时,形成了一种不同的模型绑定情况。默认模型绑定器发现,动作方法需要一个Person对象,于是会一次处理每个属性。对于简单类型,绑定器从请求中找到一个值;对于复合类型该过程会针对新类型重复执行,通过反射获取该类型的public属性集,而绑定器也会视图找出所有属性的值。

模型验证

是确保用户所接收的数据适合于绑定到模型,并且在不合适时,给用户提供有用的信息,以帮助修正问题的过程。

ModelState.AddModelError():指定由问题的属性和一条应该显示给用户的消息

ModelState.IsValidField():检查模型绑定器是否能够对一个属性赋值

ModelState.IsValid():判断是否有错误

用元数据指定验证规则

System.ComponentModel.DataAnnotations下

Compare 比较两个属性是否相同的值

Range 一个数字的值的范围

RegularExpression 输入的字符串必须匹配正则

Required 非空

StringLength 字符串长度

时间: 2024-11-07 01:35:30

模型绑定与验证笔记的相关文章

.Net Core MVC中的模型绑定、验证以及ModelState.IsValid的使用

Require就是说这个属性不能为空,EmailAddress就是说这个属性值必须符合一个Email地址格式. [Required(ErrorMessage ="尚有未填写项,请先完善")]        public string Name { get; set; }        [Required(ErrorMessage = "尚有未填写项,请先完善")]        [EmailAddress(ErrorMessage ="邮箱格式错误&quo

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

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

Web Api 模型绑定 一

[https://docs.microsoft.com/zh-cn/aspnet/core/web-api/?view=aspnetcore-2.2] 1.模型绑定 简单模型绑定针对简单类型(如string,int,DateTime等)可进行单一绑定:但若遇到复杂类型,则需要通过反射和递归遍历查找,查找模式paramter_name.property_name. >>> 对于Collection类型,模型查找将查找parameter_name[index]或[index]的匹配项 >

《ASP.NET MVC 4 实战》学习笔记 11:模型绑定器与值提供器

一.创建自定义模型绑定器: 利用请求数据塑造模型对象并将对象传递给动作参数的过程称为模型绑定(Model Binding). 大多数时候动作参数是对象的主键或其他唯一标识符,因此我们可以不必在所有的动作中都放置一段重复的数据访问代码(下面代码“\\Before”部分),而是使用一个自定义的模型绑定器(下面代码“\\After”部分).它能够在动作执行之前加载存储对象,于是动作不再以唯一标识符而是以持久化的对象类型作为参数. // Before public ViewResult Edit (Gu

[Asp.net MVC]Asp.net MVC5系列——在模型中添加验证规则

目录 概述 在模型中添加验证规则 自定义验证规则 伙伴类的使用 总结 系列文章 [Asp.net MVC]Asp.net MVC5系列——第一个项目 [Asp.net MVC]Asp.net MVC5系列——添加视图 [Asp.net MVC]Asp.net MVC5系列——添加模型 [Asp.net MVC]Asp.net MVC5系列——从控制器访问模型中的数据 [Asp.net MVC]Asp.net MVC5系列——添加数据 概述 上篇文章中介绍了添加数据,在提交表单的数据的时候,我们需

Kendo UI Grid 模型绑定

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

ASP.NET MVC 4 (九) 模型绑定

模型绑定指的是MVC从浏览器发送的HTTP请求中为我们创建.NET对象,在HTTP请求和C#间起着桥梁的作用.模型绑定的一个最简单的例子是带参数的控制器action方法,比如我们注册这样的路径映射: routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Inde

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

Action的模型绑定

- 你真的会用Action的模型绑定吗? 在QQ群或者一些程序的交流平台,经常会有人问:我怎么传一个数组在Action中接收.我传的数组为什么Action的model中接收不到.或者我在ajax的data中设置了一些数组,为什么后台还是接收不了.还有一些怎么传送一个复杂的对象或者Action怎么接收一个复杂的对象等等这些问题.或者有些人遇到复杂的对象或者数组直接就传送个json字符串,然后在Action中把json字符串转成model对象,当然这也是一种做法,但也许不是最优的做法. 一.需求 按