ASP.NET Core 中文文档 第四章 MVC(2.1)模型绑定
原文:Model Binding
作者:Rachel Appel
翻译:娄宇(Lyrics)
校对:许登洋(Seay)、何镇汐
模型绑定介绍
ASP.NET Core MVC 中的模型绑定从 HTTP 请求参数中将数据映射到 Action 方法里。这些参数可以是 string、interger、float 这样的简单类型,也可以是复杂类型。这是 MVC 一个非常棒的功能,因为无论传入数据的大小或复杂性如何,映射传入数据到对应项是一个经常重复的情况。 MVC 通过抽象绑定解决了这个问题,所以开发者们不必继续在每一个应用中反复编写同样的代码。自己编写文本到类型转换的代码是冗长并且容易出错的。
模型绑定如何工作
当 MVC 收到一个 HTTP 请求,它将其路由到一个 Controller 特定的一个 Action 方法。它基于路由数据来决定运行哪个 Action 方法,然后将值从 HTTP 请求绑定到 Action 方法的参数中。例如,考虑下面的 URL:
http://contoso.com/movies/edit/2
因为路由模板看起来像这样,{controller=Home}/{action=Index}/{id?}, movies/edit/2 路由到Movies Controller ,和它的 Edit Action 方法。同时接受到一个可选参数 id 。 Action 方法代码应该看起来像这样:
public IActionResult Edit(int? id)
提示
URL 中的字符串不区分大小写。
MVC 尝试通过参数名将请求数据绑定到 Action 的参数上。 MVC 将使用参数名以及它的公开可设置的属性名称查询所有的值。在上面的例子中,只有一个参数命名为 id ,MVC 将路由值中名称相同的值绑定过去。除了路由值之外, MVC 会以一种固定的顺序从 HTTP 请求中的其他部分绑定数据。下面是模型绑定的数据源列表的绑定顺序:
Form values:这是通过 HTTP POST 请求发送的表单数据(包括 jQuery POST 请求)。Route values:由 routing 提供的路由数据集。Query strings:URI 的查询字符串的一部分。
提示
表单值,路由数据,以及查询字符串都以键值对的形式存储。
因为模型绑定要找一个命名为 id 的键,但是在表单值里没有命名为 id 的键,所以接下来将在路由数据中找寻这个键。在我们的例子中,它是匹配的。绑定发生时,该值转换为 integer 类型的 2。相同的请求使用 Edit(string id) 将转换成 string 类型的值 “2” 。
到目前为止的例子使用的都是简单类型。在 MVC 中简单类型是任何 .NET 原始类型或者带字符串的类型的转换器。如果 Action 方法的参数是一个类,比如说 Movie 类型,这个类包含简单类型和复杂类型的属性,MVC 的模型绑定仍然可以很好的处理它。它使用反射和递归遍历复杂类型寻找匹配的属性。模型绑定寻找 parameter_name.parameter_name 的模式去绑定值到属性上。如果没有从表单中找到匹配的值,将尝试只通过 property_name 进行绑定。对于那些 集合(Collection) 类型,模型绑定会去匹配 parameter_name[index] 或者只是 [index] 。模型绑定对待 字典(Dictionary) 类型也是一样,寻找 parameter_name[key] 或只是 [key] ,前提是 Key 是简单类型。 Key 支持匹配 HTML 和 Tag Helpers 为相同的模型类型生成的字段名。当创建或者编辑的绑定数据未通过验证的时候,回传值使得用户输入的表单字段仍然保留,方便了用户(不必重新输入全部数据)。
为了绑定发生,这个类必须有一个公开的默认构造函数,并且被绑定的成员必须是公开的,并且可写的属性。当模型绑定发生的时候只会通过默认的构造函数去实例化类型,然后设置属性的值。
当一个参数被绑定,模型绑定停止继续查找这个参数名并开始绑定下一个参数。如果绑定失败, MVC 不会抛出异常。你可以查询模型状态异常通过检查 ModelState.IsValid 属性。
提示
Controller 的ModelState属性中的每个 Entry 都是一个包含了Errors 属性的ModelStateEntry。 你基本不需要去查询这个集合。使用ModelState.IsValid来替代它。
此外,还有一些特殊的数据类型在 MVC 执行模型绑定的时候需要考虑:
IFormFile,IEnumerable<IFormFile>: 一个或多个通过 HTTP 请求上传的文件。CancelationToken:用于在异步 Controller 中取消活动。
这些类型可以被绑定到 Action 参数或者一个类的属性中。
一旦模型绑定完成,就会进行 验证 。默认的模型绑定适合绝大多数开发场景。它也是可扩展的,所以如果你有独特的需求,你可以自定义内置的行为。
通过 Attributes 自定义模型绑定行为
MVC 包含几种让你可以指定与默认绑定源不同行为的 Attribute 。比如,你可以通过使用 [BindRequired] 或者 [BindNever] Attribute 指定一个属性是否需要绑定,或者它是否应该不发生。另外你可以替换默认的数据源,指定模型绑定器(Model Binder)的数据源。下面的是模型绑定 Attribute 的列表:
[BindRequired]:这个 Attribute 表示如果这个绑定不能发生,将添加一个模型状态错误(Model State Error)。[BindNever]:告诉模型绑定器(Model Binder)这个参数不进行绑定。[FromHeader],[FromQuery],[FromRoute],[FromForm]:通过这些来指定期望的绑定源。[FromServices]:这个 Attribute 使用 dependency injection 通过服务来绑定参数。[FromBody]:使用配置好的格式化器来 从 HTTP 请求 Body 中绑定数据。格式化器的选择基于 HTTP 请求的 Content-Type
[ModelBinder]:用来替换默认的模型绑定器(Model Binder),绑定源和名字。
当你需要替换模型绑定的默认行为时,Attribute 是非常有用的工具。
从 Http Request 的 body 中绑定格式化数据
HTTP 请求数据能够支持各种各样的格式,包括 JSON 、XML 以及许多其它的格式。当你使用 [FromBody] 特性的时候表示你想要从 HTTP 请求的 Body 中绑定参数, MVC 使用一个格式化器的配置集来处理与 HTTP 请求的 Content-Type 对应的请求数据。默认情况下 MVC 包含一个 JsonInputFormatter 类用来处理 JSON 数据,但是你可以添加额外的格式化器来处理 XML 或者其它自定义格式。
提示
JsonInputFormatter是默认的格式化器,它是基于 Json.NET。
ASP.NET 选择输入格式化器基于 Content-Type Header 以及参数的类型,除非这里有一个 Attribute 去指定其它的。如果你更喜欢使用 XML 或者其他格式,你必须在 Startup.cs 文件中进行配置,但是首先你必须使用 NuGet 引用 Microsoft.AspNetCore.Mvc.Formatters.Xml 。你的启动代码看起来应该像这样:
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc()
.AddXmlSerializerFormatters();
}
Startup.cs 文件中的代码包含了一个带有 services 参数的 ConfigureServices 方法,你可以使用它来为你的 ASP.NET 应用构建服务。在示例中,我们添加一个 XML 格式化器作为一个在此应用中 MVC 能够提供的的服务。 options 参数传入 AddMvc 方法允许你去添加和管理过滤器(Filter),格式化器(Formatter),以及其它 MVC 的系统选项从应用中启动。然后应用 各种各样的 Attribute 到 Controller 类或者 Action 方法上去实现你预期的效果。
ASP.NET Core 中文文档 第四章 MVC(2.1)模型绑定的更多相关文章
- ASP.NET Core 中文文档 第四章 MVC(4.2)控制器操作的路由
原文:Routing to Controller Actions 作者:Ryan Nowak.Rick Anderson 翻译:娄宇(Lyrics) 校对:何镇汐.姚阿勇(Dr.Yao) ASP.NE ...
- ASP.NET Core 中文文档 第四章 MVC(3.6.1 )Tag Helpers 介绍
原文:Introduction to Tag Helpers 作者:Rick Anderson 翻译:刘浩杨 校对:高嵩(Jack) 什么是 Tag Helpers? Tag Helpers 提供了什 ...
- ASP.NET Core 中文文档 第四章 MVC(3.8)视图中的依赖注入
原文:Dependency injection into views 作者:Steve Smith 翻译:姚阿勇(Dr.Yao) 校对:孟帅洋(书缘) ASP.NET Core 支持在视图中使用 依赖 ...
- ASP.NET Core 中文文档 第四章 MVC(4.6)Areas(区域)
原文:Areas 作者:Dhananjay Kumar 和 Rick Anderson 翻译:耿晓亮(Blue) 校对:许登洋(Seay) Areas 是 ASP.NET MVC 用来将相关功能组织成 ...
- ASP.NET Core 中文文档 第四章 MVC(4.5)测试控制器逻辑
原文: Testing Controller Logic 作者: Steve Smith 翻译: 姚阿勇(Dr.Yao) 校对: 高嵩(Jack) ASP.NET MVC 应用程序的控制器应当小巧并专 ...
- ASP.NET Core 中文文档 第四章 MVC(4.4)依赖注入和控制器
原文: Dependency Injection and Controllers 作者: Steve Smith 翻译: 刘浩杨 校对: 孟帅洋(书缘) ASP.NET Core MVC 控制器应通过 ...
- ASP.NET Core 中文文档 第四章 MVC(4.1)Controllers, Actions 和 Action Results
原文:Controllers, Actions, and Action Results 作者:Steve Smith 翻译:姚阿勇(Dr.Yao) 校对:许登洋(Seay) Action 和 acti ...
- ASP.NET Core 中文文档 第四章 MVC(3.9)视图组件
作者: Rick Anderson 翻译: 娄宇(Lyrics) 校对: 高嵩 章节: 介绍视图组件 创建视图组件 调用视图组件 演练:创建一个简单的视图组件 附加的资源 查看或下载示例代码 介绍视图 ...
- ASP.NET Core 中文文档 第四章 MVC(3.7 )局部视图(partial)
原文:Partial Views 作者:Steve Smith 翻译:张海龙(jiechen).刘怡(AlexLEWIS) 校对:许登洋(Seay).何镇汐.魏美娟(初见) ASP.NET Core ...
- ASP.NET Core 中文文档 第四章 MVC(01)ASP.NET Core MVC 概览
原文:Overview of ASP.NET Core MVC 作者:Steve Smith 翻译:张海龙(jiechen) 校对:高嵩 ASP.NET Core MVC 是使用模型-视图-控制器(M ...
随机推荐
- Javascript - Promise学习笔记
最近工作轻松了点,想起了以前总是看到的一个单词promise,于是耐心下来学习了一下. 一:Promise是什么?为什么会有这个东西? 首先说明,Promise是为了解决javascript异步编 ...
- .NET基础拾遗(5)多线程开发基础
Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理基础 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开 ...
- ABP文档 - 目录
ABP框架 概览 介绍 多层结构 模块系统 启动配置 多租户 集成OWIN 共同结构 依赖注入 会话 缓存 日志 设置管理 时间 领域层 实体 值对象(新) 仓储 领域服务 工作单元 领域事件(Eve ...
- 谈谈一些有趣的CSS题目(二)-- 从条纹边框的实现谈盒子模型
开本系列,讨论一些有趣的 CSS 题目,抛开实用性而言,一些题目为了拓宽一下解决问题的思路,此外,涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题中有你感觉 ...
- mac下安装及配置tomcat
mac下的软件不像windows下的程序那样写注册表,对于tomcat的安装来说,在mac下是名符其实的绿色软件,具体操作如下: 1.到 apache官方主页 下载完整 tar.gz文件包.(没有专门 ...
- 基于改进人工蜂群算法的K均值聚类算法(附MATLAB版源代码)
其实一直以来也没有准备在园子里发这样的文章,相对来说,算法改进放在园子里还是会稍稍显得格格不入.但是最近邮箱收到的几封邮件让我觉得有必要通过我的博客把过去做过的东西分享出去更给更多需要的人.从论文刊登 ...
- Ajax使用WCF实现小票pos机打印源码
通过ajax跨域方式调用WCF服务,实现小票pos机的打印,源码提供web方式,客户端方式测试,服务驻留右侧底部任务栏,可控制服务开启暂停,用户可自定义小票打印模板,配合零售录入. qq 22945 ...
- 安卓客户端a标签长按弹框提示解决办法
昨天工作时候发现一个bug,是关于a标签的,在安卓客户端中,如果是a标签的话,长按会出现一个弹框,如图所示 是因为安卓客户端的长按触发机制,以后进行wap端开发的时候,如果用到跳转页面尽量不要用a标签 ...
- GCC学习(1)之MinGW使用
GCC学习(1)之MinGW使用 因为后续打算分享一些有关GCC的使用心得的文章,就把此篇当作一个小预热,依此来了解下使用GNU工具链(gcc.gdb.make等)在脱离IDE的情况下如何开发以及涉及 ...
- 【QQ红包】手机发抢不到的口令红包
这方法95%的人都抢不了 在QQ输入框输入一个表情,例如:阴险那个表情 将表情剪切到口令红包的口令里 这时候口令里的那个表情表情变成了符号 将符号删去一格,然后全选.复制 然后返回到QQ输入框粘贴 然 ...