Asp.Net Mvc 控制器详解
理解控制器
控制器的角色
(1)中转作用:控制器通过前面的学习大家应该知道它是一个承上启下的作用,根据用户输入,执行响应行为(动 作方法),同时在行为中调用模型的业务逻辑,返回给用户结果(视图)。
(2)中介角色:分离视图和模型,让视图和模型各司其职,控制器赋值二者交互。只负责数据传送,不负责处理。 控制器的两种角色可以用下图来表示:
深入理解控制器类
(1)观察控制器类的元数据。前面我们一直用控制器,在最初我们也简单说过控制器必须继承 Controller 类,那么 Controller 类究竟还有哪些密码需要我们进一步研究呢。其实我们通过查看 Controller 类的元数据,就能够发现, 如下图所示:
(2)ControllerBase 类需要理解的内容:
Controller 类位于 System.Web.Mvc 命名空间,继承自 ControllerBase 类。
ControllerBase 类实现了 Icontroller 接口的 Execute 方法,在路由器搜索到相应的控制器后,就会调用 Execute 方法进入控制器的处理。
(3)ControllerBase 的属性:
- ControllerContext:获取或设置控制器上下文。
- ValidateRequest:获取或设置一个值,该值指示伺服为此请求启用请求验证。
- ValueProvider:获取或设置控制器的值。
- ViewData:获取或设置数据的字典。
- ViewBag:获取动态视图数据字典。
- TempData:获取或设置可以在不同控制器之间传递数据的字典。
(4)ControllerBase 的任务:
- 定位:找到对应的动作方法。
- 获取参数:获取动作方法的参数。
- 处理错误:在执行动作方法中可能出现的错误。
- 渲染视图:提供默认的 WebFormViewFactory 类来渲染 ASP.NET 视图。
动作方法的参数
获取表单的常规方法
回顾我们以前在动作方法中获取 URL 和表单数据的方法,代码如下:
请大家思考,除了上面的方法外,还有没有更好的方法呢?答案是有的,请大家继续看下面的新方法。
动作方法参数的映射:
(1):)参数映射的基本使用: 其实,在 ASP.NET MVC 框架中,给我们提供了非常好的获取参数的方法,那就是可以 通过参数映射的形式直接获取参数值,而无需再像上面那样单独获取,只要我们提交的参数名称(比如文本框的 name)和我们定义的动作方法参数一致基本就可以,下面我们先看一个例子:
(2)参数映射的好处: 通过上面可以看出,我们省去了参数获取的步骤,这样在参数较多的时候开发效率是非常明 显的。
(3)动作方法参数映射来源,如下表所示:
(4)动作方法参数映射要求: 第一,参数名要和目标数据参数名一致(不区分大小写)。
值类型参数映射问题
(1)值类型参数有时候会失败,我们来做一个测试:比如,我们要求用户输入用户名和密码后登录,但是用户只是 输入了密码,没有输入用户名,那么提交后会有什么结果呢?
(2)原因分析:是因为 int 类型的参数,必须有数据才行,因为用户从视图中传递的数据是 null,而参数映射的时候 是无法将 null 转换成 int 类型。所以,大家明白这个道理,我们只需要将参数 int 类型定义成可为空类型 int?即可。
提示:虽然我们定义了可为空类型,但是并不是说我们开发中以后可以随便的使用带?的可为空类型,比如实际开 发中,我们肯定会有验证,也就是说用户登录 ID 是不会为 null 的,刚才我们只是这样一个测试,如果您在写项目 时,确实前端不需要验证,也允许为空,而后台是值类型,这时候就用刚才我们给出的方法解决是最完美的。
映射模型
(1)问题思考:前面的参数映射虽然解决了获取参数的麻烦,但是请思考,如果参数还是很多怎么办?如下图所示:
(2)解决思路:按照我们面向对象编程的规范,一个方法的参数是不能过多的,3-4 个就已经不少了,再多就不方便了, 于是我们在基础课程阶段告诉大家了解决方法,那就是使用实体类来解决!非常好,有了实体类,在动作方法中,我 们照样能够使用!
(3)使用模型映射的基本步骤:第一,获取表单数据;第二,自动构造实体模型,第三,调用业务逻辑方法并传递 模型。具体代码实现如下:
(4)模型映射的总结。通过上面的例子,您应该感觉出来了,模型自动映射最关键的就是参数的 name 一定要和实 体类的属性一致,因为在自动构造模型的时候,就是根据这个参数 name 对应到实体类的属性,这个非常关键。
动作方法特性与 ActionResult
动作方法同名问题
我们知道普通的方法可以同名,也就是使用重载的方法,那么一个控制器的动作方法能不能也重名呢,我们接下来 做一个测试,在一个控制器中添加两个同名的动作方法,然后运行程序,代码如下:
结果发现,路由不鞥呢根据方法参数去定位动作方法!那这个问题如何解决呢?我们继续往下研究、
动作方法的特性应用
(1)Http 请求谓词特性:针对请求类型定位方法,这样就能解决同名冲突问题,那我们先看特性的类型和具体使用 方法,如下图所示:
按照以上方法,再次运行程序就不会出现前面的问题了,因为两个不同的动作方法,会针对不同的请求来响应,这 样就不会争夺同一个请求。
(2)关于 Http 谓词:特点是经常使用,如果不加上该特性,默认动作方法接收所有谓词的请求,一般开发中都会加 上谓词,限定请求谓词类型。
(3)NonAction 特性:特点是可以将控制器中的方法声明为“非动作方法”,对于控制器内部使用的方法非常有用, 加上该特性后,外部不能访问,即可解决同名冲突问题。示例如下:
(4)ActionName 特性:特点是为动作方法“重新命名”,解决同名方法冲突问题,视图中使用时,需要修改成“重 新命名”后的方法。示例如下:
ActionResult 详解
(1)ActionResult 与 View()方法的关系:前面我们一直用 View()方法返回动作方法的值,返回值类型也是 ActionResult。那么究竟两者是何种关系呢?我们通过下图来看一下:
通过上面的分析,我们发现,View()方法重载了很多次,而且返回类型都是 ViewResult 对象,而不是 ActionResult 对象,那么我们继续研究两者个关系通过查看 MSDN 我们得出如下结论:那就是 ViewResultBase 继承 ActionResult,而 ViewResult 又继承 ViewResultBase,所以 ViewResult 还是 ActionResult 的子类,关系如下:
以上关系很清楚的能够用我们前面讲解的“里氏替换原则”来解释,父类作为方法的返回值类型,实际返回的是 子类对象,这正是面向对象三大特性之多态的体现。
(2)常用的内容输出类型。以下表格都我们开发中经常用到的,请大家先参考,后面我们用到的时候慢慢巩固:
(3)隐式动作类型。所谓隐式类型就是说动作方法的返回类型可以是 ActionResult 以外的类,示例如下:
提示:看似是其他数据类型,其实本质上 int 类型会自动转换成 ContentResult 类型,void 转换成 EmptyResult 类型。这点请大家务必记住。
Asp.Net Mvc 控制器详解的更多相关文章
- ASP.NET MVC Route详解
在MVC3.0版本的时候,微软终于引入了第二种模板引擎:Razor.在这之前,我们一直在使用WebForm时代沿留下来的ASPX引擎或者第三方的NVelocity模板引擎.Razor在减少代码冗余.增 ...
- asp.net MVC ViewData详解
转自:http://www.cnblogs.com/gaopin/archive/2012/11/13/2767515.html 控制器向视图中传值ViewData详解 1.将一个字符串传值到视图中 ...
- MVC控制器详解
原文地址:http://www.cnblogs.com/SeeYouBug/p/6441934.html#3628606 目录 一.理解控制器 1.1.什么是控制器 1.2.控制器的作用 1.3.创建 ...
- asp.net Mvc 路由详解,非常详细.
关于路由的理解 为什么要定义路由?路由的定义在开发中的工作量非常小,但是非常重要,因为任何请求都离不开路由. 各个电商网站的 URL 使用非常灵活,都离不开路由的定义,请大家参考几家电商的 URL 如 ...
- ASP.NET MVC 过滤器详解
http://www.fwqtg.net/asp-net-mvc-%E8%BF%87%E6%BB%A4%E5%99%A8%E8%AF%A6%E8%A7%A3.html 我经历了过滤器的苦难,我想到了还 ...
- MVC 控制器详解
Controller: Controllers 文件夹包含负责处理用户输入和响应的控制器类. MVC 要求所有控制器的名称必须以 "Controller" 结尾. 控制器的职责: ...
- 详解ASP.NET MVC 控制器
1 概述 在阅读本篇博文时,建议结合上篇博文:详解ASP.NET MVC 路由 一起阅读,效果可能会更好些. Controller(控制器)在ASP.NET MVC中负责控制所有客户端与服务端的 ...
- 【ASP.NET MVC系列】浅谈ASP.NET MVC 控制器
ASP.NET MVC系列文章 [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操作 ...
- MVC过滤器详解
MVC过滤器详解 APS.NET MVC中(以下简称"MVC")的每一个请求,都会分配给相应的控制器和对应的行为方法去处理,而在这些处理的前前后后如果想再加一些额外的逻辑处理. ...
随机推荐
- 王艳 201771010127《面向对象程序设计(Java)》第四周学习总结
第一部分:理论知识. 第四章:对象与类 4.1:类与对象的概念. 类:是构造对象的模板或蓝图.由类构造对象的过程称为创建类的实例. 对象:想要使用oop,一定要清楚对象的三个特性: 1)对象的行为:对 ...
- MySQL知识-MySQL不同版本多实例
一.不同版本多实例 0.软连接不同版本软件,修改环境变量 [root@db01 database]# ln -s mysql-5.6.46-linux-glibc2.12-x86_64 mysql ...
- 在win10上搭建pyspark,
最近在研究Spark,准确的说是pyspark,为了搭个测试环境,之前一直在云上开Linux机器来搭Hadoop,但是Spark可以Local执行,我就打算在本地搭个环境.遇到了一些问题,记录一下,也 ...
- 【译】OWIN: Open Web Server Interface for .NET
主要是使用 OAuth 时,它运行在 OWIN 上,然后又出了若干问题,总之,发现对 IIS.ASP.NET 和 OWIN 理解一塌糊涂. 后面看到 OWIN: Open Web Server Int ...
- [Wireshark]_001_入门
Wireshark(前称Ethereal)是一个网络封包分析软件.网络封包分析软件的功能是撷取网络封包,并尽可能显示出最为详细的网络封包资料.Wireshark使用WinPCAP作为接口,直接与网卡进 ...
- Java实现 蓝桥杯 算法提高 因式分解
算法提高 8-1因式分解 时间限制:10.0s 内存限制:256.0MB 提交此题 问题描述 设计算法,用户输入合数,程序输出若个素数的乘积.例如,输入6,输出23.输入20,输出22*5. 样例 与 ...
- Java实现 LeetCode 376 摆动序列
376. 摆动序列 如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为摆动序列.第一个差(如果存在的话)可能是正数或负数.少于两个元素的序列也是摆动序列. 例如, [1,7,4,9,2,5 ...
- Java实现 LeetCode 357 计算各个位数不同的数字个数
357. 计算各个位数不同的数字个数 给定一个非负整数 n,计算各位数字都不同的数字 x 的个数,其中 0 ≤ x < 10n . 示例: 输入: 2 输出: 91 解释: 答案应为除去 11, ...
- Java实现 蓝桥杯VIP 算法训练 接水问题
题目描述 有n个人在一个水龙头前排队接水,假如每个人接水的时间为Ti,请编程找出这n个人排队的一种顺序,使得n个人的平均等待时间最小. 输入输出格式 输入格式: 输入文件共两行,第一行为n:第二行分别 ...
- Java实现 LeetCode 54 螺旋矩阵
54. 螺旋矩阵 给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素. 示例 1: 输入: [ [ 1, 2, 3 ], [ 4, 5, 6 ], ...