2010-03-17 56 views
0

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

我有安装像这样

/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 Title="" Language="C#" MasterPageFile="~/Views/shared/masterpages/theme1/Master1.Master"%> 

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

我只能想到三种方法来做到这一点,没有一个听起来很棒。

  1. 创建使用OnPreInit改变像this
  2. 主题创建每个视图链接到母版页文件,然后将该控制器一些XML文件或数据库表中的自定义基本视点类。
  3. 建立一些工具,可读取所有的意见,并分析他们的的MasterPageFile,(类似于2,但可以在运行时可能被完成。)

选项1似乎是最好的选择对我来说至今。有没有人有任何想法如何做到这一点?

+0

我们在MVC中有PreInit吗?请原谅我的无知! – 2010-03-17 19:58:20

+0

是的,我们似乎这样做,因为我刚刚编写了选项1,它的工作原理。 – Jeff 2010-03-17 21:51:38

回答

2

更新建议

因为正如我所预料我原来的建议没有发挥出来,下面就来解决它,同时仍保持动作方法清洁,减少码重复的可能方式:

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

原帖
为什么没有一个ActionFilter,可以在控制器级应用,是设置视图的MasterPageFile财产?如果覆盖OnActionExecuted,则测试结果是否为ViewResult并不是太棘手,并且在这种情况下将属性更改为正确的值。

+0

我的理解是,在OnActionExecuted中,您看不到在视图本身中设置的MasterPageFile属性。您只能更改由控制器设置的主页面文件。这是不正确的? – Jeff 2010-03-17 20:33:09

+0

我还没有真正尝试过这一点 - 我只是想通过ActionFilter来做到这一点的最佳方式,并且由于您需要将结果实例化,因此必须在控制器操作后执行。你有没有尝试过这个,并发现问题?如果是的话,有什么问题? – 2010-03-17 20:48:31

+0

我刚刚测试过,并且在OnActionExecuted中只有ViewResult,但视图本身尚未加载,因此您看不到在控制器设置的仅查看母版页的页面指令中定义的母版页。 – Jeff 2010-03-17 21:52:44