• 返璞归真 asp.net mvc (7) asp.net mvc 3.0 新特性之 Controller


    [索引页]
    [源码下载]


    返璞归真 asp.net mvc (7) - asp.net mvc 3.0 新特性之 Controller



    作者:webabcd


    介绍
    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>


    OK
    [源码下载] 

  • 相关阅读:
    【Codeforces 776B】Sherlock and his girlfriend
    BZOJ4942 NOI2017整数(线段树)
    BZOJ4516 SDOI2016生成魔咒(后缀数组+平衡树)
    BZOJ4943 NOI2017蚯蚓排队(哈希+链表)
    Codeforces Round#500 Div.2 翻车记
    BZOJ5093 图的价值(NTT+斯特林数)
    BZOJ2821 作诗(分块)
    BZOJ2724 [Violet]蒲公英(分块)
    BZOJ2001 HNOI2010城市建设(线段树分治+LCT)
    BZOJ1093 ZJOI2007最大半连通子图(缩点+dp)
  • 原文地址:https://www.cnblogs.com/webabcd/p/2043973.html
Copyright © 2020-2023  润新知