主题和母版页

时间:2010-03-17 18:42:14

标签: asp.net-mvc

我要求支持网站主页的主题化。我这样做的方法是根据当前主题动态选择母版页。

我已经设置了类似的目录结构

/shared/masterpages/theme1/Master1.master /shared/masterpages/theme1/Master2.master /shared/masterpages/theme1/Master3.master

/shared/masterpages/theme2/Master1.master /shared/masterpages/theme2/Master2.master /shared/masterpages/theme2/Master3.master

我仍然在视图中使用page指令

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/shared/masterpages/theme1/Master1.Master"%>

我仍然想利用视图的 MasterPageFile 属性,只需更改主题目录。

我只能想到三种方法来做到这一点,听起来不是很好。

  1. 创建一个使用OnPreInit更改主题的自定义BaseView类,如this
  2. 创建一些xml文件或数据库表,将每个视图链接到母版页文件,然后在控制器中设置它。
  3. 构建一些工具,读取所有视图并解析它们的主页文件,(类似于2但可能在运行时可能完成。)
  4. 选项1对我来说似乎是最好的选择。有没有人对如何做到这一点有任何想法?

1 个答案:

答案 0 :(得分:2)

更新了建议

由于我的原始建议没有像我预期的那样有效,这里有一种可行的方法来解决它,同时仍然保持你的动作方法干净,并尽量减少代码的重复:

  1. 创建一个ActionResult,用于添加主名称/主题名称/选择正确母版页所需的任何信息ViewData["masterInfo"](或类似内容)。
  2. 创建一个可主题化视图继承的基类。当然,您的基类应该继承自System.Web.Mvc.ViewPage。如果需要,还可以创建继承自.ViewPage<T>
  3. 的通用版本
  4. 在基类中,创建一个构造方法,根据ViewData["masterInfo"]选择正确的母版页。我不确定是否需要,但不要忘记在代码之前或之后运行基本构造函数,如果有需要运行的话。
  5. 使用属性修饰所有相关操作,并将其视图设置为继承基类而不是System.Web.Mvc.ViewPage

  6. 原帖
    为什么不能在控制器级别应用ActionFilter来设置视图的MasterPageFile属性?如果您覆盖OnActionExecuted,那么测试结果是否为ViewResult并且在这种情况下将属性更改为正确的值应该不会太棘手。