CORRECÇÃO: Recebe uma mensagem de erro "Vários controlos com o mesmo ID" quando adicionar dinamicamente controlos de utilizador em cache para Webforms

Traduções de Artigos Traduções de Artigos
Artigo: 834608 - Ver produtos para os quais este artigo se aplica.
Expandir tudo | Reduzir tudo

Nesta página

Sintomas

Quando adicionar dinamicamente controlos de utilizador em cache para um Webform, receberá uma mensagem de erro semelhante à seguinte quando navega para a página Web:
Foram encontrados vários controlos com o mesmo ID '_909b6e15b33'. FindControl requer que os controlos tenham ID exclusivos.

Descrição: Ocorreu uma excepção não processada durante a execução da solicitação da web actual. Reveja o rastreio da pilha para mais informações sobre o erro e onde tem origem no código.

Detalhes da excepção: System.Web.HttpException: foram encontrados vários controlos com o mesmo ID '_909b6e15b33'. FindControl requer que os controlos tenham ID exclusivos.
Nota A palavra "web" está em maiúsculas incorrectamente nesta mensagem de erro.

Nota Para obter mais informações sobre controlos de colocação em cache e utilizador de saída, consulte a secção "Referências" deste artigo.

Causa

Este problema ocorre porque um nome exclusivo é transmitido à função LoadCachedControl quando controlos dinâmicos são criados a partir da cache. Este nome foi concebido para ser o ID exclusivo atribuído nesta instância do controlo de utilizador carregados dinamicamente. No entanto, um código gerado é utilizado e o código gerado não é exclusivo entre os controlos de utilizador carregados dinamicamente. Este comportamento faz com que o problema mencionado na secção "Sintomas" deste artigo.

Para obter informações adicionais, clique no número de artigo que se segue para visualizar o artigo na Microsoft Knowledge Base:
837000A propriedade PartialCachingControl.CachedControl devolve sempre uma referência nula

Resolução

importante Esta correcção contém dois tipos de pacotes: um pacote do Microsoft Windows Installer e um pacote de Gestor de componentes opcionais (OCM). Se utilizar o Windows Server 2003, tem de especificar que requerem a actualização do Windows Server 2003 (OCM), uma vez que os ficheiros do .NET Framework 1.1 monitoriza a protecção de ficheiros do Windows Server 2003. Se utilizar um sistema operativo que é diferente do Windows Server 2003, terá de continuar utilizar o pacote do Windows Installer.

Informações de actualização de software

Agora é disponibilizada pela Microsoft uma correcção suportada, mas destina-se apenas a corrigir o problema descrito neste artigo. Aplique-a apenas em sistemas que tenham este problema específico. Esta correcção poderá submetida a testes adicionais. Por conseguinte, se não estiver a ser gravemente afectado por este problema, recomendamos que aguarde o próximo Microsoft .NET Framework 1.1 Service Pack 1 que contenha esta correcção.

Para resolver este problema imediatamente, contacte o suporte técnico da Microsoft para obter a correcção. Para obter uma lista completa de números de telefone do suporte técnico da Microsoft e informações sobre os custos de suporte, visite o seguinte Web site da Microsoft:
http://support.microsoft.com/contactus/?ws=support
Nota Em casos especiais, os custos normalmente inerentes às chamadas de suporte poderão ser anulados, se um técnico de suporte da Microsoft determinar que uma actualização específica resolverá o problema. Os custos normais do suporte serão aplicados a problemas adicionais e questões de suporte que não se enquadrem na atualização específica em questão.

Requisito de reinício

Poderá ter de reiniciar o computador se quaisquer serviços ou aplicações estiverem em execução que utilize ficheiros que estão listados na secção "Informações sobre os ficheiros" deste artigo.

Informações do ficheiro

A versão inglesa desta actualização de software tem os atributos de ficheiro (ou posteriores) listados na seguinte tabela. As datas e horas destes ficheiros são indicadas no formato de universal hora (UTC) coordenada Coordinated. Quando visualiza as informações do ficheiro, é convertido para a hora local. Para determinar a diferença entre a UTC e a hora local, utilize o separador fuso horário na ferramenta Data e hora no painel de controlo.
   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

Ponto Da Situação

A Microsoft confirmou que este é um problema nos produtos da Microsoft listados na secção "Aplica-se a" deste artigo.

Mais Informação

Passos para reproduzir o problema

  1. Criar a pasta Web, por exemplo, crie a pasta \inetpub\wwwrooot\PageCaching.
  2. Utilize o seguinte código para criar um controlo de utilizador chama Test1.ascx e guarde-lo para a pasta Web que foi criada no passo 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. Utilize o seguinte código para criar um controlo de utilizador chama Test2.ascx e guarde-lo para a pasta Web que foi criada no passo 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. Use the following code to create a Web form that is named PageCaching.aspx, and then save it to the Web folder that was created in step 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. Procure http://localhost/PageCaching/PageCaching.aspx. Receberá a mensagem de erro descrita na secção "Sintomas" deste artigo.
Para obter informações adicionais, clique no número de artigo que se segue para visualizar o artigo na Microsoft Knowledge Base:
824684Descrição da terminologia padrão utilizada para descrever actualizações de software da Microsoft

Utilizando a classe PartialCachingControl

A classe PartialCachingControl tem uma propriedade CacheControl . A propriedade CacheControl pode ser utilizada para determinar se um utilizador o controlo foi colocado em já cache. A propriedade CacheControl devolve o controlo de utilizador apenas quando a saída a saída de controlo de utilizador não é colocado em cache. Se existir a saída de controlo de utilizador na cache de saída, a propriedade CacheControl devolve uma referência nula porque o controlo nunca é instanciado (no Microsoft Visual Basic, a propriedade CacheControl devolve nada). No entanto, a propriedade CacheControl sempre devolve FALSO se a classe PartialCachingControl não estiver na árvore de controlo.

Referências

Para obter informações adicionais, clique números de artigo que se seguem para visualizar os artigos na base de dados de conhecimento da Microsoft:
306459Descrição geral de controlos de servidor do ASP.NET
308378Como efectuar o fragmento de colocação em cache no ASP.NET utilizando o Visual C# .NET
308645Como efectuar o fragmento de colocação em cache no ASP.NET utilizando o Visual Basic .NET

Propriedades

Artigo: 834608 - Última revisão: 7 de abril de 2006 - Revisão: 4.2
A informação contida neste artigo aplica-se a:
  • Microsoft .NET Framework 1.1
  • Microsoft Visual Studio .NET 2003 Professional Edition
  • Microsoft Visual Studio .NET 2003 Enterprise Developer
  • Microsoft Visual Studio .NET 2003 Enterprise Architect
  • Microsoft ASP.NET 1.1
Palavras-chave: 
kbmt kbqfe kbhotfixserver kbfix kbnetframe110presp1fix kbcodegen kbcode kbbug KB834608 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 834608

Submeter comentários

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com