web-dev-qa-db-fra.com

VS2012 - Formulaires Web - Confusion groupée

J'ai créé un nouveau projet de formulaires Web ASP.NET via Visual Studio 2012. Malheureusement, le fichier Site.Master par défaut est très déroutant. (Je poste ces questions ensemble car elles sont très liées et font assez souvent référence au même code.)

Tout d’abord, je déjà compris le butde l’agencement groupé et de la minification, donc inutile de discuter de cela. Cependant, je comprends non ce qui se passe avec la façon dont les scripts sont inclus dans le page maître par défaut.

Question 1:
Pourquoi un ensemble nommé "~/bundles/WebFormsJs" est-il créé dans le fichier BundleConfig.cs, et pourtant dans la page maître, chacun de ces mêmes fichiers .js individuels est répertorié un par un dans le fichier ScriptManager?

Dans BundleConfig.cs:

bundles.Add(new ScriptBundle("~/bundles/WebFormsJs").Include(
              "~/Scripts/WebForms/WebForms.js",
              "~/Scripts/WebForms/WebUIValidation.js",
              "~/Scripts/WebForms/MenuStandards.js",
              "~/Scripts/WebForms/Focus.js",
              "~/Scripts/WebForms/GridView.js",
              "~/Scripts/WebForms/DetailsView.js",
              "~/Scripts/WebForms/TreeView.js",
              "~/Scripts/WebForms/WebParts.js"));

Inside Site.Master:

<body>
<form runat="server">
<asp:ScriptManager runat="server">
    <Scripts>
        <%--Framework Scripts--%>
        <asp:ScriptReference Name="MsAjaxBundle" />
        <asp:ScriptReference Name="jquery" />
        <asp:ScriptReference Name="jquery.ui.combined" />
        <asp:ScriptReference Name="WebForms.js" Assembly="System.Web" Path="~/Scripts/WebForms/WebForms.js" />
        <asp:ScriptReference Name="WebUIValidation.js" Assembly="System.Web" Path="~/Scripts/WebForms/WebUIValidation.js" />
        <asp:ScriptReference Name="MenuStandards.js" Assembly="System.Web" Path="~/Scripts/WebForms/MenuStandards.js" />
        <asp:ScriptReference Name="GridView.js" Assembly="System.Web" Path="~/Scripts/WebForms/GridView.js" />
        <asp:ScriptReference Name="DetailsView.js" Assembly="System.Web" Path="~/Scripts/WebForms/DetailsView.js" />
        <asp:ScriptReference Name="TreeView.js" Assembly="System.Web" Path="~/Scripts/WebForms/TreeView.js" />
        <asp:ScriptReference Name="WebParts.js" Assembly="System.Web" Path="~/Scripts/WebForms/WebParts.js" />
        <asp:ScriptReference Name="Focus.js" Assembly="System.Web" Path="~/Scripts/WebForms/Focus.js" />
        <asp:ScriptReference Name="WebFormsBundle" />
        <%--Site Scripts--%>

    </Scripts>
</asp:ScriptManager>

Comme vous pouvez le constater .... chacun de ces mêmes fichiers .js est répertorié individuellement dans le ScriptManager. Je ne vois même pas de référence au paquet "WebFormsJs" créé ailleurs que dans BundleConfig.cs. Pourquoi cet ensemble at-il été créé si chacun de ces fichiers JavaScript devait être référencé individuellement ici, dans ScriptManager?

Question 2:
Pourquoi un ScriptManager est-il utilisé de cette manière? J'avais l'impression que ScriptManager était requis pour la version Ajax de Microsoft, comme l'utilisation de UpdatePanels. Quel est le but d'utiliser ScriptManager ici ... juste pour simplement enregistrer des fichiers javascript?

Question 3:
Quelle est la différence entre l’enregistrement de fichiers JavaScript via le ScriptManager et le sommet de Site.Master où l’approche suivante est utilisée?

<%: Scripts.Render("~/bundles/modernizr") %>

Question 4:
Dans le ScriptManager, j’ai aussi remarqué ces derniers:

        <asp:ScriptReference Name="MsAjaxBundle" />
        <asp:ScriptReference Name="jquery" />
        <asp:ScriptReference Name="jquery.ui.combined" />

... Je peux au moins reconnaître "MsAjaxBundle" à partir de BundleConfig.cs, mais où sont définis jquery et jquery.ui.combined? J'ai fait une recherche et trouvé une référence à eux dans packages.config.

<package id="jQuery" version="1.7.1.1" targetFramework="net45" />
<package id="jQuery.UI.Combined" version="1.8.20.1" targetFramework="net45" />

Mais je ne comprends pas ce qui se passe ici non plus. Je pensais que packages.config était utilisé pour NuGet. De plus ... Je ne vois même pas un chemin répertorié ici pour l'emplacement de ces fichiers jQuery .js. Ils sont simplement listés ici et étrangement associés à une version particulière du .NET Framework (4.5 dans mon cas). Pourquoi une ressource javascript serait associée à une version du .NET Framework me dépasse.

Quoi qu'il en soit, la question 4 est la suivante: comment la ressource "jQuery" dans le ScriptManager est-elle ajoutée/utilisée? Pourquoi ne vois-je pas les fichiers jQuery .js regroupés dans BundleConfig.cs comme tous les autres?

Question 5:
Puis-je supprimer la référence de script suivante de Site.Master si je ne prévois pas utiliser UpdatePanel et ces types de contrôles Microsoft Ajax? Je suis un peu confus quant à la raison pour laquelle cela est même inclus ici par défaut.

<asp:ScriptReference Name="MsAjaxBundle" />
50
ClearCloud8

UPDATE: Ceci est un nouveau billet de blog qui parle aussi de ceci: Article ASP.NET

En gros, webforms + bundling ressemble à ceci en raison d'un ensemble de comportements hérités que nous n'avons pas pu modifier dans Scriptmanager.

En ce qui concerne vos questions spécifiques:

  1. Fondamentalement, cela signifie que la déduplication fonctionne correctement. Script Manager a une limitation pour les ressources de script d'origine qui les empêche d'être mappées sur le script. .The WebformsBundleJs est un mappage de script créé dans le code PreAppStart dans le nupkgs ScriptManager. (Je suis d'accord c'est presque impossible à découvrir)

  2. Les nouvelles fonctionnalités de la version 4.5, telles que la validation non intrusive, ont nécessité l'utilisation de jquery (via scriptmanager). C'est pourquoi le gestionnaire de scripts a été utilisé pour s'assurer que jquery ne soit pas rendu deux fois.

  3. Cela fonctionnera bien, mais il ne sera jamais dédupliqué avec ScriptManager. Donc, pour moderniser ce ne sera pas un problème.

  4. Les packages jquery déposent les fichiers jquery sur le disque de votre dossier Scripts.

  5. Cette référence tire dans le msajaxbundle qui contient tous les scripts ajax, si vous n'en avez pas besoin/ne les voulez pas, je pense que c'est sûr de le supprimer.

16
Hao Kung

Juste pour clarifier quelque chose de l'explication d'accepter la réponse pour la question 1:

La raison des références de script pour les fichiers js de formulaires Web individuels est d'autoriser les fichiers locaux (tels que "~/Scripts/WebForms/WebForms.js") de remplacer les mêmes fichiers existant dans System.Web.dll (Si vous reflétez le System.Web.dll et recherchez dans le dossier de références les mêmes fichiers .js).

0
Bolo

J'avais plus ou moins les mêmes questions aussi ...

Cependant, en ce qui concerne la question 4, j’ai un avis différent.

webFormsBundle et MsAjaxBundle sont deux références de script définies dans le PreAppStatCode (comme vous, je ne trouve pas où se trouve ce fichier). 

J'ai donc l'impression que, au même endroit (ScriptManager.WebForms PreAppStartCode), il existe par défaut une autre définition pour jquery et la référence de script jQueryUI. Ces références sont utilisées dans le gestionnaire de script. 

Ce processus est très important car, de cette manière, vous tirez parti de certaines fonctionnalités importantes telles que CDN, etc. EnableCDN dans le gestionnaire de scripts de votre page maître (EnableCdn = "true")

0