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