• 黑色平底锅   2014/7/31 13:09:00
  • ASP.NET MVC3.0中的 Controller
  • 关键字: MVC 控制器 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)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    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>

    标记为 ChildActionOnly 的 Action 支持 OutputCache
    ControllerDemoController.cs

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    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 中
     -->

    新增了 ViewBag
    ControllerDemoController.cs
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    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

    新增的 Action Result

    <p>
        Controller 中新增了一些 Action Result: HttpNotFoundResult, HttpRedirectResult, HttpStatusCodeResult
    </p>