Тематические и мастер-страницы - PullRequest
0 голосов
/ 17 марта 2010

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

Я настроил структуру каталогов так

/ Shared / MasterPages / theme1 / Master1.master /shared/masterpages/theme1/Master2.master /shared/masterpages/theme1/Master3.master

/ Shared / MasterPages / theme2 / Master1.master /shared/masterpages/theme2/Master2.master /shared/masterpages/theme2/Master3.master

И я все еще использую директиву страницы в представлении

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/shared/masterpages/theme1/Master1.Master"%>

Я все еще хотел бы использовать свойство MasterPageFile представления и просто изменить каталог темы.

Я могу думать только о трех способах сделать это, ни один из них не звучит замечательно.

  1. Создайте собственный класс BaseView, который использует OnPreInit для изменения темы, например this
  2. Создайте некоторый файл XML или таблицу базы данных, которая связывает каждое представление с файлом главной страницы, а затем установите его в контроллере.
  3. Создайте какой-нибудь инструмент, который считывает все представления и анализирует их для их файла главной страницы (аналогично 2, но может быть выполнено потенциально во время выполнения).

Вариант 1 пока кажется мне лучшим вариантом. У кого-нибудь еще есть мысли о том, как это сделать?

1 Ответ

2 голосов
/ 17 марта 2010

Обновленное предложение :

Поскольку мое первоначальное предложение не сработало, как я ожидал, вот возможный способ обойти его, сохраняя при этом ваши методы действия чистыми и минимизируя повторение кода:

  1. Создайте ActionResult, который добавляет основное имя / имя темы / любую информацию, необходимую для выбора правильной главной страницы в ViewData["masterInfo"] (или что-то подобное).
  2. Создать базовый класс, который наследуют тематические представления. Ваш базовый класс должен, конечно, наследовать от System.Web.Mvc.ViewPage. Если вам нужно, также создайте универсальную версию, которая наследуется от .ViewPage<T>.
  3. В базовом классе создайте метод построения, который выбирает правильную главную страницу на основе ViewData["masterInfo"]. Я не уверен, есть ли необходимость или нет, но не забудьте запустить базовый конструктор, либо до, либо после вашего кода, если есть тот, который нужно запустить.
  4. Украсьте все соответствующие действия атрибутом и настройте их представления так, чтобы они наследовали ваш базовый класс вместо System.Web.Mvc.ViewPage.

Оригинальный пост :
Почему бы не иметь ActionFilter, который можно применять на уровне контроллера, который устанавливает свойство MasterPageFile представления? Если вы переопределите OnActionExecuted, не должно быть слишком сложно проверить, был ли результат ViewResult, и в этом случае измените свойство на правильное значение.

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