REVISIÓN: Recibe un mensaje de error "Varios controles con el mismo identificador" cuando agrega dinámicamente a formularios Web Forms controles de usuario en caché

Síntomas

Al agregar dinámicamente controles de usuario en caché a un Webform, recibirá un mensaje de error que es similar al siguiente cuando va a la página Web:
Se encontraron varios controles con el mismo ID '_909b6e15b33'. FindControl requiere que los controles tengan identificadores únicos.


Descripción: Se ha producido una excepción no controlada durante la ejecución de la solicitud web actual. Revise el seguimiento de la pila para obtener más información acerca del error y dónde se originó en el código.



Detalles de excepciones: System.Web.HttpException: se encontraron varios controles con el mismo ID '_909b6e15b33'. FindControl requiere que los controles tengan identificadores únicos.
Nota: La palabra "web" se pone en mayúsculas incorrectamente en este mensaje de error.

Nota: Para obtener más información acerca de los controles de usuario y almacenamiento en caché de salida, consulte la sección "Referencias" de este artículo.

Causa

Este problema se produce porque un nombre único se pasa a la función LoadCachedControl cuando se crean controles dinámicos de la caché. Este nombre se pretende ser el identificador único que se asigna a esta instancia del control de usuario cargado dinámicamente. Sin embargo, se utiliza un identificador generado y el identificador generado no es único entre los controles de usuario cargado dinámicamente. Este comportamiento causa el problema que se menciona en la sección "Síntomas" de este artículo.

Para obtener información adicional, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:

837000 PartialCachingControl.CachedControl la propiedad siempre devuelve una referencia nula

Solución

Importante: Este hotfix contiene dos tipos de paquetes: un paquete de Microsoft Windows Installer y un paquete de administrador de componentes opcional (OCM). Si utiliza Windows Server 2003, debe especificar que requieren la actualización de Windows Server 2003 (OCM), porque la protección de archivos de Windows Server 2003 supervisa los archivos de.NET Framework 1.1. Si utiliza un sistema operativo distinto de Windows Server 2003, debe continuar utilizar el paquete de Windows Installer.

Información de actualización de software

Ahora hay una revisión compatible de Microsoft, pero sólo se diseñó para corregir el problema que se describe en este artículo. Sólo se aplica a sistemas que experimenten este problema específico. Esta revisión puede ser sometida a comprobaciones adicionales. Por lo tanto, si no se ve muy afectado por este problema, recomendamos que espere al próximo Microsoft.NET Framework 1.1 Service Pack 1 que contenga este hotfix.

Para resolver este problema inmediatamente, póngase en contacto con los servicios de soporte técnico de Microsoft para obtener la revisión. Para obtener una lista completa de números de teléfono de servicios de soporte técnico de Microsoft e información acerca de los costos de soporte técnico, visite el siguiente sitio Web de Microsoft:Nota: En casos especiales, los costos derivados normalmente de las llamadas al soporte técnico pueden cancelarse si un profesional de soporte técnico de Microsoft determina que una actualización específica resolverá el problema. Los costos habituales de soporte se aplicarán a las preguntas de soporte técnico adicionales y problemas que no guarden relación con la actualización en cuestión.

Requisito de reinicio

Tendrá que reiniciar el equipo si está ejecutando alguna aplicación o servicio que utilice los archivos que se enumeran en la sección "Información de archivos" de este artículo.

Información de archivo

La versión en inglés de esta actualización de software tiene los atributos de archivo (o posterior) que figuran en la tabla siguiente. Las fechas y horas de estos archivos se muestran en hora universal coordinada (UTC). Al ver la información del archivo, se convierte en hora local. Para encontrar la diferencia entre la hora UTC y la hora local, utilice la ficha zona horaria en la herramienta fecha y hora del Panel de Control.
   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

Estado

Microsoft ha confirmado que se trata de un problema de los productos de Microsoft que se enumeran en la sección "Se aplica a" de este artículo.

Más información

Pasos para reproducir el problema

  1. Crear la carpeta Web, por ejemplo, cree la carpeta \inetpub\wwwrooot\PageCaching.
  2. Utilice el código siguiente para crear un control de usuario que se denomina Test1.ascx y guárdelo en la carpeta de Web que creó en el paso 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. Utilice el código siguiente para crear un control de usuario que se denomina Test2.ascx y guárdelo en la carpeta de Web que creó en el paso 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. Utilice el código siguiente para crear un formulario Web que se denomina PageCaching.aspx y guárdelo en la carpeta de Web que creó en el paso 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. Vaya a http://localhost/PageCaching/PageCaching.aspx. Recibe el mensaje de error que se describe en la sección "Síntomas" de este artículo.
Para obtener información adicional, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:

824684 descripción de la terminología estándar que se utiliza para describir las actualizaciones de software de Microsoft

Mediante la clase PartialCachingControl

La clase PartialCachingControl tiene una propiedad CacheControl . La propiedad CacheControl puede utilizarse para determinar si se ha almacenado un control de usuario. La propiedad CacheControl devuelve el control de usuario sólo cuando la salida del resultado del control de usuario no se almacena en caché. Si el resultado del control de usuario existe en la caché de resultados, la propiedad CacheControl devuelve una referencia nula porque el control nunca se instancia (en Microsoft Visual Basic, la propiedad CacheControl devuelve Nothing). Sin embargo, la propiedad CacheControl siempre devuelve FALSE si la clase PartialCachingControl no está en el árbol de control.

Referencias

Para obtener información adicional, haga clic en los números de artículo siguientes para verlos en Microsoft Knowledge Base:

Resumen de controles de servidor ASP.NET 306459

308378 cómo realizar una caché fragmentada en ASP.NET mediante Visual C#.

308645 cómo realizar una caché fragmentada en ASP.NET utilizando Visual Basic .NET

Propiedades

Id. de artículo: 834608 - Última revisión: 17 ene. 2017 - Revisión: 1

Comentarios