Controle personalizado em asp.net C#
-
25-09-2019 - |
Pergunta
Eu criei um controle personalizado simples que apenas herda do Literal
Controle e ainda não possui nenhuma extensão, o código está vazio.
Namespace: CustomControls
Nome da classe: literal: system.web.ui.webcontrols.literal
A próxima coisa que faço é registrar esse controle no aspx
página como seguinte:
<%@ Register TagPrefix="web" Namespace="CustomControls" %>
(Eu li em poucos tutoriais que essa é uma das maneiras de registrá -lo, além de web.config etc.)
Afinal, não há inteligência para mim e, pior, recebo um erro de análise 'Unknown Server Tag: Web' quando tento executar a página com o controle nela.
Eu usei 'Criar novo projeto' e não um novo site, caso essas informações sejam necessárias.
Qual poderia ser o meu problema?
Desde já, obrigado.
Solução
Aqui está como eu fiz isso, passo a passo começando do nada. Este primeiro método usa um segundo projeto/montagem. Para a versão app_code role para baixo.
Método do projeto de aplicativo da web
- Crie um novo aplicativo da Web ASP.NET. Tome nota do nome, o meu é chamado WebApplication2. Se você já possui um aplicativo da Web existente, o que é provável, clique duas vezes na seção Propriedades do seu projeto e verifique a propriedade "Nome da montagem", anote -o.
- Crie uma nova classe no aplicativo da web chamado literal.cs
Coloque em código semelhante ao seguinte para a definição da classe:
namespace CustomControls { public class Literal : System.Web.UI.WebControls.Literal { } }
Adicione a seguinte tag de registro à parte superior da sua página ASPX
< %@ Register Assembly = "WebApplication2" Namespace = "CustomControls" TagPrefix = "Web" %>
Se o nome da sua montagem foi diferente, mude -o aqui. Percebi que, quando fiz isso no vb.net, o espaço para o nome da WebApplication1.CustomControls, em vez de apenas controlos personalizados, como se estivesse em C#, meio estranho.
Adicione o novo controle à sua página:
u003Cweb:Literal ID="Literal1" runat="server" Text="test" />
Método separado do projeto
- Crie um novo site vazio (asp.net).
- Adicione uma nova biblioteca de controle do servidor ASP.NET chamada CustomControls à solução.
Adicione uma nova classe ao novo projeto chamado Literal (estou usando C# para que meu arquivo seja chamado Literal.cs). Abaixo está o meu código super básico, que acredito que deve corresponder ao código descrito na pergunta.
namespace CustomControls { public class Literal : System.Web.UI.WebControls.Literal { } }
Adicione uma referência ao projeto CustomControls ao seu site.
Adicione o registro da montagem ao topo da sua página ASPX:
< %@ Register Assembly = "CustomControls" Namespace = "CustomControls" TagPrefix = "Web" %>
Adicione uma nova instância do controle à sua página:
u003Cweb:Literal ID="Literal1" runat="server" Text="test" />
No método app_code
- Crie um novo site vazio (asp.net).
Adicione uma nova classe à pasta App_code literal2 (estou usando C# para que meu arquivo seja chamado Literal2.cs). Abaixo está o meu código super básico, que acredito que deve corresponder ao código descrito na pergunta. Liguei para 2 para que você possa usar isso em conjunto com o método descrito acima sem obter erros de compilação
namespace CustomControls { public class Literal2 : System.Web.UI.WebControls.Literal { } }
Registre o espaço de montagem/nome para app_code em sua página ASPX, adicionando a seguinte linha ao topo
< %@ Registro namespace = "CustomControls" Assembly = "__ Code" TagPrefix = "Web" %>
Adicione uma instância do novo controle à sua página:
u003Cweb:Literal2 ID="literal2" runat="server" Text="test2" />
Eu testei isso usando o Visual Studio e tudo funcionou bem para mim.
Outras dicas
Você também pode registrar seu controle no web.config se quiser usá -lo em outras páginas
<pages>
<controls>
<add tagPrefix="asp" namespace="System.Web.UI" assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
<add tagPrefix="asp" namespace="System.Web.UI.WebControls" assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
<add tagPrefix="web" namespace="MyProject.CustomControls" assembly="MyProject" />
</controls>
</pages>
Para o site, isso funcionará
<add tagPrefix ="web" namespace="ASP.App_Code.CustomControls" />
O problema está em seu <%@ Register TagPrefix="web" Namespace="CustomControls" %>
Tag: perde o nome da assembléia!
Deve se tornar <%@ Register TagPrefix="web" Namespace="CustomControls" Assembly="YourAssemblyName" %>
. Se você tiver dificuldades em encontrar o nome da assembléia para sua aula, aqui estão algumas dicas:
- Se você criou a classe dentro do projeto Visual Studio do aplicativo da web, ou em um projeto DLL (Biblioteca Compartilhada) separada, clique com o botão direito do mouse no projeto e vá para propriedades para obter o nome da montagem
- Se você criou o arquivo .cs no diretório app_code,
ASP.App_Code
Deveria trabalhar
Caso contrário, forneça algumas informações sobre o layout do projeto!
A coisa mais fácil a fazer é arrastar e soltar o literal.ascx para a página (se a página estiver na mesma solução) .Se a página for outra solução, você poderá adicionar o controle à caixa de ferramentas VS e arrastar e- -Drop o controle na página.
Você esqueceu o atributo SRC.
<%@ Register TagPrefix="web" Namespace="CustomControls" Src="PathToYourCustomControl" %>