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 ...
随机推荐
- 【BZOJ】【1014】【JLOI2008】火星人prefix
Splay/二分/Hash 看了网上的题目关键字(都不用点进去看……我也是醉了)了解到做法= =那就上呗,前面做了好几道Splay的题就是为了练手搞这个的. Hash判断字符串是否相同应该很好理解吧? ...
- 版本号控制-git(二)
上次文章给大家介绍了Git的一些基本知识(http://www.cnblogs.com/jerehedu/p/4582398.html).并介绍了使用git init初始化化版本号库.使用git ad ...
- HDU4183 起点到终点再到起点 除起点每点仅经过一次 网络流
题意: T个测试数据 n个圆 下面 fre x y r 表示圆的频率 坐标和半径 要求: 从频率为400(最小的) 圆 走到频率为789(最大)的圆,再走回来,除起点每个点只能经过一次 问这样的路径是 ...
- 网上收集:跟着 8 张思维导图学习 Javascript【转】
学习的道路就是要不断的总结归纳,好记性不如烂笔头,so,下面将po出8张javascript相关的思维导图. 思维导图小tips:思维导图又叫心智图,是表达发射性思维的有效的图形思维工具 ,它简单却又 ...
- CloudStack无法添加模板和iso
做了N久的CloudStack二次开发,最近越来越多的人开始使用CloudStack. 通常会遇到添加模板和iso不成功的问题. 表现为注册了template/iso之后,"已就绪" ...
- linux中sort命令
功能说明:将文本文件内容加以排序,sort可针对文本文件的内容,以行为单位来排序. 参 数: -b 忽略每行前面开始出的空格字符. -c 检查文件是否已经按照顺序排序. -d 排序时,处理英文字母.数 ...
- (转)AssetBundle系列——游戏资源打包(一)
转自:http://www.cnblogs.com/sifenkesi/p/3557231.html 将本地资源打包,然后放到资源服务器上供游戏客户端下载或更新.服务器上包含以下资源列表:(1)游戏内 ...
- Android中startService的使用及Service生命周期
Android中有两种主要方式使用Service,通过调用Context的startService方法或调用Context的bindService方法.本文仅仅探讨纯startService的使用.不 ...
- 关于gcc、glibc和binutils模块之间的关系,以及在现有系统上如何升级的总结
http://blog.csai.cn/user1/265/archives/2005/2465.html 一.关于gcc.glibc和binutils模块之间的关系 1.gcc(gnu collec ...
- nginx 备忘
下载 start nginxlocalhost:80