как поменять темы в asp.net mvc 2 - PullRequest
0 голосов
/ 29 марта 2011

Я бы хотел, чтобы у пользователя была возможность выбрать свою тему для сайта из выпадающего списка, и эта тема относится к этой странице [atleast].

Я хочу, чтобы это было сделано в ASP.NET MVC 2 без использования jquery-подобных фреймворков.

Как это можно сделать.

Я использую веб-форму по умолчанию viewengine, и я не хочу использовать для этой цели пользовательский viewengine.

1 Ответ

3 голосов
/ 29 марта 2011

Кажется, это не поддерживается из коробки, но вот что я сделал, чтобы реализовать их:

Сначала я добавил папку App_Themes в свой проект и настроил пару тем enter image description here

Затем я решил попробовать имитировать поставщика профилей веб-форм как можно ближе и добавил свойство профиля в web.config:

<profile>
  <properties>
    <add name="ThemePreference" type="string" defaultValue="Blue" />
  </properties>
</profile>

Итак, в основном то, что я хотелсделать, чтобы иметь возможность загружать различные CSS из соответствующей папки темы, когда тема изменилась.Я сделал это, реализовав вспомогательный метод, присоединенный к классу UrlHelper, чтобы я мог написать:

<link href="@Url.Theme("~/Content/Site.css")" rel="stylesheet" type="text/css" />

Затем он должен загрузить соответствующий тематический Site.css и вернуться к ~ / Content / Site.css.если файл не найден.

Помощник довольно прост:

public static class UrlHelpers
{
    public static string Theme(this UrlHelper url, string u)
    {
        if (u.StartsWith("~")) u = u.TrimStart('~');
        SettingsProperty settingsProperty = ProfileBase.Properties["ThemePreference"];

        return url.Content("~/App_Themes/"+settingsProperty.DefaultValue + u);
    }
}

Теперь в этой версии кода он просто получает значение по умолчанию, поэтому вам нужно настроитьнемного кодНо, как вы можете видеть, это не ограничивается css-файлами, а работает со всем, от файлов .master до изображений.

Обновление - использование сеанса вместо профиля

public static class UrlHelpers
{
    public static string Theme(this UrlHelper url, string u)
    {
        if (u.StartsWith("~")) u = u.TrimStart('~');

        object currentThemeName = null;
        if (url.RequestContext.HttpContext.Session != null)
        {
            currentThemeName = url.RequestContext.HttpContext.Session["ThemePreference"];
        }
        return currentThemeName != null ? url.Content(String.Format("~/App_Themes/{0}{1}", currentThemeName, u)) : url.Content("~"+u);
    }
}

Строка возврата в этом методе проверяет, нашел ли он значение сеанса ThemePreference, а затем возвращает соответствующий URL-адрес для запрошенного содержимого, в противном случае он просто возвращает содержимое, как было запрошено, без префикса App_Theme.

В вашем контроле для постметода DropDown вы просто должны сделать:

Session.Add("ThemePreference", whateverValueYouGotFromDropdown);

Обновление заканчивается

С некоторыми изменениями и исправлениями это должно сделатьтрюк.

Надеюсь, что это поможет некоторым, хотя это и не полное прохождение:)

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