2009-07-29 5 views
1

Nous avons une application assez complexe qui utilisait auparavant WebForms. Nous sommes en train de réécrire des morceaux à partir de rien en utilisant MVC. Notre application est composée d'un certain nombre de widgets qui, ensemble, constituent la fonctionnalité de l'application.ASP.NET MVC Agrégation CSS/JS à partir de plusieurs contrôleurs

Dans WebForms, nous avons utilisé UserControls. Chaque UserControl enregistrerait ses CSS et JavaScript au moyen d'une collection qui a été stockée dans HttpContext.Current.Items. Cette collection serait ensuite fusionnée en une seule requête. Généralement cela se produirait dans l'événement Page_Load, et la page contenant rendrait alors une balise de script qui comprendrait tout le JavaScript et le CSS nécessaires pour cette page.

Nous avons eu du mal à faire la même chose dans MVC. Nous utilisons un certain nombre de vues dans une masterpage pour imiter les widgets. Chaque widget possède son propre contrôleur, de sorte que la fonctionnalité peut être suffisamment séparée. La page maître construit les widgets sur la page en utilisant RenderAction à partir de contrats à terme MVC. À l'origine, nous utilisions la même méthode d'enregistrement pour les fichiers CSS/JS. Chaque contrôleur enregistrerait ses fichiers requis dans une action. Les fichiers seraient alors contenus dans la collection HttpContext.Current.Items et seraient rendus à la page. Pour faciliter cela, j'ai écrit une extension HtmlHelper pour rendre les liens/scripts sur la page. Cela ressemble à ceci:

<%= Html.GetRegisteredCssFiles() %> 

Le problème est que MVC utilise une approche plus descendante. Cet appel est fait dans l'étiquette de la page, mais nos appels ultérieurs à RenderAction se produisent ci-dessous. Au moment où RenderAction est appelée et les fichiers requis sont enregistrés dans HttpContext.Current.Items, le code ci-dessus a déjà été exécuté. Ainsi, la collection n'est pas modifiée au bon moment.

Est-ce que quelqu'un a des idées sur la façon dont nous devrions construire cela? Je cherche des réponses qui intègrent les meilleures pratiques pour MVC.

Répondre

0

Vous ne savez pas si c'est une solution réalisable pour vous, mais essayez de déplacer cet appel vers le bas de chaque page.

J'ai toujours inclus mes fichiers javascript et css dans le HEAD html, donc je ne sais pas si cela fonctionnerait plus bas. Mon hypothèse est que cela fonctionnera dans la plupart des navigateurs, mais vous pourriez avoir des problèmes aléatoires dans quelques-uns.

L'alternative est d'avoir GetRegisteredFiles() en sortie de javascript qui charge les fichiers CSS au bon endroit (via la manipulation DOM). Le problème avec l'une ou l'autre de ces solutions est que les fichiers ne sont pas inclus jusqu'à la fin, ce qui pourrait rendre la page "plate" jusqu'à ce que le CSS soit téléchargé.

Alternativement, le contrôleur pourrait prédire quels "widgets" seront chargés et transmettre ces données à la page maître.

1

Les outils gratuits Telerik MVC ont un script et un registre de style qui pourrait faire ce que vous voulez ...

+0

Ya J'ai remarqué que récemment. J'ai vérifié mais je ne pense pas que cela facilitera l'inscription de scripts dans des contrôleurs alternatifs. Je vais le creuser et vérifier. –

Questions connexes