MVC笔记 Controller相关技术
一、Controller的责任
MVC的核心就是Controller(控制器),它负责处理浏览器传送过来的所有请求,并决定要将什么内容响应给浏览器。但Controller并不负责决定内容应该如何显示,而是将特定形态的内容响应给MVC架构,最后才由MVC架构依据响应的形态来决定如何将内容响应给浏览器。如何决定响应内容是View的责任。
二、Controller的类与方法
Controller本身就是一个类(Class),该类有许多方法(Method)。在这些方法中,只要是公开方法,该方法就会被视为是一种动作(Action);只要有动作存在,就可以通过该动作方法接收网页请求并决定响应视图。
aaarticlea/png;base64,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" alt="" />
由上可知编写Controller的基本要求:
- Controller必须为公开类。
- Controller的名称必须以"Controller"结尾。
- 必须继承自MVC内置的Controller类,或继承自实现IController接口的自定义类,或自行实现IController接口。
- 所有方法必须为公开方法。改方法可以没有参数,也可以有多个参数。
三、Controller的执行过程
Controller被MvcHandler选中之后,下一步就是通过ActionInvoker选取适当的Action来执行。在Controller中,每一个Action可以定义0到多个参数。ActionInvoke会依据当前的RouteValue及客户端传过来的信息准备好可输入Action参数的依据,最后正式调用被Controller选中的那个Action方法。
Action执行完后的返回值通常是ActionResult类的。事实上,ActionResult类是一个抽象类,因此,MVC本身就实现了许多不同ActionResult类的子类。Controller得到ActionResult类之后,就会开始执行ActionResult类的ExecuteResult()方法,并将执行的结果返回客户端。这时,Controller的任务就算完成了。
Controller在执行时还有一个动作过滤器(Action Filter)机制,可以分成以下4中类型。
- 授权过滤器(Authorization Filter);
- 动作过滤器(Action Filter);
- 结果过滤器(Result Filter);
- 例外过滤器(Exception Filter)。
此外,在Controller的执行过程中还必须考虑动作过滤器的执行顺序。除上述说明之外,在执行Action与ActionResult类时嗨会有一些事件被执行,这部分将在九中说明。
四、动作名称选取器
通过ActionInvoker选取Controller中的公开方法时,默认会用Reflection(映像)的方式取得Controller中具有相同名字的方法(不区分大小写)。如下程序范例表示得很清楚:当RouteValue表达式中的Action是"Index",默认会执行Index()方法。

1 public class HomeController : Controller
2 {
3 /// <summary>
4 /// 要求网址 http://localhost/Home/Index
5 /// </summary>
6 public ActionResult Index()
7 {
8 return View();
9 }
10
11 }

如果在以上的Action中加入ActionName属性,并将其指名为"Default",此时,若RouteValue表达式中的Action是"Index",就不会执行Index()方法,而必须使RouteValue表达式中的Action为"Default",Index()方法才能被正确执行,这就是动作名称选取器(Action Name Selector)的作用,示例如下。

1 public class HomeController : Controller
2 {
3 /// <summary>
4 /// 要求网址 http://localhost/Home/Index
5 /// </summary>
6 [ActionName("Default")]
7 public ActionResult Index()
8 {
9 return View();
10 }
11
12 }

唯一需要特别注意的是,如果你使用默认的"return View()"方法返回ActionResult类,由于应用了[ActionName("Default")]属性,所以MVC会去寻找"/Views/Home/Default.aspx"页面而不是"/Views/Home/Index.aspx"页面来执行。
五、动作方法选取器
5.1 NonAction属性
若将NonAction属性应用在Controller中的Action方法上,即便该Action方法是公开方法,也会告知ActionInvoke不要选取这个Action来执行。这个属性主要用来保护Controller中的特定公开方法不会被发布到Web上。或是当功能尚未开发完成就要进行部署时,若暂时不想将此方法删除,也可应用这个属性,表示"不要对外公开"。
1 [NonAction]
2 public ActionResult Index()
3 {
4 return View();
5 }
将Action方法中的"public"修改成"privare",也可以达到同样的目的,示例如下:
1 private ActionResult Index()
2 {
3 return View();
4 }
5.2 HttpGet属性、HttpPost属性、HttpDelete属性和HttpPut属性
HttpGet、HttpPost、HttpDelete和HttpPut属性是动作方法选取器的一部分,我们以下列程序为例进行介绍。若应用了[httpPost]属性,表示只有当客户端浏览器发送HTTP POST请求时才可以选取这个Action。
1 [HttpPost]
2 private ActionResult Index()
3 {
4 return View();
5 }
相反的,若果没有应用这些属性,客户端浏览器发送任何HTTP动词,都会自动选取对应的Action。
这些属性常用在需要接受窗口数据的时候。你可以创建两个同名的Action,一个应用[HttpGet]属性来显示窗口HTML,另一个应用[HttpPost]属性来接收窗口送出的值,范例程序如下。

1 [HttpGet]
2 public ActionResult Create()
3 {
4 return View();
5 }
6 [HttpPost]
7 private ActionResult Create(FormCollection c)
8 {
9 UpdateToDB(c);
10 return RedirectToAction("Index");
11 }

NOTE 由于HTML窗口无法送出"Delete"这个Http动词,所以如果希望Action能提供像RESET协议那样的方式来处理删除动作,又能通过同一个窗口使用这个只允许"Delete"的动作的话,可以用Html.HttpMethodOverride()方法的HTML辅助方法来模拟Http Delete方法的行为,但实际上窗口还是以Http Post的方式送出去的。
六、 ActionResult类
ActionResult类是Action执行的结果,但ActionResult中并不包含执行结果,而是包含执行响应时所需的信息。当Action返回ActionResult类之后,会由MVC执行。先看看ActionResult抽象类的程序代码。在ActionResult抽象类中仅定义了一个ExecuteResult()方法来执行结果。

1 namespace System.Web.Mvc
2 {
3 // 摘要:
4 // 封装一个操作方法的结果并用于代表该操作方法执行框架级操作。
5 public abstract class ActionResult
6 {
7 // 摘要:
8 // 初始化 System.Web.Mvc.ActionResult 类的新实例。
9 protected ActionResult();
10
11 // 摘要:
12 // 通过从 System.Web.Mvc.ActionResult 类继承的自定义类型,启用对操作方法结果的处理。
13 //
14 // 参数:
15 // context:
16 // 用于执行结果的上下文。上下文信息包括控制器、HTTP 内容、请求上下文和路由数据。
17 public abstract void ExecuteResult(ControllerContext context);
18 }
19 }

MVC定义的ActionResult如表所示:
|
类 |
Contro辅助方法 |
用 途 |
|
ContentResult |
Content |
返回一段用户自定义的文字内容 |
|
EmptyResult |
不返回任何数据,即不响应任何数据 |
|
|
JsonResult |
Json |
将数据序列化成JSON格式返回 |
|
RedirectResult |
Redirect |
重定向到指向的URL |
|
RedirectToRouteResult |
RedirectToAction、RedirectToRoute |
与RedirectResult类似,但它将新定向到一个Action或Route |
|
ViewResult |
View |
使用IViewInstance接口和IViewEngine接口,实际输出数据的是IViewEngine接口和View |
|
PartialViewResult |
PartialView |
与ViewResult类相似,返回的是”部分显示”,即”UserControls”目录下的View |
|
FileResult |
File |
以二进制串流的方式返回一个文件数据 |
|
JavaScriptResult |
JavaScript |
返回的是JavaScript指令码 |
表中的Controller辅助方法在Controller类中为返回ActionResult类提供支持,如下程序可用于跳转到另一个页面。
1 [HttpPost]
2 public ActionResult Post(FormCollection c)
3 {
4 return new RedirectResult("/");
5 }
如果使用Controller辅助方法,就可以将以上程序改写如下:
1 [HttpPost]
2 public ActionResult Post(FormCollection c)
3 {
4 return Redirect("/");
5 }
以上两段程序代码其实差不多,但实际操作中则是以使用Controller辅助方法居多。
6.1 ViewResult类
ViewResult类是在MVC中最常用的ActionResult类,用于返回一个标准的视图。通过Controller辅助方法,我们能更方便地定义如何输出视图。指定要输出的View名称、指定该View要应用哪个MasterPage、指定要输入的View的Model。
6.2 PartialViewResult类
PartialViewResult类与ViewResult类非常相似,但它无法为View赋值MasterPage,通常用在前端为Ajax应用程序的情况下,并可以通过Ajax来取得网页中的部分内容。
如下程序会执行"/Views/Home/About.ascx"页面,并将结果输出至客户端。
1 public ActionResult About()
2 {
3 return PartialView();
4 }
6.3 EmptyResult类
有些Action在执行后其实不需要返回任何数据,例如一个页面执行完后直接转到其他页面的情况。EmptyResult类不会执行任何响应客户端的程序,所以也不会返回任何数据,使用方法如下:
1 public ActionResult Empty()
2 {
3 return new EmptyResult();
4 }
在MVC中,还有一种表达EmptyResult类的方式,即将上述语法写成如下:
1 public void Empty()
2 {
3 return;
4 }
有一种情况是用EmptyResult类搭配Response.Redirect()方法进行HTTP 302暂时转向,示例如下:
1 public void Redirect()
2 {
3 Response.Redirect("/Home/Index");
4 }
如果已经开始使用.NET 4.0,也可以考虑使用4.0新增的Respo.RedirectPermanent()方法建立HTTP 301永久转向,示例如下。
1 public void Redirect()
2 {
3 Response.RedirectPermanent("/Home/Index");
4 }
6.4 ContentResult类
ContentResult类可以响应文字内容的结果。可以让ContentResult类响应任意指定文字内容。Content-Type和文字编码(Encoding)。
如下范例将会响应一段XML文字,并设定响应的Content-Type为text/xml(已指定响应的文字编码方式为Encoding.UTF8)。
1 public ActionResult Content()
2 {
3 return Content("<ROOT><TEXT>123</TEXT></ROOT>","text/xml",Encoding.UTF8);
4 }
如果只响应一串HTML字符串,可以只使用第一个参数,如下:
1 public ActionResult Content()
2 {
3 string strHTML = "........"; //省略 HTML的内容
4 return Content(strHTML);
5 }
还有一种方法可以表达如上一样简单的返回类,直接将返回类设定成"string"即可。MVC会进行判断,只要Action返回的不是ActionResult类,就会将返回的类转换成字符串类输出。
6.5 FileResult类
FileResult类可以响应任意的文件内容,包括二进制格式的数据,例如图像文件。PDF文档或ZIP文件,可以输入byte数组、文件路径、stream数据、Content-Type、下载文件名等参数并将其返回客户端。事实上,FileResult是一个抽象类,在MVC中实现FIleResult类的子类共有3个,分别是:
- FilePathResult:响应一个实体文件;
- FileContentResult:响应一个byte数组的内容;
- FileStreamResult:响应一个Stream数据。
但通过Controller类中所提供的File辅助方法可以让你不用记忆这么多。File()辅助方法能自动选取不同的FileResult类进行响应。
如果通过Action输出一个存储在"App_Data"目录栏下的PNG图像文件,可以参考以下代码:
1 public ActionResult GetFile()
2 {
3 return File(Server.MapPath("~/App_Data/UserA/a.png"),"image/png");
4 }
若希望直接通过浏览器下载文件,而不是在浏览器打开文件,可以再第3个参数中输入要求下载的文件名。如:PDF文件来自于数据库,并希望让用户下载,可以先取得一个byte数组或Stream数据,并在File()辅助方法的第2个参数中指定正确的Content-Type,最后再指定要下载的文件名即可。
1 public ActionResult GetFile()
2 {
3 byte[] fileContent = GetFileByteArrayFromDB();
4
5 return File(fileContent,"application/pdf","Report.pdf");
6 }
6.6 强制下载文件时需注意中文文件名的问题
由于MVC支持中文文件名文件下载的能力有限,若要开发出跨浏览器下载中文文件名文件的解决方案,就不能只靠FileResult类了,可以自定义ActionResult类来克服这个问题,也可直接用较为底层的方法来解决。一下将说明强制下载文件的原理及解决方法。
强制下载文件功能时,通常是通过设定"Content-Disposition"这个HTTP响应标头(Response Header)的方式将强制下载文件的要求告知客户端,示例如下。
1 string fileName = "ExportData.csv";
2 string strContentDisposition = String.Format("{0};filename=\"{1}\"", "attachment", fileName);
3 Response.AddHeader("Content-Disposition", strContentDisposition);
通过上述程序代码,就可以让客户端强制下载此页面的内容,也就是说,改页面的内容(可能是文件或二进制文件)不会直接在浏览器中打开,下载后也不会打开相关程序。
Content-Disposition标头的第一组参数是"attachment",代表此文件是一个附件文件,也就是"要求下载"的意思。如果将"attachment"改成".inline"的话,就代表这是一个内嵌于其他网页的文件(如图像文件、CSS、JavaScript、Flash等),而这也是默认的设定,等同于不添加Content-Disposition标头的情况。
6.7 JavaScriptResult类
JavaScriptResult类的用途是将javaScript程序代码响应给浏览器。通过Ajax环境,可以利用JavaScriptResult类来响应适当的JavaScript程序代码并将其交给浏览器动态执行,由于Ajax功能属于View.
6.8 JsonResult类
JSON是Web在实现Ajax应用程序时经常使用的一种数据传输格式,JsonResult类可自动将任意对象的数据序列转换成JSON格式返回。JsonResult类默认的Content-Type为application/json,对于某些JavaScript Framework来说,这是必要的需求,如jQuery。 建议尽量避免使用HTTP GET方法获取JSON数据。但若只使用HTTP POST方法获取JSON数据也存在一个问题,那就是数据无法被浏览器缓存。如果数据敏感度不高且想实现缓存的话,还需让JsonResult类能够对HTTP GET请求进行响应,解决方案就是为JSON()辅助方法加上一个JsonResultBehavior列举参数,这样就可以通过GET方法取得JSON数据了。

1 public ActionResult JSON()
2 {
3 return Json(new
4 {
5 id = 1,
6 name = "will",
7 CreatedOn = DateTime.Now
8 }, JsonRequestBehavior.AllowGet);
9 }

6.9 RedirectResult类
RedirectResult类主要用途是执行指向其他页面的重定向。在RedirectResult类的内部,基本上还是用Response.Redirect()方法响应HTTP 302暂时定向的。
1 public ActionResult Redirect()
2 {
3 return Redirect("/Home/Index");
4 }
6.10 RedirectToRoute类
Controller类中有两个与RedirectToRoute类有关的辅助方法,分别是RedirectToAction()和RedirectToRoute().
1. RedirectToAction()辅助方法
RedirectToAction()方法比较简答,既可通过直接输入Action名称来设定让浏览器转向该Action网址,也可以输入新建的RouteValue值,如下:
- 转到同一个Controller中的另一个Action。
1 public ActionResult RedirectToActionSample()
2 {
3 return RedirectToAction("SamplePage");
4 }
- 转到指定Controller的特定Action。
1 public ActionResult RedirectToActionSample()
2 {
3 return RedirectToAction("List", "Member");
4 }
- 转到MemberController的List Action,并且加上"page"这个RouteValue值。
1 public ActionResult RedirectToActionSample()
2 {
3 return RedirectToAction("List", "Member", new { page = 3 });
4 }
2. RedirectToRoute()辅助方法
RedirectToRoute()辅助方法较为复杂,可利用Global.asax文件中定义的网址路由表来指定不同的转向网址。
- 转到同一个Controller中的另一个Action。
1 public ActionResult RedirectToRouteSample()
2 {
3 return RedirectToRoute(new { action = "SamplePage" });
4 }
- 转到指定Controller的特定Action。
1 public ActionResult RedirectToRouteSample()
2 {
3 return RedirectToRoute(new { controller = "Member", action = "list" });
4 }
- 转到MemberController的List Action,并且加上"page"这个RouteValue。
1 public ActionResult RedirectToRouteSample()
2 {
3 return RedirectToRoute(new { controller = "Member", action = "list", page = 3 });
4 }
七、ViewData与TempData概述
7.1 ViewData
ViewData属性是一个ViewDataDictionary类,可用于存储任意对象的数据,但存储的键值必须为字符串。
ViewData有一个特性,就是它只会存在于当前的HTTP请求中,而不像Session一样可以讲数据带到下一个HTTP请求。
7.2 TempData
TempData的数据结构与ViewData一样,都属于字典类,不过TempData属性的类是TempDataDictionary。TempData嗨有一点不一样的地方,就是它的内部是用Session来存储数据的。存储在TempData中的数据只会暂存:1次网页请求!
1次网页请求的定义:当窗口数据被传送到以下Action中进行存储时,如果发生新建数据失败的情况,我们会希望这次传送的数据可以保留至下一个页面,此时,就会将这个只希望出现1此的信息保存到TempData中,并在下一个页面中执行。

1 [HttpPost]
2 public ActionResult Create(Message msg)
3 {
4 if (!UpdateMessageToDB(msg))
5 {
6 TempData["PostedMessage"] = msg;
7 return RedirectToAction("Create");
8 }
9 return RedirectToAction("Index");
10 }

当新建数据失败的情况发生后,将会返回"Create"这个Action,并将原来的数据从TempData中读出,示例如下:
1 [HttpGet]
2 public ActionResult Create()
3 {
4 string data = TempData["PostedMessage"] as Message;
5 return View(data);
6 }
此时,数据就会回到Create()方法,并在此被传送到Create视图。在这个Controller生命周期结束的前一刻,由于MVC会记录"TempData["PostedMessage"]"语句已经被读取了,因此,在网页请求结束之前会将"TempData["PostedMessage"]"语句删除。
八、模型绑定
8.1 简单模型绑定
8.2 使用FormCollection类获取窗口数据
除了可以通过简单模型绑定机制获取窗口传过来的单栏数据之外,我们也可以通过FormCollection类一次获取整个窗口传送过来的数据。只要设定一个FormCollection类的参数,就可以获取所有从窗口传送过来的数据。这种用法与使用Request.Form()方法一样,不过在MVC里还是建议尽量不要用Request.Form()方法来获取窗口数据。
1 public ActionResult GetFormCollection(FormCollection form)
2 {
3 ViewData["uName"] = form["uName"];
4 return View("ModelBinderDemo");
5 }
8.3 复杂模型绑定
8.4 多个复杂模型的绑定
好比一个HTML代码中只有一个Form(表单)窗口,但是该窗口内有两组字段,是因为在编写数据绑定类里面设定了两组参数,分别为form1和form2,而这两组参数的类都是GuestbookForm,如:
1 public Action ComplexModelBinding(GuestbookForm form1, GuestbookForm form2)
2 {
3 InsertIntoDB(form1);
4 InsertIntoDB(form2);
5 return Redi("/");
6 }
只需要做好模型绑定即可。
8.5 判断模型绑定的结果
验证数据,用自身的方法如Html.ValidationMessageFor()方法用来显示特定字段的错误信息。也可在Controller中判断业务逻辑。
九、动作过滤器(略)
MVC笔记 Controller相关技术的更多相关文章
- mvc Area(区域)相关技术
ASP.NET MVC中,是依靠某些文件夹以及类的固定命名规则去组织model实体层,views视图层和控制层的.如果是大规模的应用程序,经常会由不同功能的模块组成,而每个功能模块都由MVC中的三层所 ...
- [MVC]Area区域相关技术
MVC提供Area机制,在同一个项目之内就能够切割出不同的ASP.NET MVC网站. 插入:首先在相同的位置,比如说同一个文件夹(如:Controllers)是不能创建俩个相同名称的文件(如:Hom ...
- MVC中Controller控制器相关技术
第6章Controller相关技术 Controller(控制器)在ASP.NET MVC中负责控制所有客户端与服务器端的交互,并 且负责协调Model与View之间的数椐传递,是ASP.NET MV ...
- 【转】ASP.NET MVC学习笔记-Controller的ActionResult
1. 返回ViewResult public ActionResult Index() { ViewData["Message"] = "Welcome ...
- 关于Xamarin、Qml、数据绑定、MVC、MVVM 相关的散讲
关于Xamarin.Qml.数据绑定.MVC.MVVM 相关的散讲 SURFSKY 2017.02 最近又在学习Xamarin了?为什么是“又”?有几个利好消息,让我重新拾起它: ()微软去年收购了X ...
- 自己动手做Web框架—MVC+Front Controller
在我前面一篇博文<逃脱Asp.Net MVC框架的枷锁,使用Razor视图引擎>发表之后,很多人关心,脱离了之后怎么办?那么这可以说是它的续篇了. 同时,这也是eLiteWeb开源软件的一 ...
- MVC+Front Controller
MVC+Front Controller 在我前面一篇博文<逃脱Asp.Net MVC框架的枷锁,使用Razor视图引擎>发表之后,很多人关心,脱离了之后怎么办?那么这可以说是它的续篇了. ...
- j2e应用相关技术
j2e应用相关技术 轻量级j2e应用以传统的jsp作为变现层技术,以一系列开源框架作为MVC层,中间件,持久层解决方案,并将这些开源框架有机组合在一起,使得j2e具有高度的可扩展性,可维护性. ser ...
- Winform开发的应用环境和相关技术介绍
随着时间的推移,Winform也算是能够坚持下来最久的技术之一了,它的昔日辉煌和现今的依旧活跃,导致了它依旧拥有者很庞大的用户群体,虽然目前很多技术日新月异的,曾经的ASP.ASP.NET WebFo ...
随机推荐
- 第一章 Java常用的并发类
注:本系列博客主要参考于<分布式Java应用:基础与实践>,林昊 著 1.常用的并发集合类 ConcurrentHashMap:线程安全的HashMap的实现 CopyOnWriteArr ...
- fpga状态机详解
什么是状态机:状态机通过不同的状态迁移来完成特定的逻辑操作 状态机的分类:Moore型状态机和Mealy型状态机 Moore型:状态机的变化只与当前的状态有关 Mealy型:状态机的变化不仅与当前的状 ...
- maven mvn Failed during checkstyle execution
maven 命令默认强制使用checkstyle, 造成 命令运行失败 并报错: Failed during checkstyle execution 关闭checkstyle,命令如下: mvn [ ...
- jQuery用面向对象的思想来编写验证表单的插件
本人的重点是怎么构建一个简单有效可扩展的jQuery表单验证插件,这篇文章没有教你怎么用 validate plugin.我们的重点在学习一些jQuery,Javascript面向对象编程的知识. 下 ...
- 总结div里面水平垂直居中的实现方法
最近经常碰到要垂直居中的问题,所以想着总结一下:关于如何设置小盒子在大盒子里面水平垂直方向同时居中的实现方法有很多种,下面仅列举了常用的几种. 首先看一下要实现的效果图及对应的html代码: < ...
- STL List::sort() 解析
看侯捷翻译那本<STL源码剖析>中list内置sort的算法,书中注释说是quick sort,看了半天没看明白, template <class T, class Alloc> ...
- 解决duilib使用zip换肤卡顿的问题(附将资源集成到程序中的操作方法)
转载请说明原出处,谢谢~~ 今天在做单子是.客户要求做换肤功能,为此我专门写了一个换肤函数,而且把各种皮肤资源压缩为各个zip文件来换肤.可是客户反映程序执行缓慢,我測试后发现的确明显能够看出慢了不少 ...
- vs2013 密钥_
vs2013 密钥 最佳答案: BWG7X-J98B3-W34RT-33B3R-JVYW9
- Missing styles. Is the correct theme chosen for this layout? Use the Theme combo box above the layou
android无法静态显示ui效果. Missing styles. Is the correct theme chosen for this layout? Use the Theme combo ...
- PHP Mysql-连接
PHP 连接 MySQL PHP 5 及以上版本建议使用以下方式连接 MySQL : MySQLi extension ("i" 意为 improved) PDO (PHP Dat ...