Динамическая настройка тем в ASP.NET - PullRequest
4 голосов
/ 21 октября 2009

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

В основном я хочу изменить тему на основе имени хоста. то есть. пользователь заходит на «websome.com» получает тему «websome», а пользователь заходит на «jamessome.com» получает тему «jamessome».

Я установил тему в атрибуте «pages» web.config, который применяет тему глобально ко всему сайту. Можно ли как-то изменить эту настройку на лету в зависимости от введенного домена? Возможно, это возможно, но каковы сокращения и что вы предлагаете делать с небольшим количеством кода, чтобы упростить решение. Как я понимаю, если я редактирую web.config каждый раз, когда пользователь входит, это займет много времени, что не так уж и элегантно ... Так что любой гуру ASP.NET может написать две строки кода, чтобы волшебство произошло?

Существует несколько решений этой проблемы на веб-сайте, но для этого потребуется добавить код к событию Page_Init каждой страницы на сайте, что нереально.

1 Ответ

8 голосов
/ 21 октября 2009

На самом деле, он должен быть установлен в Page_PreInit, он не будет работать, если вы попытаетесь изменить тему в Page_Init.

Наиболее распространенным решением является использование родительского класса для всех ваших страниц. Это единовременное изменение, которое помещает логику в родительский класс. Вместо того, чтобы наследовать от Page, вы потом наследуете, скажем, от ThemedPage. Внутри класса ThemedPage, который, конечно, наследует от Page, вы можете переопределить метод Page.OnPreInit.

Вы просили "две строки", это на самом деле одна, если вы удалите беспорядок. Это VB:

Public Class ThemedPage
    Inherits Page

    Protected Overrides Sub OnPreInit(ByVal e As System.EventArgs)
        Me.Theme = HttpContext.Current.Request.Url.Host.Replace(".com", "")
        MyBase.OnPreInit(e)
    End Sub
End Class

И вместо этого:

Partial Class _Default
    Inherits System.Web.UI.Page

Вы сейчас напишите это:

Partial Class _Default
    Inherits ThemedPage

Вот и все! Единовременный поиск / замена, и все готово. Для полноты, вот то же самое (только класс) для C #:

// C# version
using System.Web;
using System.Web.UI;

public class ThemedPage : Page
{

    protected override void OnPreInit(System.EventArgs e)
    {
        this.Theme = HttpContext.Current.Request.Url.Host.Replace(".com", "");
        base.OnPreInit(e);
    }
}

Обновление: добавлен пример кода VB
Обновление: добавлен пример кода C #

Примечание: тема должна существовать, в противном случае вы получите исключение: Theme 'ThemeName' cannot be found in the application or global theme directories.. Если вам нужна тема по умолчанию или нет темы, если тема отсутствует, оберните ее вокруг блока try / catch и используйте блок catch для установки темы по умолчанию.

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