爱上MVC3~在控制器或Action上动态设定模板页(Layout)

简介:

很多境况下,我们需要设置自己模块的layout,即它的布局页面,在MVC2中叫它模板页面,你可以在return view方法时设置它,当然,这不是一种好方法,因为我不想每个action都去设置一次,因为我们的controller一般指一个模块,而一个模块下的action,它们的layout基本是相同的,所以,有没有一种方法,在controller级别来实现这个呢,呵呵,当然有,那就是attribute特性,我们在MVC环境下,有一个ActionFilterAttribute,这个想毕大家都听说过,它记录了页面在渲染前与渲染后的状态,这个特性(或者叫它过滤器)的代码如下:

 // 摘要:
    //     Represents the base class for filter attributes.
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)]
    public abstract class ActionFilterAttribute : FilterAttribute, IActionFilter, IResultFilter
    {
        // 摘要:
        //     Initializes a new instance of the System.Web.Mvc.ActionFilterAttribute class.
        protected ActionFilterAttribute();

        // 摘要:
        //     Called by the ASP.NET MVC framework after the action method executes.
        //
        // 参数:
        //   filterContext:
        //     The filter context.
        public virtual void OnActionExecuted(ActionExecutedContext filterContext);
        //
        // 摘要:
        //     Called by the ASP.NET MVC framework before the action method executes.
        //
        // 参数:
        //   filterContext:
        //     The filter context.
        public virtual void OnActionExecuting(ActionExecutingContext filterContext);
        //
        // 摘要:
        //     Called by the ASP.NET MVC framework after the action result executes.
        //
        // 参数:
        //   filterContext:
        //     The filter context.
        public virtual void OnResultExecuted(ResultExecutedContext filterContext);
        //
        // 摘要:
        //     Called by the ASP.NET MVC framework before the action result executes.
        //
        // 参数:
        //   filterContext:
        //     The filter context.
        public virtual void OnResultExecuting(ResultExecutingContext filterContext);
    }

OnActionExecutedOnActionExecutingOnResultExecutedOnResultExecuting它们记录一个action从加载到页面最终显示在浏览器上的全过程,这个东西我们一般用在页面权限验证,layout页面控制上,它们的执行次序是:
OnActionExecuting  action执行前
OnActionExecuted action执行后
OnResultExecuting 页面渲染前
显示页面的内容
OnResultExecuted 页面渲染结果
如图所示

我们通过ActionFilterAttribute的特性,写个派生类,然后去覆写它的OnActionExecuted方法,将layout页面修改(注意是修改,因为在action执行之后layout已经是默认的布局页了)

代码如下:

 /// <summary>
    /// 自定义模板页面
    /// </summary>
    public class LayoutAttribute : ActionFilterAttribute
    {
        private readonly string _masterName;
        public LayoutAttribute(string masterName)
        {
            _masterName = masterName;
        }
        /// <summary>
        /// 页面渲染结束后执行
        /// </summary>
        /// <param name="filterContext"></param>
        public override void OnActionExecuted(ActionExecutedContext filterContext)
        {
            base.OnActionExecuted(filterContext);
            var result = filterContext.Result as ViewResult;
            if (result != null)
            {
                result.MasterName = _masterName;
            }
        }
    }

最后把它应用到controller或者action上,使用很简单

本文转自博客园张占岭(仓储大叔)的博客,原文链接:爱上MVC3~在控制器或Action上动态设定模板页(Layout),如需转载请自行联系原博主。

目录
相关文章
|
4月前
|
前端开发 Java API
Spring Boot之Spring MVC基于注解的控制器(RequestMapping注解类型 重定向与转发 依赖注入)
Spring Boot之Spring MVC基于注解的控制器(RequestMapping注解类型 重定向与转发 依赖注入)
44 0
|
29天前
|
前端开发 Java Spring
ssm中spring mvc找不到控制器,报错404
ssm中spring mvc找不到控制器,报错404
14 0
|
29天前
mvc.net分页查询案例——控制器(HomeController.cs)
mvc.net分页查询案例——控制器(HomeController.cs)
8 0
|
1月前
|
设计模式 前端开发 数据处理
MVC架构中,控制器和模型之间是如何交互的
MVC架构中,控制器和模型之间是如何交互的
9 0
|
1月前
|
存储 设计模式 前端开发
请解释 Web 应用程序的 MVC(模型-视图-控制器)架构。
【2月更文挑战第26天】【2月更文挑战第89篇】请解释 Web 应用程序的 MVC(模型-视图-控制器)架构。
|
3月前
|
前端开发 Java API
Spring MVC-04循序渐进之基于注解的控制器
Spring MVC-04循序渐进之基于注解的控制器
45 0
|
4月前
|
XML 前端开发 安全
SpringMVC与Struts2等MVC控制器
SpringMVC与Struts2等MVC控制器
65 1
|
10月前
|
缓存 前端开发 Java
【Spring MVC学习笔记 三】深入实践Spring MVC控制器(下)
【Spring MVC学习笔记 三】深入实践Spring MVC控制器(下)
53 0
|
10月前
|
前端开发 Java 应用服务中间件
【Spring MVC学习笔记 三】深入实践Spring MVC控制器
【Spring MVC学习笔记 三】深入实践Spring MVC控制器
41 0
|
11月前
|
前端开发 Java Spring
java202304java学习笔记第六十二天-mvc的请求-spring产生模板对象实现
java202304java学习笔记第六十二天-mvc的请求-spring产生模板对象实现
50 0