zoukankan      html  css  js  c++  java
  • mvc Controller类介绍 dodo

    1、Controller类

    i、Controller必须为公开类;

    ii、必须以Controller结尾;

    iii、继承Controller基类或实现IController接口的类;

    iv、类中必须包含数个返回值为ActionResult的公开方法,这些方法在MVC中称为Action;

    2、Controller执行过程:

    Controller被MvcHandler选中之后,下一步就是通过ActionInvoker选取适当的Action来执行,在Controller中,每一个Action可以定义零到多个参数,ActionInvoker会依据当前的RouteValue及客户端传来的信息准备可以输入Action参数的数据,最后正式调用被Controller选中的那个Action方法【参数输入的内容是通过模型绑定(Model Binding)机制从RequestContext属性中获取数据,并将数据对应或输入到方法的参数中的。】Action执行完后的返回值通常是ActionResult类(其子类有ViewResult用于返回一个View、RedirectResult用于将网页转到其他地址、ContentResult用于返回一段文字内容、FileResult用于返回一个二进制文件),Controller得到ActionResult类之后,就会开始执行ActionResult类的ExecuteResult()方法,并将执行结果返回客户端,这时Controller任务ok。

    3、在Controller执行时还有一个动作过滤器(Action Filter)机制,分为4类:

    授权过滤器(Authorization Filter)

    动作过滤器(Action Filter)

    结果过滤器(Result Filter)

    例外过滤器(Exception Filter)

    如果ActionInvoker找不到对应的Action可用,默认会执行System.Web.Mvc.Controller类的HandleUnknownAction()方法,在该类中,HandleUnknownAction方法默认会响应“HTTP404找不到资源”的错误信息。

    C#代码 复制代码 收藏代码
    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Web;
    5. using System.Web.Mvc;
    6. namespace MvcDemo.Controllers
    7. {
    8. [HandleError]
    9. public class HomeController : Controller
    10. {
    11. public ActionResult Index()
    12. {
    13. ViewData["Message"] = "欢迎使用 ASP.NET MVC!";
    14. return View();
    15. }
    16. public ActionResult About()
    17. {
    18. return View();
    19. }
    20. }
    21. }
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Mvc;
    
    namespace MvcDemo.Controllers
    {
        [HandleError]
        public class HomeController : Controller
        {
            public ActionResult Index()
            {
                ViewData["Message"] = "欢迎使用 ASP.NET MVC!";
                return View();
            }
            public ActionResult About()
            {
                return View();
            }
        }
    }
    

    ViewData表示一个Dictionary对象,可以在View中读取该对象被设定的数据(<%:ViewData["Message"] %>或使用<%=Html.Encode(ViewData["Message"] )%>)。

    View()方法是来自于Controller基类里的一个辅助方法,返回ViewResult继承ActionResult,如果没有View中没有参数,则返回此Action方法名的页面View的第一个参数就是要传给View使用的Model数据,其类型不能为string,否则会被当成视图名称来处理。

    动作名称选取器:

    C#代码 复制代码 收藏代码
    1. public class HomeController:Controller{
    2. //要求的网址:http://localhost/Home/Index
    3. //返回的是/Views/Home/Index.aspx
    4. public ActionResult Index(){
    5. return view();
    6. }
    7. }
    8. public class HomeController:Controller{
    9. //要求的网址:http://localhost/Home/Default
    10. //返回的是/Views/Home/Default.aspx
    11. [ActionName("Default")]
    12. public ActionResult Index(){
    13. return view();
    14. }
    15. }
    public class HomeController:Controller{
    	//要求的网址:http://localhost/Home/Index	
    	//返回的是/Views/Home/Index.aspx	
    	public ActionResult Index(){
    		return view();
    	}
    }
    public class HomeController:Controller{
    	//要求的网址:http://localhost/Home/Default	
    	//返回的是/Views/Home/Default.aspx
    	[ActionName("Default")]	
    	public ActionResult Index(){
    		return view();
    	}
    }
    

    动作方法选取器

    C#代码 复制代码 收藏代码
    1. [NonAction]
    2. public ActionResult Index(){
    3. reurn view();
    4. }
    5. private ActionResult Index(){
    6. reurn view();
    7. }
    [NonAction]
    public ActionResult Index(){
    	reurn view();
    }
    private ActionResult Index(){
    	reurn view();
    }
    

    还有HttpGet、HttpPost、HttpDelete、HttpPut属性,一根用于Action同名时,一个用来显示,一个用来操作。由于HTML窗口无法送出“Delete”这个HTTP动词,所以如果希望Action能提供像REST协议那样的方式来处理删除动作,又能通过同一个窗口使用这个只允许“Delete”的动作的话,可以使用Html.HttpMethodOverride()方法的HTML辅助方法来模拟HTTP DELETE方法的行为,但实际上窗口还是以HTTP POST的方式送出的。

    ActionResult:

    说明:

    1)、在ViewResult中的参数指定页面名称和应用的主版页面(MasterPage)名称,而页面的Page声明中也包含了MasterPageFile属性,则会以Action中的MasterPage为主。

    2)、在PartialViewResult类中,功能与ViewResult类类似,但它无法为View赋值MasterPage,通常用在前端为Ajax应用程序的情况下,并可以通过Ajax来取得网页中的部分内容。

    3)、EmptyResult,有些Action在执行后其实不需要返回任何数据,例如一个页面执行完成后直接转到其他页面,EmptyResult类不会执行任何响应客户端的程序,所以也不会返回任何数据。

    C#代码 复制代码 收藏代码
    1. public ActionResult Empty(){
    2. return new EmptyResutl();
    3. }
    4. public viod Empty(){
    5. return;
    6. }
    public ActionResult Empty(){
    	return new EmptyResutl();
    }
    或
    public viod Empty(){
    	return;
    }
    

    4)、ContentResult类可以响应文字内容的结果,并且可以响应任意指定文字内容、Content-Type和文字编码。

    C#代码 复制代码 收藏代码
    1. public ActionResult Content(){
    2. string strHTML="";
    3. return Content(strHTML);
    4. }
    5. public string Content(){
    6. string strHTML="";
    7. retrun strHTML;
    8. }
    9. //说明,在MVC中只要Action返回的不是ActionResult,就会将返回的类转换成字符串输出;
    public ActionResult Content(){
    	string strHTML="";
    	return Content(strHTML);
    }
    或
    public string Content(){
    	string strHTML="";
    	retrun strHTML;
    }
    //说明,在MVC中只要Action返回的不是ActionResult,就会将返回的类转换成字符串输出;
    

    5)、FileResult,可以响应任意的文件内容,包括二进制格式的数据,例如图像文件、PDF文档、zip文件,你可以输入byte数组、文件路径、Stream数据、Content-Type、下载文件名等参数并将返回客户端。其三个子类:

    FilePathResult:响应一个实体文件

    FileContentResult:响应一个byte数组的内容

    FileStreamResult:响应一个Stream数据

    C#代码 复制代码 收藏代码
    1. public ActionResult GetFile(){
    2. byte[] fileContent = GetFileByteArrayFromDB();
    3. return File(fileContent,"application/pdf","YourReport.pdf");
    4. }
    public ActionResult GetFile(){
    	byte[] fileContent = GetFileByteArrayFromDB();
    	return File(fileContent,"application/pdf","YourReport.pdf");
    }
    

    当为中文名时需要Server.UrlPathEncode()方法进行编码

    6)、JavaScriptResult类的用途是将JavaScript程序代码响应给浏览器,

    7)、JsonResult类可以自动将任意对象的数据序列转换成JSON格式返回,JsonResult类使用JavaScriptSerializer实例完成JSON序列化的操作,但如果你的对象无法序列化,这个过程就会发生意外,在使用JsonResult从MVC2.0开始为了避免JSON Hijacking攻击,设置在默认的情况下,任何以JsonResult类返回的请求都不允许GET方法从中获取任何JSON数据。

    C#代码 复制代码 收藏代码
    1. public ActionResult JSON(){
    2. return Json(new {id=1;name="will"});
    3. }
    public ActionResult JSON(){
    	return Json(new {id=1;name="will"});
    }
    

    如果一HTTPPOST方法取得的内容应该会是:{"id":1,"name":"will"}但是使用HTTPGET则获取不到,并且报错,但是如果单纯只使用Get方法则数据无法被浏览器缓存,所以可以通过以下方式让get方式可以获取Json数据

    C#代码 复制代码 收藏代码
    1. public ActionResult JSON(){
    2. return Json(new {id=1;name="will"},JsonRequestBehavior.AllowGet);
    3. }
    public ActionResult JSON(){
    	return Json(new {id=1;name="will"},JsonRequestBehavior.AllowGet);
    }
    

    8)、RedirectResult主要用途是执行指向其他页面的重定向

    9)、RedirectToRoute,

    a、辅助方法RedirectToAction

    转到同一个Controller中的另一个Action

    C#代码 复制代码 收藏代码
    1. public ActionResult REdirectToActionSample(){
    2. return RedirectToAction("SamplePage");
    3. }
    public ActionResult REdirectToActionSample(){
    		return RedirectToAction("SamplePage");
    	}
    

    转到指定Controller的指定Action中

    C#代码 复制代码 收藏代码
    1. public ActionResult REdirectToActionSample(){
    2. return RedirectToAction("List","Member");
    3. }
    public ActionResult REdirectToActionSample(){
    		return RedirectToAction("List","Member");
    	}
    

    转到MemberController的List Action,并且加上page这个RouteValue值

    C#代码 复制代码 收藏代码
    1. public ActionResult REdirectToActionSample(){
    2. return RedirectToAction("List","Member",new {page=3});
    3. }
    public ActionResult REdirectToActionSample(){
    		return RedirectToAction("List","Member",new {page=3});
    	}
    

    b、辅助方法RedirectToRoute

    转到同一个Controller中的另一个Action

    C#代码 复制代码 收藏代码
    1. public ActionResult REdirectToActionSample(){
    2. return RedirectToRoute(new {action ="SamplePage"});
    3. }
    public ActionResult REdirectToActionSample(){
    		return RedirectToRoute(new {action ="SamplePage"});
    	}
    

    转到指定Controller的指定Action中

    C#代码 复制代码 收藏代码
    1. public ActionResult REdirectToActionSample(){
    2. return RedirectToRoute(new {controller="Member",action="List"});
    3. }
    public ActionResult REdirectToActionSample(){
    		return RedirectToRoute(new {controller="Member",action="List"});
    	}
    

    转到MemberController的List Action,并且加上page这个RouteValue值

    C#代码 复制代码 收藏代码
    1. public ActionResult REdirectToActionSample(){
    2. return RedirectToRoute(new {controller="Member",action="List",page=3});
    3. }
    public ActionResult REdirectToActionSample(){
    		return RedirectToRoute(new {controller="Member",action="List",page=3});
    	}

    ViewData与TempData:

    在Action中利用ControllerBase类中的ViewData属性存储临时数据,好让这些数据能在View中被使用。

    ViewData属性是一个ViewDatDictionary类,可用于存储任意对象的数据,但存储的键值必须为字符串

    ViewData有一个特性,就是它只会存在与当前的HTTP请求中,而不像Session一样可以将数据带到下一个HTTP请求

    TempData:

    其数据结构与ViewData一样,都属于字典类

    他的内部是用Sessioin来存储数据的,并且他的数据存储的时间为“1次网页请求”

    MVC1中当TempData在Action中被设定后,默认一定会保留至下一个网页请求,且要在持续的Action中被执行并读取后,该TempData才会被清除。

    Mvc2中只有在将RedirectResult类或RedirectToRouteResult类当成ActionResult时,才会强制保留TempData,除此之外,只要存在参考TempData的键值,默认就会在当次页面请求中将TempData清除。但如果只设定了TempData的值而没有读取的行为,TempData还是会保留到下一个页面中执行。

    过滤器:

    使用时机

    实现方法

    授权过滤器(Authorization Filter)

    在执行任何Filter或Action之前被执行,用于进行身份验证;

    IauthorizationFilter

    AuthorizeAttribute

    动作过滤器

    (Action Filter)

    在执行Action之前或之后被执行,用于执行的Action需要生成记录或者缓存数据时;

    IActionFilter

    ActionFilterAttribute

    结果过滤器

    (Result Filter)

    在执行ActionResult的前后被执行,在View被显示到浏览器之前可以执行一些逻辑运算,或修改ViewResult的输出结果;

    IResultFilter

    ActionFilterAttribute

    异常过滤器(Exception Filter)

    在Action执行之前后之后或者Result执行之前或之后被执行。在执行中发生异常时,可以使用此Filter指向其他页面来显示错误信息

    IExceptionFilter

    IExceptionFilter

    1、动作过滤器一律使用属性Attribute的方式应用在Action之上,如可以设置只有此人可以调用此Action

    C#代码 复制代码 收藏代码
    1. [Attribute(Roles="Admin")]
    2. public ActionResult Edit(){}
    [Attribute(Roles="Admin")]
    public ActionResult Edit(){}
    

    动作过滤器可以应用在Action上,也可以应用在Controller上。动作过滤器提供了两个事件在Action的前后执行,分别是OnActionExecuting与OnActionExecuted。如果属性类要实现IActionFilter接口,就会被要求必须实现这两个方法。

    AsyncTimeout属性可让你设定异步控制器的逾时毫秒数,

    NoAsyncTimeout设置Action的执行是否可以有逾期时间

    2、授权过滤器,

    C#代码 复制代码 收藏代码
    1. [Authorize(Roles="Admin")]
    2. public ActionResult Edit(){}
    [Authorize(Roles="Admin")]
    public ActionResult Edit(){}
    

    在web.config文件的system.web类的设定中有一个Authentication设定,其中的forms部分有一个LoginUrl属性可设定当权限不足时应该转向的地址

    Xml代码 复制代码 收藏代码
    1. <Authentication mode="Forms">
    2. <forms loginUrl="~/account/Logon" timeout="2880"/>
    3. </Authentication>
    <Authentication mode="Forms">
    	<forms loginUrl="~/account/Logon" timeout="2880"/>
    </Authentication>
    

    其他属性:

    ChildActionOnly,通过ReaderAction()方法执行的Action不被其他HTTP GET方法或HTTP POST方法执行的话,就可以使用此属性

    RequireHttps,可以让此Action仅能显示在HTTPs安全登录的状态下,如果客户端使用HTTP连接,该Action会自动转向同一个Action的HTTPs地址。如果使用HTTP POST方法发布应用RequestHttps属性的页面,将会引发InvalidOperationException异常。

    ValidateInput,.NET框架默认会验证所有通过窗口传入的数据,并检查其中是否含有恶意的标签或程序代码,当需要通过网页输入HTML标签时,就必须手动关闭此验证。在Forms程序时,可以在web.config文件中"<page validateRequest="false">"以关闭全站的输入验证机制。也可以在页面的最上方设定"ValidateRequest='false'"来实现此功能。但是在MVC中这两种方式都没有作用,而是要在Action上通过设定ValidateInput属性来关闭输入验证机制。

    ValidateAntiForgeryToken,验证来源是否为相同网站。

    3、结果过滤器

    提供的两个事件会在执行视图的前后执行,这两个事件分别是OnResultExcuting与OnResultExcute,如果属性类要实现IResultFilter接口,就会被要求必须实现这两个方法。

    OutputCache是实现输出缓存机制。

    4、异常过滤器

    异常过滤提供了一个事件,会在执行完Action与ActionResult之后才执行,在实现IExceptionFilter接口后,必须实现OnException方法才能使用该接口。异常过滤器内置了一个HandlerError属性。用来处理MVC执行过程中发生的异常。

  • 相关阅读:
    类和对象代码练习1
    搬迁MSSQL出现的问题
    QQ群空间是我见过最烂的系统
    导出表数据脚本的存储过程 [转自CSDN]
    plesk for Linux 没有默认首页的优先级别设置
    传说中的otag开源是假的。BS!!!!!
    FTP关闭mput上传确认
    刚装的vs2008不能生成silverlight,郁闷中
    怎么查域名反向解析是否成功
    现在的黑客太有才了。。。/不喜欢开防火墙的要小心
  • 原文地址:https://www.cnblogs.com/zgqys1980/p/2642670.html
Copyright © 2011-2022 走看看