2011-01-14 4 views
2

Я хотел бы динамически изменять тему страницы в приложении MVC 2. я нашел несколько решений, но я хочу использовать этот метод: в Global.asax, изменить текущую тему Страницы:ASP.NET MVC 2: Динамические темы

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; 
     } 
    } 

Но этот код всегда возвращает нуль в «р» ... Я также попробовал подобный код, используя событие PreRequestHandlerExecute в более HttpModule и событие PreInit страницы, но код

HttpContext.Current.Handler как Page

всегда возвращает нуль.

Может ли кто-нибудь мне помочь? Спасибо заранее.

+0

MVC Обработчики не являются страницами. – SLaks

+0

Значит, каждый код, указанный в приведенных ниже ссылках, неверен? http://forums.asp.net/p/1424103/3168832.aspx http://forums.asp.net/p/1400562/3029482.aspx http://stackoverflow.com/questions/58123/finding -system-web-ui-page-from-httpcontext – mbp

+0

Этот метод не будет работать для MVC. – SLaks

ответ

3

Я не использую испеченные темы, но я использую темы пользовательского интерфейса jQuery. То, как я справляюсь с этим, находится на моей главной странице. У меня есть логика, которая выводит текущую тему из общей модели просмотра. Основная страница строго типизирована для этой модели представления. Общие свойства viewmodel обновляются из пользовательских настроек и других источников в общем базовом контроллере, который наследует все мои контроллеры. Я делаю это в OnActionExecuted. Я проверяю, является ли результат ViewResult, а затем передайте результат из ViewData в свойстве ActionExecutedContext.Result в мою общую модель представления и задайте свойство. На главной странице используется значение свойства для создания URL-файла для файла CSS.

Модель

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; 
       } 
      } 
    } 
} 

Master записка использует пользовательский HtmlHelper для создания ссылку таблицы стилей, вы можете сделать это вручную.

<%@ Master Language="C#" Inherits="System.Web.Mvc.ViewMasterPage<...CommonViewModel>" > 

<%: Html.Stylesheet("themes/" + Model.Theme + ".css") %> 
+0

Спасибо, что поделились своей техникой, я буду исследовать ее. – mbp

0

Техника, о которой вы говорите, работает для стандартного asp.net, а не asp.net MVC. Причина в том, что (в общем) asp.net MVC не использует модель веб-управления, которую делает стандартный asp.net, и поэтому нет смысла интерпретировать настройку темы.

@tvanfosson имеет отличный совет. Просто помните, что с MVC у вас гораздо больше контроля над вещами .. но это также означает, что вам нужно сделать больше работы, чтобы получить некоторые функции, которые стандарт asp.net предоставляет бесплатно. MVC упрощает многое, но это не один из них.

Смежные вопросы