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