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