2009-07-29 12 views
1

Wir haben eine ziemlich komplexe Anwendung, die zuvor WebForms verwendet. Wir sind dabei, Bits davon mit MVC von Grund auf neu zu schreiben. Unsere Anwendung besteht aus einer Reihe von Widgets, die zusammen die Funktionalität der Anwendung ausmachen.ASP.NET MVC Aggregate CSS/JS von mehreren Controllern

In WebForms haben wir UserControls verwendet. Jedes UserControl würde sein CSS und JavaScript mittels einer Sammlung registrieren, die in HttpContext.Current.Items gespeichert wurde. Diese Sammlung würde dann zusammengeführt, um sie als eine einzige Anfrage auszugeben. Normalerweise würde dies im Page_Load-Ereignis auftreten, und die umschließende Seite würde dann ein Skript-Tag rendern, das das gesamte für diese Seite erforderliche JavaScript und CSS umfassen würde.

Wir hatten Probleme mit MVC. Wir verwenden eine Anzahl von Ansichten innerhalb einer Masterpage, um die Widgets nachzuahmen. Jedes Widget hat seinen eigenen Controller, so dass die Funktionalität ausreichend getrennt werden kann. Die Masterpage baut die Widgets auf der Seite mit RenderAction aus MVC-Futures auf. Ursprünglich verwendeten wir dieselbe Registrierungsmethode für die CSS/JS-Dateien. Jeder Controller würde seine erforderlichen Dateien in einer Aktion registrieren. Die Dateien wären dann in der HttpContext.Current.Items-Auflistung enthalten und würden auf der Seite gerendert. Um dies zu erleichtern, habe ich eine HtmlHelper-Erweiterung geschrieben, um die Links/Skripts auf der Seite darzustellen. Es sieht wie folgt aus:

<%= Html.GetRegisteredCssFiles() %> 

Das Problem ist, dass MVC eine Top-down-Ansatz verwendet. Dieser Aufruf erfolgt im Tag der Seite, aber unsere nachfolgenden Aufrufe von RenderAction passieren weiter unten. Wenn RenderAction aufgerufen wird und die erforderlichen Dateien in HttpContext.Current.Items registriert sind, wurde der obige Code bereits ausgeführt. Daher wird die Sammlung nicht zur richtigen Zeit geändert.

Hat jemand irgendwelche Ideen, wie wir das konstruieren sollten? Ich suche nach Antworten, die Best Practices für MVC enthalten.

Antwort

0

Nicht sicher, ob dies eine machbare Lösung für Sie ist, aber versuchen Sie, diesen Aufruf an den unteren Rand jeder Seite zu verschieben.

Ich habe immer meine Javascript und CSS-Dateien in den HTML-Header, so dass ich nicht weiß, ob es weiter unten funktionieren würde. Ich gehe davon aus, dass es in den meisten Browsern funktioniert, aber in einigen Fällen können zufällige Probleme auftreten.

Die Alternative besteht darin, dass GetRegisteredFiles() etwas Javascript ausgibt, das die CSS-Dateien an die richtige Stelle lädt (via DOM-Manipulation).

Das Problem mit einer dieser Lösungen ist, dass die Dateien bis zum Ende nicht enthalten sind, was dazu führen kann, dass die Seite "normal" aussieht, bis das CSS heruntergeladen ist.

Alternativ könnte der Controller vorhersagen, welche "Widgets" geladen werden und diese Daten an die Masterseite übergeben.

1

Die freien Telerik MVC-Tools haben ein Skript und einen Stil-Register, das vielleicht tun, was Sie wollen ...

+0

Das habe ich vor kurzem bemerkt. Ich habe es überprüft, aber ich glaube nicht, dass es die Registrierung von Skripten in alternativen Controllern erleichtert. Will es graben und auschecken. –

Verwandte Themen