La convention de la directive ASP.NET pour la déclaration du client inclut

Je charge les fichiers .aspx et .ascx en tant que StreamReader .

Je veux que chaque fichier enregistre ses dépendances javascript et stylesheet dans une déclaration comme un <%@ ClientDependency path="~/Scripts/jquery-1.4.1.min.js" %> .

Existe-t-il une convention existante pour faire une telle chose? Je n'ai pas besoin d'une mise en œuvre, mais je ne veux pas créer une nouvelle syntaxe s'il existe déjà un moyen de le faire.

En outre, quelles sont les lignes directrices pour les <%@ blocs personnalisés dans ASP.NET?

Aussi, veuillez retaper cette question si vous pouvez penser à une description plus appropriée.

Avez-vous envisagé Google Loader ou quelque chose comme ceci: Activation du chargeur de script ASP.NET Ajax pour vos propres scripts

En gros…

Voici ce que je fais dans mon projet MVC actuel:

  • L'utilisation de Web Asset Manager de Telerik pour enregistrer tous mes scripts communs et CSS dans la page principale que je sais sera utilisé sur chaque page (il y a un téléchargement open source, si j'aime moi, vous ne le savez pas) .

  • J'encapsule toutes les fonctionnalités JS (au-delà de quelques lignes) dans des fonctions stockées dans des fichiers JS externes appropriés.

  • J'encapsule toutes mes fonctions UI étendues dans les Helpers HTML. Ils utilisent ensuite le StyleSheetRegistrar et ScriptsRegistrars pour charger de façon dynamique tout CSS supplémentaire ou JS requis pour cet assistant particulier. Et comptez sur le gestionnaire de Telerik pour ne pas les charger plus d'une fois.

  • Si j'utilise des styles en ligne, je spécifie l'étiquette de style manuellement dans la méthode Helper via l'objet htmlAttributes, mais c'est rare.

  • Pour appeler la fonctionnalité javascript requise sur l'élément HTML, j'utilise ScriptRegistrar (). Surcharge de chaîne de OnDocumentReady () pour spécifier une fonction javascript pour appeler cet élément.

  • J'ai également défini une méthode d'extension simple pour ScriptRegistrarBuilder dans ma classe HtmlHelpers qui me permet de fournir une liste de paramètres d'arguments pour passer à mon appel de méthode javascript, en appelant OnDocumentReady () , sans un accord de chaîne de caractères.

     public static void OnDocumentReady(this ScriptRegistrarBuilder builder, string format, params string[] args) { builder.OnDocumentReady(String.Format(format, args)); } 
  • Et bien sûr, je rends tous les JS au bas de la page Master.

Vous n'évitez pas toutes les utilisations de JS en ligne ici, mais cela le rend très mince, si vous le faites bien. Honnêtement, je ne peux pas vraiment penser à une autre façon qui ne commencerait pas à devenir assez compliqué.

En fin de compte, je pense que vous obtenez quelque chose de très flexible qui, en même temps, vous permet d'être assez précis pour charger ce que vous faites et n'avez pas besoin sur une page donnée.

La seule mise en garde que j'ai trouvée avec cette méthode est en termes de CSS. Afin de pouvoir charger dynamiquement des fichiers CSS dans la page lorsqu'un assistant les a besoin, j'ai dû rendre tous les CSS inclus au bas de la page Maître, après tout appel possible pour ajouter de nouveaux fichiers.

Je n'ai pas encore trouvé de solution à cela, malheureusement.

Un petit exemple

Peut-être inutilement détaillé pour vous … mais de cette façon, quelqu'un cherchant peut-être trouver une solution utile aussi! 🙂

Dans la page principale:

 <% Html.Telerik().StyleSheetRegistrar().DefaultGroup(styles => styles .Add("~/Content/Site.css") .Add("~/Content/core.css") ); Html.Telerik().ScriptsRegistrar().DefaultGroup(scripts => scripts .Add("~/Scripts/common.js") .Combine(true) .Compress(true) .CacheDurationInDays(30) ); %> 

Ensuite, quelque part juste au-dessus de la balise de fermeture du corps:

 <%: Html.Telerik().ScriptsRegistrar().Render(); Html.Telerik().StyleSheetsRegistrar().Render(); %> 

Dans votre assistant HTML:

  public static MvcHtmlString AutoCompleteComboListFor<TModel, TProperty>(this HtmlHelper<TModel> Helper, Expression<Func<TModel, TProperty>> expression, SelectList List, string DataSource) { MvcHtmlString dropDown = SelectExtensions.DropDownListFor<TModel, TProperty>(Helper, expression, List); string htmlFieldName = ExpressionHelper.GetExpressionText(expression); string id = Helper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldId(htmlFieldName); //Do whatever you want helper.Telerik().ScriptRegistrar().DefaultGroup(scripts => scripts .Add("~/Scripts/extended.js") ); helper.Telerik().StyleSheetRegistrar().DefaultGroup(styles => styles .Add("~/Content/extended.css") ); helper.Telerik().ScriptRegistrar().OnDocumentReady(@"MyExtendedFunction('{0}');", id); return dropDown; } 

Il suffit d'appeler cet assistant (ou tout autre) se terminant par un bloc ordinaire à la fin de la page contenant tous les codes JS, les fichiers et les fichiers CSS.

 <link type="text/css" href="/Content/Site.css" rel="stylesheet"/> <script type="text/javascript" src="/asset.axd?id=kAAAAB-LCAAAAAAABADsvQdgHEmWJSYvbcp7f0r1StfgdKEIgGATJNiQQBDswYjN5pLsHWlHIymrKoHKZVZlXWYWQMztnbz33nvvvffee--997o7nU4n99__P1xmZAFs9s5K2smeIYCqyB8_fnwfPyJ-8Uezjx597xd_tPro0Uevp3WxapuPRh-d82dL-uynf9E6r6-3d8f79N9P47vqo0c7v2Qk3-bv2nw5y2f2m91f8v1f8v3RR9OWvmzp27s_nV1mDcOlBpf06d7O7s743nj33u4BfTKl3u99ep9--ehRW6_zX_L_BAAA___9S_3qkAAAAA%3d%3d"></script> <script type="text/javascript"> //<![CDATA[ jQuery(document).ready(function(){ myFunction('Foo');}); //]]> </script> 

Il n'existe aucune convention existante pour l'enregistrement des clients avec une directive. Ma solution était de créer un contrôle de serveur personnalisé à la place et d'utiliser la fonctionnalité TemplateParser existante pour obtenir les données d'inclusion (ce qui a fini par être préférable de charger le fichier en tant que flux et de l'analyser moi-même).