爱上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); }
OnActionExecuted,OnActionExecuting,OnResultExecuted和OnResultExecuting它们记录一个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上,使用很简单
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)
2012-10-31 EF架构~为EF DbContext生成的实体添加注释(T4模板应用)
2011-10-31 DataContext数据在F5刷新频繁时,出现数据读取错误(MVC LINQ)