asp.net mvc 3.0 新特性之 Controller
介绍
asp.net mvc 之 asp.net mvc 3.0 新特性之 Controller:
- Global Action Filter
- 可以在标记为 ChildActionOnly 的 Action 上使用 OutputCache
- ViewBag
- 新增了一些 Action Result
示例
1、Global Action Filter 的 Demo
Global.asax.cs(注册全局的 Action Filter)
protected void Application_Start() |
{ |
AreaRegistration.RegisterAllAreas(); |
RegisterRoutes(RouteTable.Routes); |
|
/* |
* 演示 Global Action Filter |
*/ |
|
// 实例化一个 Filter |
var handleError = new HandleErrorAttribute(); |
// 指定 HandleErrorAttribute 的 View |
handleError.View = "Error2"; |
// Order 属性的默认值为:-1,即不会被应用,所以这里要修改一下 |
handleError.Order = 0; |
|
// 将 Filter 对象添加到全局 Filters 集合中 |
GlobalFilters.Filters.Add(handleError); |
} |
Web.config
<system.web> |
|
<!-- |
如果需要启用 HandleError ,那么要在 web.config 中做如下配置:<customErrors mode="On" /> |
--> |
<customErrors mode="On" /> |
|
</system.web> |
ControllerDemoController.cs
using System; |
using System.Collections.Generic; |
using System.Linq; |
using System.Web; |
using System.Web.Mvc; |
|
namespace MVC30.Controllers |
{ |
public class ControllerDemoController : Controller |
{ |
// 用于演示 Global Action Filter |
public ActionResult GlobalActionFilter() |
{ |
throw new Exception("exception"); |
} |
} |
} |
GlobalActionFilter.cshtml(访问此页会抛出异常,然后跳转到Error2)
@{ |
ViewBag.Title = "Global Action Filter"; |
} |
|
<h2>GlobalActionFilter</h2> |
Error2.cshtml(自定义错误页)
@{ |
Layout = null; |
} |
|
<!DOCTYPE html> |
<html> |
<head> |
<title>Error</title> |
</head> |
<body> |
<!-- |
HTTP 返回 500 时,页面必须输出足够多的信息才会显示,否则只会显示 IE 的 HTTP 500 默认页 |
--> |
<h2> |
Sorry, an error occurred while processing your request |
</h2> |
<h2> |
Sorry, an error occurred while processing your request |
</h2> |
<h2> |
Sorry, an error occurred while processing your request |
</h2> |
<h2> |
Sorry, an error occurred while processing your request |
</h2> |
<h2> |
Sorry, an error occurred while processing your request |
</h2> |
</body> |
</html> |
2、标记为 ChildActionOnly 的 Action 支持 OutputCache
ControllerDemoController.cs
using System; |
using System.Collections.Generic; |
using System.Linq; |
using System.Web; |
using System.Web.Mvc; |
|
namespace MVC30.Controllers |
{ |
public class ControllerDemoController : Controller |
{ |
public ActionResult ChildActionOnlyDemo() |
{ |
return View(); |
} |
|
// ChildActionOnly - 指定 Action 只能让 RenderAction 调用 |
// OutputCache() - 缓存。Duration - 缓存秒数。VaryByParam - none, *, 多个参数用逗号隔开。也可以通过配置文件对缓存做设置 |
[ChildActionOnly] |
[OutputCache(Duration = 5)] |
public PartialViewResult _GetCurrentTime() |
{ |
var currentTime = DateTime.Now; |
|
return PartialView(currentTime); |
} |
} |
} |
_GetCurrentTime.cshtml
@* |
通过 @model 指定 Model 的类型,同时 Model 对象就是 Action 返回的数据 |
*@ |
|
@model DateTime |
|
<div> |
currentTime: @Model.ToString("yyyy-MM-dd HH:mm:ss") |
</div> |
ChildActionOnlyDemo.cshtml
@{ |
ViewBag.Title = "可以在标记为 ChildActionOnly 的 Action 上使用 OutputCache"; |
} |
|
<h2>ChildActionOnlyDemo</h2> |
|
<div> |
@{ Html.RenderAction("_GetCurrentTime"); } |
<!-- |
<% Html.RenderAction("_GetCurrentTime"); %> |
--> |
</div> |
|
<div> |
@Html.Action("_GetCurrentTime") |
<!-- |
<%= Html.Action("_GetCurrentTime") %> |
--> |
</div> |
|
<!-- |
Html.Action 与 Html.RenderAction 的区别: |
Html.Action - 直接将 Action 的结果作为一个字符串输出 |
Html.RenderAction - 将 Action 作为一个用户控件嵌入到当前的 HttpContext 中 |
--> |
3、 新增了 ViewBag
ControllerDemoController.cs
using System; |
using System.Collections.Generic; |
using System.Linq; |
using System.Web; |
using System.Web.Mvc; |
|
namespace MVC30.Controllers |
{ |
public class ControllerDemoController : Controller |
{ |
// 用于 ViewBagDemo |
public ActionResult ViewBagDemo() |
{ |
// ViewBag 的本质就是把 ViewData 包装成为 dynamic 类型 |
ViewBag.Message = "ViewBag 的 Demo"; |
|
return View(); |
} |
} |
} |
ViewBagDemo.cshtml
@{ |
ViewBag.Title = "ViewBag"; |
} |
|
<h2>ViewBag</h2> |
|
Message: @ViewBag.Message |
4、 新增的 Action Result
<p> |
Controller 中新增了一些 Action Result: HttpNotFoundResult, HttpRedirectResult, HttpStatusCodeResult |
</p> |

浙公网安备 33010602011771号