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

    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. }

    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. }

    动作方法选取器

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

    还有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. }

    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,就会将返回的类转换成字符串输出;

    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. }

    当为中文名时需要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. }

    如果一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. }

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

    9)、RedirectToRoute,

    a、辅助方法RedirectToAction

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

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

    转到指定Controller的指定Action中

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

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

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

    b、辅助方法RedirectToRoute

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

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

    转到指定Controller的指定Action中

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

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

    C#代码  
    1. public ActionResult REdirectToActionSample(){
    2. return RedirectToRoute(new {controller="Member",action="List",page=3});
    3. }
  • 相关阅读:
    C# 实现 Snowflake算法生成唯一性Id
    kafka可视化客户端工具(Kafka Tool)的基本使用(转)
    docker 安装kafka
    Model类代码生成器
    使用docker 部署rabbitmq 镜像
    Vue 增删改查 demo
    git 提交代码到库
    Android ble蓝牙问题
    mac 配置 ssh 到git (Could not resolve hostname github.com, Failed to connect to github.com port 443 Operation timed out)
    okhttp
  • 原文地址:https://www.cnblogs.com/sylone/p/6094648.html
Copyright © 2011-2022 走看看