文章出處

延續MVC4.0 實現單一Action返回多種結果,我們實現了在一個Action中根據前臺請求方式的不同和請求內容的不同返回了多個結果,但是這種返回多個結果的業務邏輯并不通用。如果現在年紀Action也要實現這樣的業務邏輯,怎么辦?除了復制代碼,索性MVC為我們提供了完美的機制,在多個控制器上重用統一的業務邏輯規則:IActionFilter攔截器。

1.定義一個多響應Result攔截器MultipleResponseResultFilter

    /// <summary>
    /// 多響應Result攔截器
    /// </summary>
    public class MultipleResponseResultFilter : FilterAttribute, IActionFilter
    {
        public string PartialViewName { get; set; }

        /// <summary>
        /// Action執行后
        /// </summary>
        void IActionFilter.OnActionExecuted(ActionExecutedContext filterContext)
        {
            var request = filterContext.HttpContext.Request;
            var viewResult = filterContext.Result as ViewResult;

            if (viewResult == null)
                return;

            if (request.IsPartialRequest())
            {
                filterContext.Result = new PartialViewResult
                {
                    TempData = viewResult.TempData,
                    ViewData = viewResult.ViewData,
                    ViewName = PartialViewName,
                };
            }

            if (request.IsJsonRequest())
            {
                filterContext.Result = new JsonResult
                {
                    Data = viewResult.Model,
                };
            }
        }

        /// <summary>
        /// Action執行前
        /// </summary>
        void IActionFilter.OnActionExecuting(ActionExecutingContext filterContext)
        {

        }
    }

 2.Action調用實現(局部視圖PartialViewName為必須值)

        [MultipleResponseResultFilter(PartialViewName="PartialStudent")]
        public ActionResult Student()
        {
            return View(new { Name = "小明", Sex = "女" });
        }

 3.Html調用代碼如下:

<body>
    <h3>view視圖</h3>
    <div>我是小明</div>

    <h3>PartialView視圖:</h3>
    <div id="partial"></div>

    <h3>Json數據:</h3>
    <div id="json"></div>

    <script src="~/Content/js/jquery-1.10.2.min.js"></script>

    <script type="text/javascript">
        $(function () {
            $('#partial').load('@Url.Action("Student", "Home", new { area=string.Empty, format="partial" })');

            $.post('@Url.Action("Student", "Home")', { format: 'json' }, function (res) {
                if (res) {
                    $('#json').html(res.Name);
                }
            }, 'json')
        })
    </script>
</body>

 


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()