ASP.NET MVC Агрегирование CSS / JS с нескольких контроллеров - PullRequest
1 голос
/ 30 июля 2009

У нас есть довольно сложное приложение, которое ранее использовало WebForms. Мы находимся в процессе переписывания его с нуля, используя MVC. Наше приложение состоит из нескольких виджетов, которые вместе составляют функциональность приложения.

В WebForms мы использовали UserControls. Каждый UserControl регистрирует свои CSS и JavaScript с помощью коллекции, которая хранится в HttpContext.Current.Items. Затем эта коллекция будет объединена в один запрос. Обычно это происходит в событии Page_Load, и содержащаяся страница затем отображает тег сценария, который будет содержать все JavaScript и CSS, необходимые для этой страницы.

Мы боролись с тем же в MVC. Мы используем несколько представлений на главной странице, чтобы имитировать виджеты. Каждый виджет имеет свой собственный контроллер, поэтому функциональность может быть в достаточной степени разделена. Мастер-страница создает виджеты на странице, используя RenderAction из MVC-фьючерсов. Первоначально мы использовали один и тот же метод регистрации для файлов CSS / JS. Каждый контроллер будет регистрировать свои необходимые файлы в действии. Затем файлы будут содержаться в коллекции HttpContext.Current.Items и будут отображаться на странице. Чтобы облегчить это, я написал расширение HtmlHelper для вывода ссылок / сценариев на страницу. Это выглядит так:

<%= Html.GetRegisteredCssFiles() %>

Проблема в том, что MVC использует более нисходящий подход. Этот вызов выполняется в теге страницы, но наши последующие вызовы RenderAction происходят ниже. К моменту вызова RenderAction и регистрации необходимых файлов в HttpContext.Current.Items приведенный выше код уже выполнен. Таким образом, коллекция не была изменена в нужное время.

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

Ответы [ 3 ]

1 голос
/ 04 сентября 2009

Инструменты Free Telerik MVC имеют скрипт и реестр стилей, которые могут делать то, что вы хотите ...

1 голос
/ 28 марта 2011

Этот вопрос задавался много лет назад, так что, возможно, вы уже имели дело с этим. Но для будущих посетителей, возможно, это решение будет полезно: http://marcinbudny.blogspot.com/2010/01/handling-stylesheet-references-in.html

0 голосов
/ 30 июля 2009

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

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

Альтернатива заключается в том, чтобы GetRegisteredFiles () выводил некоторый javascript, который загружает файлы CSS в нужном месте (посредством манипулирования DOM).

Проблема любого из этих решений заключается в том, что файлы не включаются до конца, что может привести к тому, что страница будет выглядеть «простой» до тех пор, пока не будет загружен CSS.

Кроме того, контроллер может предсказать, какие «виджеты» будут загружены, и передать эти данные на главную страницу.

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