【ASP.NET MVC系列】浅谈ASP.NET MVC 控制器

来源:http://www.venoautomotive.com 作者:www.463.com 人气:169 发布时间:2019-10-22
摘要:1   概述 在读书本篇博文时,提议结合上篇博文:详解ASP.NET MVC路由【ASP.NET MVC系列】浅谈ASP.NET MVC 控制器。  一同读书,效果说不定会更加好些。   Controller(调节器)在ASP.NETMVC中担任

1   概述

在读书本篇博文时,提议结合上篇博文:详解ASP.NET MVC 路由【ASP.NET MVC系列】浅谈ASP.NET MVC 控制器。  一同读书,效果说不定会更加好些。  

Controller(调节器)在ASP.NET MVC中担任调节全部顾客端与服务端的并行,何况肩负和煦Model与View之间数据传递,是ASP.NET MVC框架大旨。Controller为ASP.NET MVC框架的基本组成都部队分,其关键承受管理浏览器央浼,并垄断响应什么内容给浏览器,但并不担任调整内容应怎么着体现(View的职务)。

文章内容满含:Controller概述、Controller连串和章程、Controller运维进度、Controller方法种类、ViewDataViewBagTempData深入分析、ActionResult演说、Controller定义和参照他事他说加以考察文献,剩下有关Controller其余内容在本篇小说中不讲,如Controller激活机制(Controller类型深入分析、Controller类型缓存、Controller的放飞和对话状态作为调整等)、ControllerFactory、ControllerBuilder等,除了这些之外,文中有个别过分涉及到底层的剧情,考虑篇幅等成分,只是轻易谈到了一日千里晃,并未有做深切深入分析,依据早先时期情形,会切磋思虑是不是再写少年老成篇深透深远的头部Controller的。

2   Controller连串和章程

Controller自己正是二个类(Class),该品种有相当多格局(Method),那一个方法中要是是当面办法(public method)就能够被视为是三个动作(Action)或动作方法(Action Method),只要动作存在,就可以透过该动作方法接纳顾客端传来的供授予调控响应的查实(View)

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Web;
 5 using System.Web.Mvc;
 6 
 7 namespace MVCControllerDemo.Controllers
 8 {
 9     public class ControllerDemoController : Controller
10     {
11         //
12         // GET: /ControllerDemo/
13 
14         [HttpGet]
15         public ActionResult Index()
16         {
17             return View();
18         }
19     }
20 }

从如上代码能够总计出Controller应持有如下多少个宗旨标准:

(1)Controller必得为公开种类;

(2)Controller名称必需以Controller结尾;

【ASP.NET MVC系列】浅谈ASP.NET MVC 控制器。(3)必须传承自ASP.NET MVC内建的Controller体系,或贯彻IController自定义系列;

(4)所以动作方法必得为公开方法,任何非公开的不二秘诀如宣称为private或protected的格局都不会被视为叁个动作方法;

3  Controller的周转进度

当Controller被MvcHandler选中之后,下一步便是透过ActionInvoker选定合适的Action来运转。在Controllr中的每一种Action能够定义0到五个参数,ActionInvoker会依附当下的RouteValue与客商端传来的数目准备好可传唱Action参数的数码,最终正式调用Controller中被入选的十分Action方法。参数字传送入的性质都以通过后生可畏种名称叫模型绑定(Model Binding)机制,从RequestContext猎取数据,并将数据对应或传播方法的参数中,让Action不用再像在此以前ASP或ASP.NET Web Forms中时时接受的Request.Fomr或Request.QueryString等对象来获得顾客端的数目,通过自定义的模型绑定,以致足以让您对应除去Request.Form或Request.QueryString以外的多少来源于,举个例子:HTTP Cookies、HTTP Headers等等。

Action运维完后的回传值平常是ActionResult系列或其衍生体系(Derived Class),事实上,ActionResult是二个抽象类,如ViewResult用来回传三个View、RedirectResult用来将网页重定向、Content回传文字内容、FileResult回传二进制文书档案等,那个均是承继ActionResult。MvcHandler从Controller获得ActionResult之后,就能够初阶运营ActionResult提供的ExecuteResult方法,并将运营结果响应到客商端,那时Controller的职务正是完事。

如上为Controller的中坚运作进度。Controller在运作时还应该有如火如荼层所谓的动作过滤器机制,分为如下四种为主类型:

(1)授权过滤器(Authorization Filters);

(2)动作过滤器(Action Filters);

(3)结果过滤器(Result Filters);

(4)例外过滤器(Exception Fiters);

4  调节器方法种类

4.1 动作方法选定器

 当通过ActionInvoker选定Controller内的当众形式时,ASP.NET MVC还会有另一个特点称为"动作方法选定器(Action Method Selector)",该选定器能够套用在动作方法上,以便ActionInvoker"选定"适当的Action。

 (1)NonAction属性

若调控器有个别方法性情为NonAction,尽管该Action方法是“公开药模式”,也会报告ActionInvoker不要选定这么些Action来运维。主要用途:a.爱戴Controller中的特定公开药形式毫无发布到Web上;b.成效尚未支付到位就要进行安顿,权且不想将此方法删除。

1 [NonAction]
2  public ActionResult  Index()
3   {
4        return View();
5   }

【ASP.NET MVC系列】浅谈ASP.NET MVC 控制器。也可将public改为private,达到维护的效果与利益。

1 private ActionResult  Index()
2  {
3        return View();
4   }

(2)HTTP动词限定属性

 HttpGet、HttpPost、HttpDelete、HttpPut、HttpHead、HttpOptions、HttpPatch属性(Attributes)都以动作方法选定器的意气风发部分。如下例子批注HttpGet属性,即表示唯有当客户端浏览器发送HTTP GET要求时,ActionInvoker才会选定到这些Action:

1 [HttpGet]
2  public ActionResult  Index()
3  {
4       return View();
5  }

若将[【ASP.NET MVC系列】浅谈ASP.NET MVC 控制器。HttpGet]改为[HttpPost],浏览器将找不到能源。

1 [HttPost]
2 public ActionResult  Index()
3 {
4        return View();
5 }

图片 1

 注释:如果动作方法上还未有嵌套任何限制属性,那么客户端浏览器发送放肆HTTP动词都会自动选定到对应的Action。

 当须求出示选择窗体新闻时,能够创设多少个同名的Action,分别用[HttpGet](突显窗体HTML)和[HttpPost](接纳窗体输出的值)属性来限制。

 1        [HttpGet]
 2         public ActionResult  Index()
 3         {
 4              return View();
 5         }
 6 
 7         [HttpGet]
 8         public ActionResult Create()
 9         {
10             return View();
11         }
12 
13 
14         [HttpPost]
15         public ActionResult Create(FormCollection fc)
16         {
17             //UpdateToDB(fc);
18             return RedirectToAction("Index");
19         }

4.2 操作过滤器

多个操作方法风流浪漫旦被入选就能够即时推行,并且只要它回到一个结果,重临的结果也会随着奉行,ASP.NET MVC 5提供七种方式,分别列于如下:

  • 即身份验证
  • 授权
  • 操作前后处理
  • 结果前后管理
  • 错误管理。

而外,还恐怕有别的大器晚成种过滤器,即重写过滤器,它同意为全局或调节器的暗中同意集结制订例外意况。

操作过滤器能够当作向来使用于操作方法或决定器类的特征来编排,或作为在大局过滤器列表中注册的单独类来编排。假使计划将编写制定的操作过滤器作为特色来利用,那么它必得一而再自FilterAttribute或它的其他子类,如ActionFilterAttribute。不作为性子应用的大局操作过滤器未有对这几个基类的供给。无论使用哪个路由,操作过滤器扶持的过滤活动都由完成的接口决定。

5  Controller动作结果

5.1 调节器动作结果类型(ActionResult)  

万般,在概念叁个措施时,大家常规性地依照办法是或不是有重返值总结为有重返值和无再次来到值两大类,调整器的真面目是类,调整器的action本质是艺术,要是依据数学集结来定义,那么调控器是类的多少个子集,同理,调控器action是办法的三个子集,由此,在商量调控器以至调整器action时,大家是足以才用切磋类和方法的相似思维的。

调节器动作(具体的action)重返的结果叫做调整器动作结果,动作结果是调整器重返给浏览器诉求的原委。ASP.NET MVC框架支持各个规范项目标动作结果。

 (1)承袭ActionResult的动作结果

 图片 2

(2)承袭关系

图片 3

 (3)例子

eg1:ViewResult

图片 4图片 5

 1 //方法1: ViewResult作为返回类型
 2 public ViewResult Index()
 3         {
 4             return View();
 5         }
 6 
 7 
 8 
 9  //方法二: ViewResultBase作为返回类型
10 public ViewResultBase Index()
11         {
12             return View();
13         }
14 
15 //方法三: ActionResult作为返回类型
16 public ActionResult Index()
17         {
18             return View();
19         }

View Code

eg2:EmptyResult

图片 6图片 7

1   // GET: /ControllerDemo/
2         public EmptyResult  Index()
3         {
4             return null;
5         }

View Code

eg3:ContentResult

图片 8图片 9

 1 //方法1:ContentResult作为返回类型
 2 public ContentResult Index()
 3         {
 4              return Content("Hello World");
 5         }
 6 
 7 
 8 //方法2:ActionResult作为返回类型
 9 public ActionResult Index()
10         {
11             return Content("Hello World");
12         }

View Code

 eg4:JsonResult

图片 10图片 11

 1 public JsonResult jsonResult()
 2  2         {
 3  3            TechInfoCompanay jsonCompany=new TechInfoCompanay(){id="S001",CompanyName="信息科技有限公司"};
 4  5             return Json(jsonCompany,JsonRequestBehavior.AllowGet);
 5  6          }
 6  7 
 7  8 
 8  9  //定义一个公司类
 9 10     public class TechInfoCompanay
10 11     {
11 12         public string id { set; get; }
12 13         public string CompanyName { set; get; }
13 14     }

View Code

eg5:RedirectResult

图片 12图片 13

 1 //方法1:RedirectResult作返回类型
 2 public RedirectResult redirectResult()
 3         {
 4             return Redirect("https://www.google.com.hk/");//具体的URL
 5         }
 6 
 7 //方法1: ActionResult作返回类型
 8 public  ActionResult redirectResult()
 9         {
10             return Redirect("https://www.google.com.hk/");//具体的URL
11         }

View Code

eg6:RedirectToRouteResult

图片 14图片 15

1  public ActionResult redirectResult()
2         {
3             return Redirect("https://www.google.com.hk/");//具体的URL
4         }
5 
6         public RedirectToRouteResult redirectToRouteResult()
7         {
8             return RedirectToAction("Index");
9         }

View Code

5.2相似方法

(1)如下只是给出方法样式,不抓牢际代码。

 1 //无返回类型
 2 public  void  functionName(形参)
 3 {
 4      //to add your content
 5 }
 6 
 7 //有返回类型
 8 public  返回类型  functionName(形参)
 9 {
10      //to add your content
11     return   与方法返回类型相匹配的结果;
12 }

(2)例子

eg:举个自定义重回string的主意

RouteConfig.cs

图片 16图片 17

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Web;
 5 using System.Web.Mvc;
 6 using System.Web.Routing;
 7 
 8 namespace MVCControllerDemo
 9 {
10     public class RouteConfig
11     {
12         public static void RegisterRoutes(RouteCollection routes)
13         {
14             routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
15 
16             routes.MapRoute(
17                 name: "Default",
18                 url: "{controller}/{action}/{id}",
19                 defaults: new { Controller = "ControllerDemo", action = "Index", id = UrlParameter.Optional }
20             );
21         }
22     }
23 }

View Code

ControllerDemoController.action

图片 18图片 19

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Web;
 5 using System.Web.Mvc;
 6 
 7 namespace MVCControllerDemo.Controllers
 8 {
 9     public class ControllerDemoController : Controller
10     {
11 
12         public string GeneralFunction()
13         {
14             return "自定义一般方法";
15         }
16     }
17 }

View Code

测验结果

图片 20

6  ViewBag、ViewData和TempData概述

6.1 三者在MVC框架里的概念

在MVC框架中,System.Web.Mvc命名空间下的ControllerBase中,对ViewBag、ViewData和TempData多少个属性的概念如下

ViewBag

图片 21图片 22

 1  [Dynamic]
 2         public object ViewBag
 3         {
 4             [return: Dynamic]
 5             get
 6             {
 7                 Func<ViewDataDictionary> viewDataThunk = null;
 8                 if (this._dynamicViewDataDictionary == null)
 9                 {
10                     if (viewDataThunk == null)
11                     {
12                         viewDataThunk = () => this.ViewData;
13                     }
14                     this._dynamicViewDataDictionary = new DynamicViewDataDictionary(viewDataThunk);
15                 }
16                 return this._dynamicViewDataDictionary;
17             }
18         }

View Code

ViewData

图片 23图片 24

 1 public ViewDataDictionary ViewData
 2         {
 3             get
 4             {
 5                 if (this._viewDataDictionary == null)
 6                 {
 7                     this._viewDataDictionary = new ViewDataDictionary();
 8                 }
 9                 return this._viewDataDictionary;
10             }
11             set
12             {
13                 this._viewDataDictionary = value;
14             }
15         }

View Code

TempData

图片 25图片 26

 1 public TempDataDictionary TempData
 2         {
 3             get
 4             {
 5                 if ((this.ControllerContext != null) && this.ControllerContext.IsChildAction)
 6                 {
 7                     return this.ControllerContext.ParentActionViewContext.TempData;
 8                 }
 9                 if (this._tempDataDictionary == null)
10                 {
11                     this._tempDataDictionary = new TempDataDictionary();
12                 }
13                 return this._tempDataDictionary;
14             }
15             set
16             {
17                 this._tempDataDictionary = value;
18             }
19         }

View Code

6.2 三者相比较

(1)ViewData和TempData属性均重临三个颇负字典结构的多寡容器,即字典类型的key/Value对,ViewBag为Dynamic类型。

三者方法签字为:

1  public TempDataDictionary TempData { get; set; }
2  public ViewDataDictionary ViewData { get; set; }
3  public object ViewBag { [return: Dynamic] get; }

(2)TempData存款和储蓄有时数据,何况安装的变量在被第贰遍读取后会被移除,即TempData设置的变量只可以被读取二回。(why?)

(3)ViewBag和ViewData属性是大器晚成律份数据的两样表现格局,二者的不一样之处在于前面贰个是贰个动态目的,可认为其内定任性属性(动态属性新秀作为数据字典的Key)。

(4)三者均是容器,即能积累常量,变量,也能累积集合。

7  ActionResult解说

 在ASP.NET MVC框架中,对ActionResult定义如下:

 1 // Generated by .NET Reflector from C:UsersWJMdocumentsvisual studio 2013ProjectsDEMOMVCpackagesMicrosoft.AspNet.Mvc.5.0.0libnet45System.Web.Mvc.dll
 2 namespace System.Web.Mvc
 3 {
 4     using System;
 5     
 6     public abstract class ActionResult
 7     {
 8         protected ActionResult()
 9         {
10         }
11         
12         public abstract void ExecuteResult(ControllerContext context);
13     }
14 }

 ActionResult是Action运营后的回传型别,可是当Action回传ActionResult的时候,其实并不带有那几个ActionResult(举例ViewResult)的运作结果,而是含有运维那几个ActionResult时所需的数额,当MvcHandler从Controller取得ActionResult之后才会去运作出ActionResult的结果。在ActionResult抽象类中只是定义了三个ExecuteResult()方法。

ASP.NET 定义了以下三种衍生型别。

图片 27

8  调整器定义

诚如地,在定义Controller时,采取二种方法,即实现IController和继续Controller。

8.1 实现IController

RouteConfig.cs

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Web;
 5 using System.Web.Mvc;
 6 using System.Web.Routing;
 7 
 8 namespace MVCControllerDemo
 9 {
10     public class RouteConfig
11     {
12         public static void RegisterRoutes(RouteCollection routes)
13         {
14             routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
15 
16             routes.MapRoute(
17                 name: "Default",
18                 url: "{controller}/{action}/{id}",
19                 defaults: new { Controller = "ControllerDemo", action = "Index", id = UrlParameter.Optional }
20             );
21         }
22     }
23 }

RouteDemoController

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Web;
 5 using System.Web.Mvc;
 6 
 7 using System.Reflection;
 8 namespace MVCControllerDemo.Controllers
 9 {
10     public class ControllerDemoController : IController
11     {
12         public String Index()
13         {
14             return "<h1>Index</h1>";
15         }
16 
17 
18 
19         public void Execute(System.Web.Routing.RequestContext requestContext)
20         {
21             string action = requestContext.RouteData.Values["action"].ToString();
22             Type typ = typeof(ControllerDemoController);
23             MethodInfo md = typ.GetMethod(action, BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
24             if (md == null)
25             {
26                 requestContext.HttpContext.Response.Write("<h1>404</h1>");
27             }
28             else
29             {
30                 string s = md.Invoke(this, null).ToString();
31                 requestContext.HttpContext.Response.Write(s);
32             }
33         }
34     }
35 }

8.2 继承Controller

这种办法比较常用。

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Web;
 5 using System.Web.Mvc;
 6 
 7 namespace MVCControllerDemo.Controllers
 8 {
 9     public class ControllerDemoController : Controller
10     {
11         //
12         // GET: /ControllerDemo/
13 
14         [HttpGet]
15         public ActionResult Index()
16         {
17             return View();
18         }
19     }
20 }

 

9  仿照效法文献

【01】

【02】

【03】

【04】

【05】Professional Asp.net MVC 5

【06】Professional Asp.net MVC 4

【07】The framework of revelation  of  Professional Asp.net MVC 5

【08】 

10  版权

 

  • 多谢您的翻阅,若有白璧微瑕,款待指教,共同学习、共同提高。
  • 博主网站:
  • 极少一些文章利用读书、参照他事他说加以考察、援用、抄袭、复制和粘贴等各个主意组成而成的,半数以上为原创。
  • 如你爱怜,麻烦推荐一下;如你有新主张,招待建议,邮箱:二〇一五177728@qq.com。
  • 能够转发该博客,但不能不著名博客来源。

本文由永利官网误乐域发布于www.463.com,转载请注明出处:【ASP.NET MVC系列】浅谈ASP.NET MVC 控制器

关键词:

上一篇:MUI开发大全

下一篇:faf

频道精选

最火资讯