我想在MVC 2应用程序中动态更改页面主题。 我找到了几个解决方案,但我想使用这个方法:在Global.asax中,更改当前页面主题:
protected void Application_PreRequestHandlerExecute(object sender, System.EventArgs e)
{
// cast the current handler to a page object
Page p = HttpContext.Current.Handler as Page;
if (p != null)
{
string strTheme = "Theme1";
if (Convert.ToString(HttpContext.Current.Session["THEME"]) != string.Empty)
strTheme = Convert.ToString(HttpContext.Current.Session["THEME"]);
p.StyleSheetTheme = strTheme;
}
}
但是这段代码总是在“p”中返回null ... 我也在HttpModule和页面的PreInit事件中使用事件PreRequestHandlerExecute尝试了类似的代码,但是代码
HttpContext.Current.Handler as Page
始终返回null。
任何人都可以帮助我吗? 提前谢谢。
答案 0 :(得分:3)
我不在主题中使用烘焙,但我确实使用jQuery UI主题。我处理它的方式是在我的母版页中,我有一个逻辑,从一个常见的viewmodel获取当前主题。主页面强烈键入此视图模型。常见的viewmodel属性从用户首选项和我所有控制器继承的公共基本控制器中的其他源更新。我在OnActionExecuted中执行此操作。我检查结果是否是ViewResult,然后将ActionExecutedContext.Result属性上的ViewData结果转换为我的公共视图模型并设置属性。母版页使用属性的值来构建CSS文件的URL。
<强>模型强>
public abstract class CommonViewModel
{
public string Theme { get; set; }
// ...
}
<强>控制器强>
public abstract class BaseController : Controller
{
public override void OnActionExecuted( ActionExecutedContext context )
{
if (context.Result is ViewResult)
{
var model = ((ViewResult)context.Result).ViewData.Model as CommonViewModel;
if (model != null)
{
var preferences = ...get from database for current user...
model.Theme = preferences.Theme;
}
}
}
}
大师注意它使用自定义HtmlHelper来生成样式表链接,你可以 手工完成。
<%@ Master Language="C#" Inherits="System.Web.Mvc.ViewMasterPage<...CommonViewModel>" >
<%: Html.Stylesheet( "themes/" + Model.Theme + ".css" ) %>
答案 1 :(得分:0)
您所谈论的技术适用于标准的asp.net,而非asp.net MVC。原因是(通常)asp.net MVC不使用标准asp.net所做的Web控件模型,因此没有什么可以解释主题设置。
@tvanfosson有一些很好的建议。请记住,使用MVC,您可以更好地控制事物..但这也意味着您必须做更多工作才能获得标准asp.net免费提供的一些功能。 MVC使许多事情变得更容易,但这不是其中之一。