ASP .NET MVC 2: динамические темы - PullRequest
2 голосов
/ 14 января 2011

Я хотел бы динамически изменить тему страницы в приложении 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" ... Я также пробовал подобный код, используя событие PreRequestHandlerExecute в HttpModule и событие PreInit страницы, но код

HttpContext.Current.Handler as Page

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

Кто-нибудь может мне помочь? Заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 14 января 2011

Я не использую запеченные в темах, но я использую темы jQuery UI.То, как я справляюсь с этим, находится на моей главной странице. У меня есть логика, которая получает текущую тему из общей модели представления.Главная страница строго соответствует этой модели представления.Общие свойства 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;
               }
           }
    }
}

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

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

<%: Html.Stylesheet( "themes/" + Model.Theme + ".css" ) %>
0 голосов
/ 14 января 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...