• ASP.NET MVC 3.0 Controller基础


    ASP.NET MVC 3.0 Controller基础

     

      1、Controller类与方法

      Controller(控制器)是ASP.NET MVC的核心,负责处理浏览器请求,并作出响应。Cotroller本身是一个类(Class),该类有多个方法(Method)。在这些方法中,只要是公开方法,该方法将被视为一个动作(Action);只要有动作存在,就可以通过该动作方法接收网页请求并决定应响应的视图。

      Controller的基本要求:

    •  Controller必须是公共(Public)类;
    •    Controller的名称必须以“Controller”结尾;
    •    必须继承ASP.NET MVC的Controller类,或继承实现IController接口的自定义类,或自身实现IController接口;
    •    所以方法必须为公共(Public)方法。该方法可以没有参数,也可以有多个参数。

      2、Action名称选择器

      当通过ActionInvoker选取Controller中的公共方法时,默认会用Reflection方式取得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 Northwind.Controllers
     8 {
     9     public class HomeController : Controller
    10     {
    11         /// <summary>
    12         /// http://localhost/Home/Index
    13         /// </summary>
    14         public ActionResult Index()
    15         {
    16             return View();
    17         }
    18     }
    19 }
    复制代码

      可以通过在Action上使用ActionName属性(Attribute)来指定Action,这就是动作名称选择器(Action Name Selector)。

    复制代码
     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Web;
     5 using System.Web.Mvc;
     6 
     7 namespace Northwind.Controllers
     8 {
     9     public class HomeController : Controller
    10     {
    11         /// <summary>
    12         /// http://localhost/Home/Default
    13         /// </summary>
    14         [ActionName("Default")]
    15         public ActionResult Index()
    16         {
    17             return View();
    18         }
    19     }
    20 }
    复制代码

      3、动作方法选择器
      在通过ActionInvoker选取Controller中的公共方法是,ASP.NET MVC还提供了一个特性,动作方法选择器(Action Method Selector),以帮助ActionInvoker选择适当的Action。

      3.1、 NonAction属性

      若将NonAction属性应用在Controller中的Action方法上,即使该Action方法是公共方法,也会告知ActionInvoker不要选取这个Action来执行。这个属性主要用来保护Controller中的特定公共方法不会发布到Web上。或是当功能尚未开发完成就要进行部署时,若暂时不想将此方法删除,也可以使用这个属性。

    复制代码
     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Web;
     5 using System.Web.Mvc;
     6 
     7 namespace Northwind.Controllers
     8 {
     9     public class HomeController : Controller
    10     {
    11         [NonAction]
    12         public ActionResult Index()
    13         {
    14             return View();
    15         }
    16     }
    17 }
    复制代码

      将Action方法的“public”改成“private”,也可以达到同样的目的。

    复制代码
     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Web;
     5 using System.Web.Mvc;
     6 
     7 namespace Northwind.Controllers
     8 {
     9     public class HomeController : Controller
    10     {
    11         private ActionResult Index()
    12         {
    13             return View();
    14         }
    15     }
    16 }
    复制代码

      3.2、HttpGet属性、HttpPost属性、HttpDelete属性和HttpInput属性
      HttpGet、HttpPost、HttpDelete、HttpInput属性是动作方法选取器的一部分,这些属性常用在需要接收窗口数据的时候。如:创建两个同名的Action,一个应用[HttpGet]属性来显示窗口HTML,另一个应用[HttpPost]属性来接收窗口发送的值。

    复制代码
     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Web;
     5 using System.Web.Mvc;
     6 
     7 namespace Northwind.Controllers
     8 {
     9     public class HomeController : Controller
    10     {
    11         [HttpGet]
    12         public ActionResult Create()
    13         {
    14             return View();
    15         }
    16 
    17         [HttpPost]
    18         public ActionResult Create(Product product)
    19         {
    20             //UpdateModel(product);
    21             return RedirectToAction("Index");
    22         }
    23     }
    24 }
    复制代码

      4、ActionResult类
      ActionResult类是Action执行的结果,但ActionResult中并不包含执行结果,而是包含执行响应时所需要的信息。当Action返回ActionResult类之后,会由ASP.NET MVC执行。

      ASP.NET MVC定义的ActionResult如下表所示:

    Controller辅助方法用途
    ContentResult Content 返回一段用户自定义的文字内容
    EmptyResult   不返回任何数据,即不响应任何数据
    JsonResult Json 将数据序列转化成JSON格式返回
    RedirectResult Redirect 重定向到指定的URL
    RedirectToRouteResult RedirectToAction、RedirectToRoute 重定向到Action或Route
    ViewResult View 使用IViewInstance接口和IViewEngine接口,实际输出的数据是IViewEngine接口和View
    PartialViewResult PartialView 与ViewResult类相似,返回的是“部分显示”
    FileResult File 以二进制串流的方式返回一个文件数据
    JavaScriptResult JavaScript 返回JavaScript指令码

      4.1、ViewResult

      ViewResult类是在ASP.NET MVC中最常用的ActionResult类,用于返回一个标准的视图。通过Controller辅助方法,可以定义输出的View名称。

      a>、返回默认的页面

      返回的默认页面与Action的名称相同

    复制代码
     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Web;
     5 using System.Web.Mvc;
     6 
     7 namespace Northwind.Web.Controllers
     8 {
     9     public class HomeController : Controller
    10     {
    11         public ActionResult Index()
    12         {
    13             return View();
    14         }
    15     }
    16 }
    复制代码

      b>、指定页面名称的响应

    复制代码
     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Web;
     5 using System.Web.Mvc;
     6 
     7 namespace Northwind.Web.Controllers
     8 {
     9     public class HomeController : Controller
    10     {
    11         public ActionResult Index()
    12         {
    13             return View("Default");
    14         }
    15     }
    16 }
    复制代码

      c>、指定的页面不存在

    复制代码
     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Web;
     5 using System.Web.Mvc;
     6 
     7 namespace Northwind.Web.Controllers
     8 {
     9     public class HomeController : Controller
    10     {
    11         public ActionResult Index()
    12         {
    13             return View("NotExists");
    14         }
    15     }
    16 }
    复制代码

      当在Views目录下找不到页面时,出现下面的提示信息。

      4.2、PartialViewResult

      PartialViewResult与ViewResult非常相似,通过用在前端为Ajax应用程序的情况下,并可以通过Ajax来取得网页中的部分内容。

    public ActionResult About()
    {
        return PartialView();
    }

      4.3、EmptyResult

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

    复制代码
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Mvc;
    
    namespace Northwind.Web.Controllers
    {
        public class HomeController : Controller
        {
            public ActionResult Empty()
            {
                return new EmptyResult();
            }
        }
    }
    复制代码

    复制代码
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Mvc;
    
    namespace Northwind.Web.Controllers
    {
        public class HomeController : Controller
        {
            public void Empty()
            {
                return;
            }
        }
    }
    复制代码

      使用EmptyResult与Response.RedirectPermanent()进行HTTP301跳转

    复制代码
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Mvc;
    
    namespace Northwind.Web.Controllers
    {
        public class HomeController : Controller
        {
            public void Redirect()
            {
                Response.RedirectPermanent("/Home/Index");
            }
        }
    }
    复制代码

      4.4、ContentResult

      ContentResult类可以响应文字内容的结果。可以让ContentResult类响应任意指定文字内容、Content-Type和文字编码(Encoding)。

      示例响应一段XML文字,并设定响应的Content-Type为text/xml,文本编码格式为Encoding.UTF8.

    复制代码
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Mvc;
    
    namespace Northwind.Web.Controllers
    {
        public class HomeController : Controller
        {
            public ActionResult Content()
            {
                return Content("<root><text>123</text></root>", "text/xml", System.Text.Encoding.UTF8);
            }
        }
    }
    复制代码

      响应HTML字符串

    复制代码
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Mvc;
    
    namespace Northwind.Web.Controllers
    {
        public class HomeController : Controller
        {
            public ActionResult Content()
            {
                string strHTML = "<h1>123</h1>";
                return Content(strHTML);
            }
        }
    }
    复制代码

      ASP.NET MVC会进行判断,只要Action返回的不是ActionResult类,就会将返回的类转换成字符串输出。

    复制代码
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Mvc;
    
    namespace Northwind.Web.Controllers
    {
        public class HomeController : Controller
        {
            public string Content()
            {
                string strHTML = "<h1>123</h1>";
                return strHTML;
            }
        }
    }
    复制代码

      6.5、FileResult

  • 相关阅读:
    四校联考【20171001】
    C语言基础知识
    页表和TLB
    python
    Cache组织方式
    On the Spectre and Meltdown Processor Security Vulnerabilities
    latex-组织文本
    深入理解计算机系统
    深入理解计算机系统-计算机系统漫游
    逻辑地址到物理地址的转换
  • 原文地址:https://www.cnblogs.com/Alex80/p/4487715.html
Copyright © 2020-2023  润新知