CORRECTIF : Vous recevez un message d’erreur « Plusieurs contrôles avec le même ID » lorsque vous ajoutez dynamiquement des contrôles utilisateur mis en cache aux formulaires Web

Symptômes

Lorsque vous ajoutez dynamiquement des contrôles utilisateur mis en cache à un formulaire Web, vous recevez un message d’erreur qui est semblable au suivant lorsque vous accédez à la page Web :
Plusieurs contrôles avec le même ID '_909b6e15b33' a été trouvés. FindControl requiert que les contrôles aient des ID uniques.


Description : Une exception non gérée s’est produite lors de l’exécution de la demande web en cours. Veuillez consulter la trace de la pile pour plus d'informations sur l'erreur et son origine dans le code.



Détails des exceptions : System.Web.HttpException : plusieurs contrôles avec le même ID '_909b6e15b33' a été trouvés. FindControl requiert que les contrôles aient des ID uniques.
Remarque Le mot « web » est incorrectement mise en majuscule dans ce message d’erreur.

Remarque Pour plus d’informations sur les contrôles utilisateur et de la mise en cache de sortie, consultez la section « Références » de cet article.

Cause

Ce problème se produit car un nom unique est passé à la fonction LoadCachedControl lorsque les contrôles dynamiques sont créés à partir du cache. Ce nom unique est destiné à être l’ID unique donné pour cette instance du contrôle utilisateur chargé dynamiquement. Toutefois, un ID généré est utilisé et le code généré n’est pas unique dans les contrôles utilisateur chargé dynamiquement. Ce comportement provoque le problème mentionné dans la section « Symptômes » de cet article.

Pour plus d’informations, cliquez sur le numéro ci-dessous pour afficher l’article correspondant dans la Base de connaissances Microsoft :

837000 la PartialCachingControl.CachedControl retourne toujours une référence null

Résolution

Important Ce correctif contient deux types de packages : un package Microsoft Windows Installer et un package Gestionnaire de composants optionnels (OCM). Si vous utilisez Windows Server 2003, vous devez spécifier que vous avez besoin de la mise à jour de Windows Server 2003 (OCM), parce que la Protection de fichiers Windows Server 2003 surveille les fichiers.NET Framework 1.1. Si vous utilisez un système d’exploitation différent de Windows Server 2003, vous devez continuer à utiliser le package Windows Installer.

Informations de mise à jour de logiciel

Un correctif est désormais disponible auprès de Microsoft, mais il ne vise qu'à corriger le problème décrit dans cet article. Doit être appliqué uniquement aux systèmes rencontrant ce problème spécifique. Ce correctif peut subir des tests supplémentaires. Par conséquent, si vous n’êtes pas sérieusement concerné par ce problème, nous vous recommandons d’attendre le prochain Microsoft.NET Framework 1.1 Service Pack 1 qui comprendra ce correctif.

Pour résoudre ce problème immédiatement, contactez les Services de Support technique Microsoft pour obtenir le correctif. Pour obtenir une liste complète des numéros de téléphone des Services de Support technique Microsoft et des informations sur les coûts de support, visitez le site Web de Microsoft à l'adresse suivante :Remarque Dans des cas particuliers, des frais généralement encourus pour les appels au support technique peuvent être annulés si un technicien du support technique Microsoft détermine qu'une mise à jour spécifique peut résoudre votre problème. Les coûts habituels du support technique s’appliqueront aux autres questions et problèmes qui ne relèvent pas de la mise à jour spécifique en question.

Nécessite un redémarrage

Vous devrez peut-être redémarrer votre ordinateur si les services ou les applications sont en cours d’exécution qui utilisent des fichiers qui sont répertoriés dans la section « Informations sur les fichiers » de cet article.

Informations sur les fichiers

La version anglaise de cette mise à jour logicielle a les attributs de fichier (ou version ultérieure) répertoriés dans le tableau suivant. Les dates et heures de ces fichiers sont répertoriés dans le temps universel coordonné (UTC). Lorsque vous affichez les informations de fichier, elles sont converties en heure locale. Pour trouver la différence entre l’UTC et l’heure locale, utilisez l’onglet Fuseau horaire dans l’outil Date et heure dans le Panneau de configuration.
   Date         Time   Version            Size    File name
--------------------------------------------------------------
04-Feb-2004 04:14 1.1.4322.996 258,048 Aspnet_isapi.dll
04-Feb-2004 04:14 1.1.4322.996 20,480 Aspnet_regiis.exe
04-Feb-2004 04:14 1.1.4322.996 32,768 Aspnet_state.exe
04-Feb-2004 04:14 1.1.4322.996 32,768 Aspnet_wp.exe
16-May-2003 00:49 33,522 Installpersistsqlstate.sql
16-May-2003 00:49 34,150 Installsqlstate.sql
04-Feb-2004 04:05 1.1.4322.996 94,208 Perfcounter.dll
04-Feb-2004 04:10 8,571 Smartnav.js
05-Feb-2004 05:11 1.1.4322.996 1,220,608 System.dll
05-Feb-2004 05:11 1.1.4322.996 241,664 System.messaging.dll
05-Feb-2004 05:11 1.1.4322.996 323,584 System.runtime.remoting.dll
05-Feb-2004 05:11 1.1.4322.996 131,072 System.runtime.serialization.formatters.soap.dll
05-Feb-2004 05:11 1.1.4322.996 1,257,472 System.web.dll
05-Feb-2004 05:11 1.1.4322.996 819,200 System.web.mobile.dll
05-Feb-2004 05:11 1.1.4322.996 569,344 System.web.services.dll
05-Feb-2004 05:11 1.1.4322.996 1,339,392 System.xml.dll
04-Feb-2004 04:10 14,482 Webuivalidation.js

État

Microsoft a confirmé qu’il s’agit d’un problème dans les produits Microsoft répertoriés dans la section « S’applique à » de cet article.

Plus d'informations

Procédure pour reproduire le problème

  1. Créer le dossier Web, par exemple, créez le dossier \inetpub\wwwrooot\PageCaching.
  2. Utilisez le code suivant pour créer un contrôle utilisateur nommé Test1.ascx et enregistrez-le dans le dossier Web créé à l’étape 1 :
    <%@ OutputCache Duration="60" VaryByParam="none" %><%@ Control Language="c#" "%>
    <asp:Label id="lblTest1" runat="server">Test 1 Control</asp:Label>&nbsp;
    <asp:Label id="lblDynamic" runat="server">Dynamic</asp:Label>
  3. Utilisez le code suivant pour créer un contrôle utilisateur nommé Test2.ascx et enregistrez-le dans le dossier Web créé à l’étape 1 :
    <%@ OutputCache Duration="60" VaryByParam="none" %><%@ Control Language="c#" "%>
    <asp:Label id="lblTest1" runat="server">Test 2 Control</asp:Label>&nbsp;
    <asp:Label id="lblDynamic" runat="server">Dynamic</asp:Label>
  4. Utilisez le code suivant pour créer un formulaire Web nommé PageCaching.aspx et enregistrez-le dans le dossier Web créé à l’étape 1 :
    <script runat=server>    void Page_Init(Object sender, EventArgs ev)
    {
    Control Pane = Page.FindControl("uc1");
    Control Item = (Control) LoadCachedControl("test1.ascx", "Dynamic1a");
    Pane.Controls.Add(Item);

    Pane = Page.FindControl("uc2");
    Item = (Control) LoadCachedControl("test2.ascx", "Dynamic2a");
    Pane.Controls.Add(Item);

    Pane = Page.FindControl("uc3");
    }

    public PartialCachingControl LoadCachedControl(string r_ControlName, string r_ControlID)
    {
    PartialCachingControl Control = (PartialCachingControl) Page.LoadControl(r_ControlName);
    Control.ID = r_ControlID;
    return Control;
    }
    </script>


    <%@ Page language="c#" %>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
    <HTML>
    <HEAD>
    <title>WebForm1</title>
    <meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1">
    <meta name="CODE_LANGUAGE" Content="C#">
    <meta name="vs_defaultClientScript" content="JavaScript">
    <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
    </HEAD>
    <body>
    <form id="Form1" method="post" runat="server">
    <table>
    <tr>
    <td id="uc1" runat="server"></td>
    </tr>
    <tr>
    <td id="uc2" runat="server"></td>
    </tr>
    <tr>
    <td id="uc3" runat="server"></td>
    </tr>
    </table>
    </form>
    </body>
    </HTML>
  5. Accédez à http://localhost/PageCaching/PageCaching.aspx. Vous recevez le message d’erreur décrit dans la section « Symptômes » de cet article.
Pour plus d’informations, cliquez sur le numéro ci-dessous pour afficher l’article correspondant dans la Base de connaissances Microsoft :

Description 824684 terminologie standard utilisée pour décrire les mises à jour logicielles de Microsoft

À l’aide de la classe de contrôle PartialCachingControl

La classe de contrôle PartialCachingControl possède une propriété CacheControl . La propriété CacheControl peut être utilisée pour déterminer si un contrôle utilisateur a déjà été mis en cache. La propriété CacheControl retourne le contrôle utilisateur que lorsque la sortie de la sortie du contrôle utilisateur n’est pas mis en cache. Si la sortie du contrôle utilisateur existe dans le cache de sortie, la propriété CacheControl retourne une référence null car le contrôle n’est jamais instancié (dans Microsoft Visual Basic, la propriété CacheControl renvoie la valeur Nothing). Toutefois, la propriété CacheControl retourne toujours FALSE si la classe de contrôle PartialCachingControl n’est pas dans l’arborescence du contrôle.

Références

Pour plus d’informations, cliquez sur les numéros ci-dessous pour afficher les articles correspondants dans la Base de connaissances Microsoft :

Vue d’ensemble des contrôles serveur ASP.NET 306459

308378 comment effectuer le cache à fragments dans ASP.NET à l’aide de Visual C# .NET

308645 comment effectuer le cache à fragments dans ASP.NET à l’aide de Visual Basic .NET

Propriétés

ID d'article : 834608 - Dernière mise à jour : 27 janv. 2017 - Révision : 1

Commentaires