2009-07-29 2 views
1

У нас есть довольно сложное приложение, которое ранее использовало WebForms. Мы находимся в процессе перезаписи бит с нуля с помощью MVC. Наше приложение состоит из нескольких виджетов, которые вместе составляют функциональность приложения.ASP.NET MVC Aggregate CSS/JS из нескольких контроллеров

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

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

<%= Html.GetRegisteredCssFiles() %> 

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

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

ответ

1

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

+0

наконец-то, есть ли css/js-агрегатор для dnn? как в drupal (PHP)? –

0

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

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

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

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

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

1

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

+0

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

Смежные вопросы