Как динамически определить, какой файл-оболочку HTML использовать на основе выполняемого метода действия?

У нас есть приложение MVC, которое вводит наш контент в HTML-оболочку, предоставленную клиентом.

Существует несколько оболочек, таких как fund.html, share.html, factsheet.html и home.html.

Обертка хранится на нашем веб-сервере. Нам нужно загрузить оболочку в Site.Master и внедрить наш контент в область содержимого обертки, а затем отобразить страницу.

В принципе, мне нужен совет о том, как определить, какую оболочку использовать.

Сначала я думал, что мы можем сопоставить обертку с контроллером. Таким образом, если мы рендерим представление на FundController, мы можем использовать оболочку Fund.html, а если это ShareController, мы можем использовать Share.html. В BaseController, который реализован как FundController, так и ShareController, я получал имя контроллера и использовал его для загрузки файла, и все было хорошо.

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

Затем я подумал, что могу использовать имя действия вместо имени контроллера, чтобы определить оболочку, которую я должен использовать. Например, public ViewResult Fund() будет соответствовать Fund.html, а public ViewResult Factsheet() будет соответствовать Facthseet.html, но это не идеально, потому который срабатывает в BaseController, будет срабатывать для всех методов действий, которые я выполняю, включая те, которые возвращают PartialViews и другие результаты действий, для которых я не хочу загружать оболочки. Мне нужны только обертки для ViewResults.

Итак, в этом случае мне было интересно, как лучше всего определить, какую оболочку использовать, для какого ViewResult я выполняю. Один из вариантов использует «волшебную строку», которая всякий раз, когда выполняется данный метод действия, устанавливает свойство в BaseController, которое можно использовать для определения используемой оболочки ... но мне не нравятся волшебные строки. Я бы предпочел избегать хакерского подхода.

Я также думал об использовании фильтра действий, который мог бы выполнять работу по загрузке оболочки, связанной с любым методом действия, с которым связан фильтр. Но прежде чем сделать это, я хотел бы узнать мнение других людей, которым, возможно, приходилось сталкиваться с проблемой, подобной этой раньше. Или, если кто-нибудь может посоветовать лучший подход? Как мне лучше всего это сделать? Спасибо.


person DaveDev    schedule 13.07.2010    source источник


Ответы (3)


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

  • По умолчанию контроллеры и действия извлекают свои оболочки на основе соглашения. FundController использует оболочку Fund.html, а ShareController использует оболочку Share.html.
  • Но также разрешите переопределение оболочек для каждого действия с помощью ActionFilter.

За исключением дополнительных изменений требований (например, несколько оболочек в нескольких областях содержимого на главной странице), это должно удовлетворить ваши потребности, не так ли?

person Aaron Ransley    schedule 13.07.2010

Я думаю, что ваш фильтр действий — это один из вариантов, или вы можете захотеть расширить свой собственный ViewEngine, который отвечает за принятие решений, когда использовать оболочку, а когда нет.

Надеюсь это поможет...

person Brad C.    schedule 13.07.2010

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

Было бы хорошо, если бы у разработчиков был тот же набор правил.

Я не знаю, как вы можете реализовать это, но я думаю, что это возможно.

person Mathias F    schedule 13.07.2010