ASP.NET MVC Объединение CSS/JS с нескольких контроллеров

У нас есть довольно сложное приложение, которое ранее использовало 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.


person steve_c    schedule 29.07.2009    source источник


Ответы (3)


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

person Marcin Budny    schedule 28.03.2011
comment
наконец, есть ли агрегатор css/js для dnn? как то, что есть в друпале (PHP)? - person Mohammad Ali Akbari; 09.10.2011

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

person MarkKGreenway    schedule 04.09.2009
comment
Я заметил это недавно. Я проверил это, но не думаю, что это облегчит регистрацию скриптов в альтернативных контроллерах. Покопаюсь и проверю. - person steve_c; 04.09.2009

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

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

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

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

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

person James S    schedule 30.07.2009