Demonstra Passo a passo: Criando um controle de Web do ASP.NET personalizados ligados a dados para ASP.NET 2.0
Essa explicação passo a passo mostra como criar um simples controle de servidor Web associado a dados no ASP.NET 2.0.Na versão ASP.NET 2.0, um novo modelo de fonte de dados permite que você acople controles associados a dados aos controles de fonte, permitindo que operações de dados comuns - como paginação, ordenação, e exclusão - sejam removidas do controle associado a dados em si.Esse modelo possibilita uma maior flexibilidade do controle associado a dados para desenvolvedores de páginas e aumenta o nível de reuso.O modelo fonte de dados ASP.NET 2.0 também oferece suporte à ligação diretamente para um objeto da coleção de dados.Para obter mais informações sobre o desenvolvimento personalizados controles ligados a dados para o modelo de dados ASP.NET 2.0, consulte Desenvolvendo Controles Personalizados de Servidores Web Vinculados a Dados para ASP.NET 2.0.
Nesta explicação passo a passo, você criará um controle associado a dados que pode se vincular a qualquer objeto que implementa a interface IEnumerable.
Tarefas ilustradas nesta explicação passo a passo incluem o seguinte:
A criação de um site para testar o controle associado a dados personalizado com compilação dinâmica.
Criar uma classe controle vinculado a dados que estende a classe base DataBoundControl.Essa classe exibe uma coluna de tabela que representa os dados associados.A seguir é uma visão geral sobre o que a classe controle associado a dados deve fornecer:
Uma substituição do método PerformSelect da classe base controle associado a dados.Dentro desse método, tarefas são executadas para iniciar a recuperação de dados.
Um método com um único parâmetro do tipo IEnumerable para receber os dados retornados.Qualquer processamento de dados que pode ser necessário é executada dentro desse método.Como última etapa, o método PerformDataBinding é chamado para iniciar associação de dados.
Uma substituição do método PerformDataBinding.Dentro desse método os dados recuperados são enumerados e controles filho são adicionados para representar os dados.
Registrando o controle no arquivo web.config.
Testando o controle em um página ASP.NET.
Compilando o controle de modo que você pode distribuí-lo como código binário.
Testando o controle personalizado de servidor associado a dados compilado.
Criando um site da Web para testar o controle
Você pode usar a compilação dinâmica do ASP.NET para testar o controle em uma página sem compilar o controle em um conjunto de módulos (assembly).O ASP.NET compila dinamicamente código localizado no diretório App_Code na raiz de um site ASP.NET.Classes em arquivos de origem em App_Code podem, portanto, serem acessadas a partir de páginas sem serem compiladas manualmente em conjuntos de módulos (assemblies).
Observação: |
---|
O diretório App_Code não está disponível no ASP.NET 1.0 e 1.1.Usar o diretório App_Code para um teste inicial do controle é opcional.As etapas principais da criação de um controle de servidor são as mesmas que as versões anteriores do ASP.NET, conforme descrito na próxima seção "Compilando o controle em um conjunto de módulos (assembly)". |
Para criar um site da Web para testar controles personalizados ligados a dados.
Crie um site denominado ServerControlsTest.
Você pode criar o site no IIS como um diretório virtual denominado ServerControlsTest.Para obter detalhes sobre como criar e configurar um diretório virtual o IIS, consulte Como: Criar e configurar diretórios virtual no IIS 5.0 e 6.0.
Crie um diretório App_Code diretamente sob a diretório raiz de seu Web site (a raiz do aplicativo Web).
Criando a classe SimpleDataBoundColumn
Nesta seção, você criará a classe controle associado a dados que estende a classe DataBoundControl.O novo controle exibe os dados associados a uma tabela de uma coluna.
Para criar a classe SimpleDataBoundColumn
Na pasta App_Code, crie uma classe denominada SimpleDataBoundColumn.cs ou SimpleDataBoundColumn.vb.
Adicione o seguinte código ao seu arquivo classe:
Imports System Imports System.Collections Imports System.ComponentModel Imports System.Security.Permissions Imports System.Web Imports System.Web.UI Imports System.Web.UI.WebControls Namespace Samples.AspNet.Controls.VB <AspNetHostingPermission(SecurityAction.Demand, _ Level:=AspNetHostingPermissionLevel.Minimal), _ AspNetHostingPermission(SecurityAction.InheritanceDemand, _ Level:=AspNetHostingPermissionLevel.Minimal)> _ Public Class SimpleDataBoundColumn Inherits DataBoundControl Public Property DataTextField() As String Get Dim o As Object = ViewState("DataTextField") If o Is Nothing Then Return String.Empty Else Return CStr(o) End If End Get Set(ByVal value As String) ViewState("DataTextField") = value If (Initialized) Then OnDataPropertyChanged() End If End Set End Property Protected Overrides Sub PerformSelect() ' Call OnDataBinding here if bound to a data source using the ' DataSource property (instead of a DataSourceID), because the ' databinding statement is evaluated before the call to GetData. If Not IsBoundUsingDataSourceID Then OnDataBinding(EventArgs.Empty) End If ' The GetData method retrieves the DataSourceView object from ' the IDataSource associated with the data-bound control. GetData().Select(CreateDataSourceSelectArguments(), _ AddressOf OnDataSourceViewSelectCallback) ' The PerformDataBinding method has completed. RequiresDataBinding = False MarkAsDataBound() ' Raise the DataBound event. OnDataBound(EventArgs.Empty) End Sub Private Sub OnDataSourceViewSelectCallback(ByVal retrievedData As IEnumerable) ' Call OnDataBinding only if it has not already been ' called in the PerformSelect method. If IsBoundUsingDataSourceID Then OnDataBinding(EventArgs.Empty) End If ' The PerformDataBinding method binds the data in the ' retrievedData collection to elements of the data-bound control. PerformDataBinding(retrievedData) End Sub Protected Overrides Sub PerformDataBinding(ByVal retrievedData As IEnumerable) MyBase.PerformDataBinding(retrievedData) ' Verify data exists. If Not (retrievedData Is Nothing) Then Dim tbl As New Table() Dim row As TableRow Dim cell As TableCell Dim dataStr As String = String.Empty Dim dataItem As Object For Each dataItem In retrievedData ' If the DataTextField was specified get the data ' from that field, otherwise get the data from the first field. If DataTextField.Length > 0 Then dataStr = DataBinder.GetPropertyValue(dataItem, DataTextField, Nothing) Else Dim props As PropertyDescriptorCollection = TypeDescriptor.GetProperties(dataItem) If props.Count >= 1 Then If Nothing <> props(0).GetValue(dataItem) Then dataStr = props(0).GetValue(dataItem).ToString() End If End If End If row = New TableRow() tbl.Rows.Add(row) cell = New TableCell() cell.Text = dataStr row.Cells.Add(cell) Next dataItem Controls.Add(tbl) End If End Sub End Class End Namespace
using System; using System.Collections; using System.ComponentModel; using System.Security.Permissions; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace Samples.AspNet.Controls.CS { [AspNetHostingPermission(SecurityAction.Demand, Level = AspNetHostingPermissionLevel.Minimal)] [AspNetHostingPermission(SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)] public class SimpleDataBoundColumn : DataBoundControl { public string DataTextField { get { object o = ViewState["DataTextField"]; return ((o == null) ? string.Empty : (string)o); } set { ViewState["DataTextField"] = value; if (Initialized) { OnDataPropertyChanged(); } } } protected override void PerformSelect() { // Call OnDataBinding here if bound to a data source using the // DataSource property (instead of a DataSourceID), because the // databinding statement is evaluated before the call to GetData. if (!IsBoundUsingDataSourceID) { this.OnDataBinding(EventArgs.Empty); } // The GetData method retrieves the DataSourceView object from // the IDataSource associated with the data-bound control. GetData().Select(CreateDataSourceSelectArguments(), this.OnDataSourceViewSelectCallback); // The PerformDataBinding method has completed. RequiresDataBinding = false; MarkAsDataBound(); // Raise the DataBound event. OnDataBound(EventArgs.Empty); } private void OnDataSourceViewSelectCallback(IEnumerable retrievedData) { // Call OnDataBinding only if it has not already been // called in the PerformSelect method. if (IsBoundUsingDataSourceID) { OnDataBinding(EventArgs.Empty); } // The PerformDataBinding method binds the data in the // retrievedData collection to elements of the data-bound control. PerformDataBinding(retrievedData); } protected override void PerformDataBinding(IEnumerable retrievedData) { base.PerformDataBinding(retrievedData); // Verify data exists. if (retrievedData != null) { Table tbl = new Table(); TableRow row; TableCell cell; string dataStr = String.Empty; foreach (object dataItem in retrievedData) { // If the DataTextField was specified get the data // from that field, otherwise get the data from the first field. if (DataTextField.Length > 0) { dataStr = DataBinder.GetPropertyValue(dataItem, DataTextField, null); } else { PropertyDescriptorCollection props = TypeDescriptor.GetProperties(dataItem); if (props.Count >= 1) { if (null != props[0].GetValue(dataItem)) { dataStr = props[0].GetValue(dataItem).ToString(); } } } row = new TableRow(); tbl.Rows.Add(row); cell = new TableCell(); cell.Text = dataStr; row.Cells.Add(cell); } this.Controls.Add(tbl); } } } }
Discussão de Código
A classe SimpleDataBoundColumn deriva da classe base DataBoundControl de associação de dados.A derivação deste classe base fornece propriedades de associação de dados DataSourceID, DataSource e DataMember expostos.Essas propriedades expostas permitem um desenvolvedor de página especificar a fonte de dados e um membro de dados específico para vincular a este controle personalizado.
Para ilustrar como adicionar propriedades personalizadas de associação de dados adicionais, uma propriedade DataTextField foi adicionada à classe SimpleDataBoundColumn.Quando o desenvolvedor de página define a propriedade DataTextField, o novo valor é armazenado em estado de exibição.Ele também chama o método OnDataPropertyChanged se o controle já foi inicializado.Isso força o controle associado a dados a reassociar os dados de forma que o controle pode usar a nova configuração de propriedades de associação de dados.
O método DataBind substituído é necessário, e inclui a lógica para enumerar o objeto na fonte de dados associada e criar controles filho.As seguintes tarefas devem ser executadas em controles associados a dados ASP.NET 2.0 no método DataBind substituído, conforme mostrado na classe SimpleDataBoundColumn:
A propriedade IsBoundUsingDataSourceID é verificada para um valor false para determinar se a fonte de dados está especificada na propriedade DataSource.
Se os dados a serem vinculados estão especificados na propriedade DataSource, o método OnDataBinding é chamado para vincular o membro de dados que é especificado na propriedade DataSource.
O método GetData é chamado para recuperar o objeto DataSourceView que está associado ao controle associado a dados.
O método Select do objeto DataSourceView recuperado é chamado para iniciar a recuperação de dados e especificar o método callback OnDataSourceViewSelectCallback que manipulará os dados recuperados.
Para indicar que as tarefas de recuperação de dados do método PerformSelect são completas, a propriedade RequiresDataBinding é definida como false e, em seguida, o método MarkAsDataBound é chamado.
O evento OnDataBound é gerado.
O método callback OnDataSourceViewSelectCallback recebe os dados recuperados.Esta método callback deve aceitar um único parâmetro do tipo IEnumerable.Qualquer processamento de dados deve ocorrer aqui se o controle personalizado requiser.Este controle personalizado usa os dados como estão.Portanto, nenhum processamento adicional de dados ocorre neste exemplo.Como última etapa, o método PerformDataBinding é chamado para iniciar o processo de vinculação de dados.
Na substituição do método PerformDataBinding, todos os controles filhos que representarão os dados são criados.A coleção de dados é enumerada e um novo objeto TableCell é criado para cada item de dados.Se a propriedade DataTextField é definida, ela é usada para determinar qual campo de dados está vinculado à propriedade Text da célula.Caso contrário, o primeiro campo é usado.
O controle Table pai é adicionado ao controle personalizado SimpleDataBoundColumn da coleção Controls.Qualquer controle que é adicionado à coleção Controls do controle é automaticamente processada enquanto o método Render herdado é executado.
Para obter mais informações sobre as implementações necessárias de uma controle de servidor Web de dados associados, consulte Desenvolvendo Controles Personalizados de Servidores Web Vinculados a Dados para ASP.NET 2.0.
Criando um prefixo de marca
Um prefixo de marca é o prefixo, como "ASP" na <asp:Table />, que aparece antes do nome do tipo de controle quando o controle é criado declarativamente em uma página.Para permitir que seu controle seja usado declarativamente em uma página, o ASP.NET precisa um prefixo de marca que é mapeado para o espaço de nomes do seu controle.Um desenvolvedor de página pode fornecer um mapeamento de prefixo/espaço de nomes adicionando uma diretiva @ Register em cada página que usa o controle personalizado, como no exemplo a seguir:
<%@ Register TagPrefix="aspSample"
Namespace="Samples.AspNet.Controls.CS"%>
<%@ Register TagPrefix="aspSample"
Namespace="Samples.AspNet.Controls.VB"%>
Observação: |
---|
Observe que há nenhum atributo assembly que especifica o nome do conjunto de controle na diretiva @ Register.Quando o atributo assembly estiver faltando, o ASP.NET infere que o conjunto é compilado dinamicamente dos arquivos de origem no diretório App_Code. |
As an alternative to using the @ Register directive in each .aspx page, the page developer can specify the tag prefix and namespace mapping in the Web.config file.Isso é útil se o controle personalizado será usado em várias páginas em um aplicativo da Web.O procedimento a seguir descreve como especificar o mapeamento de prefixo de marca no arquivo web.config.
Para adicionar um mapeamento de prefixo de marca no arquivo web.config
Se o seu site da Web ainda não tiver um, crie um arquivo denominado Web.config na pasta raiz da página Web.
Se você criou um novo arquivo Web.config, copie a marcação XML a seguir para o arquivo e salve o arquivo.Se o seu site já tiver um arquivo Web.config, adicione o seguinte elemento realçado a ele.
Observação: A entrada de prefixo de marca deve ser um filho da seção controls, que deve estar na seção pages que, por sua vez deve ser um filho de system.web.
<?xml version="1.0"?> <configuration> <system.web> <pages> <controls> <add tagPrefix="aspSample" namespace="Samples.AspNet.Controls.CS" /> </controls> </pages> </system.web> </configuration>
<?xml version="1.0"?> <configuration> <system.web> <pages> <controls> <add tagPrefix="aspSample" namespace="Samples.AspNet.Controls.VB" /> </controls> </pages> </system.web> </configuration>
A seção realçada mostra uma entrada de prefixo de marca, que mapeia o prefixo de marca "aspSample" para o namespace Samples.AspNet.Controls.CS ou Samples.AspNet.Controls.VB.
Depois de especificar o mapeamento de prefixo de marca no arquivo de configuração, você pode usar o controle SimpleDataBoundColumn declarativamente (como <aspSample:SimpleDataBoundColumn />) em qualquer página do site.
Observação: |
---|
No ASP.NET 1.0 e 1.1 o mapeamento do prefixo de marca foi especificado na diretiva @ Register em cada página que usou o controle personalizado. |
Criando uma página para usar o controle personalizado de dados vinculados
Nesta seção da explicação passo a passo você criará uma marcação de página que vai permitir que você teste o controle personalizado associado a dados.
Para criar uma página que usa o controle personalizado associado a dados
No seu site da Web, crie um arquivo chamado TestSimpleDataBoundColumn.aspx.
Copie a marcação a seguir para o arquivo TestSimpleDataBoundColumn.aspx e salve o arquivo.
<%@ Page Language="VB" Trace="true"%> <%@ Register TagPrefix="aspSample" Namespace="Samples.AspNet.Controls.VB" %> <%@ Import Namespace="System.Data" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <script > Function CreateDataSource() As ICollection ' Create sample data for the DataList control. Dim dt As DataTable = New DataTable() dim dr As DataRow ' Define the columns of the table. dt.Columns.Add(New DataColumn("IntegerValue", GetType(Int32))) dt.Columns.Add(New DataColumn("StringValue", GetType(String))) dt.Columns.Add(New DataColumn("CurrencyValue", GetType(Double))) dt.Columns.Add(New DataColumn("ImageValue", GetType(String))) ' Populate the table with sample values. Dim i As Integer For i = 0 To 8 dr = dt.NewRow() dr(0) = i dr(1) = "Description for item " & i.ToString() dr(2) = 1.23 * (i + 1) dr(3) = "Image" & i.ToString() & ".jpg" dt.Rows.Add(dr) Next i Dim dv As DataView = New DataView(dt) Return dv End Function Sub Page_Load(sender As Object, e As EventArgs) ' Load sample data only once, when the page is first loaded. If Not IsPostBack Then simpleDataBoundColumn1.DataSource = CreateDataSource() simpleDataBoundColumn1.DataBind() End If End Sub </script> <head > <title>SimpleDataBoundColumn test page</title> </head> <body> <form id="form1" > <div> <aspSample:SimpleDataBoundColumn id="simpleDataBoundColumn1" DataTextField="CurrencyValue" BorderStyle="Solid"></aspSample:SimpleDataBoundColumn> </div> </form> </body> </html>
<%@ Page Language="C#" Trace="true"%> <%@ Register TagPrefix="aspSample" Namespace="Samples.AspNet.Controls.CS" %> <%@ Import Namespace="System.Data" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <script > ICollection CreateDataSource() { DataTable dt = new DataTable(); DataRow dr; dt.Columns.Add(new DataColumn("IntegerValue", typeof(Int32))); dt.Columns.Add(new DataColumn("StringValue", typeof(string))); dt.Columns.Add(new DataColumn("CurrencyValue", typeof(double))); for (int i = 0; i < 9; i++) { dr = dt.NewRow(); dr[0] = i; dr[1] = "Item " + i.ToString(); dr[2] = 1.23 * (i + 1); dt.Rows.Add(dr); } DataView dv = new DataView(dt); return dv; } protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { simpleDataBoundColumn1.DataSource = CreateDataSource(); simpleDataBoundColumn1.DataBind(); } } </script> <head > <title>SimpleDataBoundColumn test page</title> </head> <body> <form id="form1" > <div> <aspSample:SimpleDataBoundColumn id="simpleDataBoundColumn1" DataTextField="CurrencyValue" BorderStyle="Solid"></aspSample:SimpleDataBoundColumn> </div> </form> </body> </html>
Execute a página SimpleDataBoundColumnTest.aspx.
Faça algumas alteração no o código-fonte do controle personalizado.Por exemplo, escreva uma sequência de caracteres adicional, adicionando esta linha de código no final do método RenderContents:
writer.Write("<br />Testing how the App_Code directory works.");
writer.Write("<br />Testing how the App_Code directory works.")
Atualize a página SimpleDataBoundColumnTest.aspx no seu navegador.
Você verá que as alterações no controle são refletidas na página mesmo que você não compile o controle.
Compilando o controle em um conjunto de módulos (assembly)
O diretório App_Code permite que você teste seu controle sem compilá-lo.No entanto, se você quiser distribuir o controle como código de objeto para outros desenvolvedores, você deve compilá-lo.Além disso, um controle não pode ser adicionado à caixa de ferramentas de um designer de visual, a menos que ele seja compilado em um conjunto de módulos (assembly).
Compilando o controle em um conjunto de módulos (assembly)
Definir a variável de ambiente do Windows PATH de seu computador para incluir o caminho para a instalação do .NET Framework, seguindo estas etapas:
No Windows, clique com o botão direito do mouse em Meu computador, clique em Propriedades, clique na guia Avançado e, em seguida, clique no botão Variáveis de Ambiente.
Na lista Variáveis do sistema, clique duas vezes na variável Path.
Na caixa de texto Variable value, adicione um ponto-e-vírgula (;) até o final dos valores existentes na caixa de texto e digite o caminho da instalação do .NET Framework.Geralmente o .NET Framework é instalado na pasta de instalação do Windows no \\Microsoft .NET\\Framework\versionNumber.
Clique OK para fechar cada caixa de diálogo.
Execute o seguinte comando a partir do diretório App_Code que contém os arquivos de origem criados em um procedimento anterior dessa explicação passo a passo.Isso gera um conjunto de módulos (assembly) denominado Samples.AspNet.CS.dll ou Samples.AspNet.Controls.VB.dll na pasta App_Code.
csc /t:library /out:Samples.AspNet.Controls.CS.dll /r:System.dll /r:System.Web.dll *.cs
vbc /t:library /out:Samples.AspNet.Controls.VB.dll /r:System.dll /r:System.Web.dll *.vb
A opção /t:library do compilador informa a esse para criar uma biblioteca, em vez de um conjunto de módulos executável (Assembly).A opção /outfornece um nome para o conjunto de módulos e a opção /r lista os módulos que estão vinculados ao seu conjunto de módulos.
Observação: Para manter o exemplo independente, essa explicação passo a passo solicita que você criar um conjunto de módulos (assembly) com um único controle.Em geral, as diretrizes de design do .NET Framework recomendam que você não crie conjuntos de módulos (assemblies) que contêm apenas algumas classes.Para facilitar a implantação, você deve criar menor número de conjuntos de módulos (assemblies) possível.
Usando o TagPrefixAttribute para fornecer um mapeamento de prefixo de marca/Espaço de nome
Anteriormente você viu como um desenvolvedor de página pode especificar um prefixo de marca na página ou no arquivo web.config.Quando você compila um controle, você pode, opcionalmente, sugerir um prefixo de marca padrão que um designer visual deve usar para o seu controle incluindo o atributo System.Web.UI.TagPrefixAttribute de nível de montagem.O atributo TagPrefixAttribute é útil porque ele fornece um prefixo de marca para um designer visual a ser usado se o designer não encontrar um mapeamento de prefixo de marca no arquivo web.config ou em uma diretiva @ Register na página.O prefixo de marca é registrado com a página na primeira vez o controle é clicado duas vezes na caixa de ferramentas ou arrastado da caixa de ferramentas até a página.
Se você decidir usar o atributo TagPrefixAttribute, você pode especificá-lo em um arquivo separado que é compilado com seus controles.Por convenção, o arquivo é nomeado AssemblyInfo. languageExtension, sistema autônomo AssemblyInfo.cs ou AssembyInfo.vb.O procedimento a seguir descreve como especificar o TagPrefixAttribute metadados.
Observação: |
---|
Se você não especificar TagPrefixAttribute no conjunto de montagem do controle, e o desenvolvedor de página não especificar o mapeamento de prefixo de marca/namespace na página ou no arquivo web.config, o designer visual pode criar um prefixo de marca padrão.Por exemplo, Visual Studio 2005 criará sua própria marca (como cc1) para o seu controle quando o controle é arrastado da caixa de ferramentas. |
Para adicionar um mapeamento de prefixo de marca utilizando um TagPrefixAttribute
Crie um arquivo chamado AssemblyInfo.cs ou AssemblyInfo.vb no diretório de código-fonte e adicione o código a seguir para o arquivo.
using System; using System.Web.UI; [assembly: TagPrefix("Samples.AspNet.Controls.CS", "aspSample")]
Imports System Imports System.Web.UI <Assembly: TagPrefix("Samples.AspNet.Controls.VB", "aspSample")>
O atributo de prefixo de marca cria um mapeamento entre o namespace Samples.AspNet.Controls.CS ou Samples.AspNet.Controls.VB e o prefixo aspSample.
Recompile todos os arquivos de origem usando o comando de compilação utilizado anteriormente (com ou sem o recurso incorporado).
Usando o controle compilado personalizado do servior de dados-vinculados em uma página ASP.NET
Para testar a versão compilada do seu controle personalizado, você deve tornar o conjunto de módulos (assembly) do controle acessível para páginas no Web site.
Para tornar o conjunto de módulos (assembly) do controle acessível para o site
Crie um diretório Bin abaixo da raiz do site.
Arraste o controle de conjunto de módulos (assembly) (Samples.AspNet.Controls.CS.dll ou Samples.AspNet.Controls.VB.dll) a partir do diretório App_Code para o diretório Bin.
Exclua arquivo de origem do controle do diretório App_Code.
Se você não excluir os arquivos de fonte, o tipo do seu controle existirá no assembly compilado e no assembly gerado dinamicamente criado pelo ASP.NET.Isso criará uma referência ambígua ao carregar o controle e qualquer página na qual o controle é usado irá gerar um erro do compilador.
O conjunto que você criou nessa explicação passo a passo é referenciado como um conjunto de módulos particular porque ele deve ser colocado no diretório Bin de um site ASP.NET para habilitar páginas no Web site para usar o seu controle.O conjunto de módulos não pode ser acessado a partir de outros aplicativos, a menos que também esteja instalada uma cópia nesses aplicativos.Se você estiver criando controles para aplicativos compartilhados hospedados na Web, você geralmente irá empacotar os controles em um conjunto de módulos particular.No entanto, se você criar controles para usar em um ambiente de hospedagem dedicado ou um conjunto de controles que um provedor de serviços de Internet torna disponível para todos os seus clientes, você talvez precise empacotar os controles em um conjunto compartilhado (altamente nomeado) instalado na cache global de conjunto de módulos (assemblies).Para obter mais informações, consulte Trabalhando com Assemblies e o Cache Global de Assemblies.
Em seguida, você deve modificar o mapeamento do prefixo de marca que você criou em Web.config para especificar o nome do conjunto de módulos (assembly) do seu controle.
Para modificar o mapeamento de prefixo de marca em Web.config
Edite o arquivo Web.config para adicionar um atributo assembly a um elemento tagPrefixadd:
<controls> <add tagPrefix="aspSample" namespace="Samples.AspNet.Controls.CS" assembly="Samples.AspNet.Controls.CS" /> </controls>
<controls> <add tagPrefix="aspSample" namespace="Samples.AspNet.Controls.VB" assembly="Samples.AspNet.Controls.VB" /> </controls>
The assembly atributo especifica que o nome do assembly do controle é no. An addtagPrefix element maps a tag prefix to a namespace and assembly combination.Quando o conjunto módulos é gerado dinamicamente pelo ASP.NET a partir dos arquivos de origem na pasta App_Code, o atributo de conjunto de módulos (assembly) não é necessário.Quando o atributo de conjunto de módulos (assembly) não é usado, o ASP.NET carrega o tipo do controle a partir dos conjuntos de módulos gerados dinamicamente do diretório App_Code.
Para exibir a página que usa a controle personalizado
Exiba a página SimpleDataBoundColumnTest.aspx no seu navegador inserindo o URL a seguir na barra de endereços:
https://localhost/ServerControlsTest/SimpleDataBoundColumnTest.aspx
Se você usar o controle em um designer visual, como Visual Studio 2005,você poderá adicionar o controle à caixa de ferramentas, arraste-o da caixa de ferramentas para o superfície de design e acesse propriedades e eventos no navegador de propriedades.Além disso, no Visual Studio 2005, o controle possui suporte completo IntelliSense em Modo de exibição Source do criador da página e no editor de códigos.Isso inclui conclusão de instrução em um bloco script, bem como suporte ao navegador de propriedade quando um desenvolvedor de página clicar na marca do controle.
Observação: |
---|
Em muitos designers visuais, você pode adicionar controles personalizados para a caixa de ferramentas do designer.Para obter detalhes, consulte a documentação para o seu designer. |
Próximas etapas
Este controle de servidor associado a dados simples, personalizado ilustra as etapas fundamentais usadas para criar um controle personalizado que fornece a um desenvolvedor de página uma maneira padrão, eficiente e flexível de acoplá-lo a uma fonte de dados externos.A partir daqui, você pode começar a explorar a estrutura fornecida no Visual Studio para ajudá-lo a criar os controles de servidor sofisticados, personalizados.Sugestões para explorar mais o assunto incluem o seguinte:
Revise uma introdução à arquitetura geral e implementações que são específicas para desenvolver um controle de servidor associado a dados personalizado.Para obter detalhes, consulte:Desenvolvendo Controles Personalizados de Servidores Web Vinculados a Dados para ASP.NET 2.0.
Investigar as classes existentes de controles de servidores associado a dados que você pode estender e personalizar.Para obter uma visão geral dos controles de servidores Web associado a dados, consulte Visão geral de controle servidor Web com dados vinculados.Para obter informações sobre classes de controle de servidor Web com dados vinculados, consulte os seguintes tópicos de referência: GridView, DetailsView, FormView, Repeater, e DataList.
Aprenda mais sobre o processamento, definição de propriedades, mantimento de estado e implementação controles de compostos personalizados.Para mais detalhes, consulte Desenvolvendo Controles Personalizados ASP.NET Server, Exemplo de Estado de Controle versus Estado de Exibição e Gerenciamento de Estado Personalizado de Controle de Servidor.
Aprenda sobre os atributos de metadados que você pode aplicar para o ser controle personalizado de servidor associado a dados e a seus membros para fornecer informações que são usadas pelas ferramentas de design.Para obter detalhes, consulte:Atributos Metadata para Controles de Servidor Personalizados.
Crie um controle de designer para adicionar recursos em tempo de design, modelos ou estilos.Para obter um exemplo de um designer personalizado de controle associado a dados, consulte HierarchicalDataBoundControlDesigner e Demonstra Passo a passo: Criando um criador controle básico para um controle de servidor Web.Para obter uma visão geral de designers de controle do ASP.NET, consulte Visão Geral sobre os Designers de Controle do ASP.NET.
Trabalhe com um exemplo de um designer personalizado de controle associado a dados.Para obter detalhes, consulte a classe HierarchicalDataBoundControlDesigner.
Explore uma demonstração de definição apropriada de atributos em tempo de design para disponibilizar um controle de servidor personalizado na Caixa de Ferramentas do Visual Studio.Para obter detalhes, consulte:Como: Usar controles de servidor ASP.NET personalizado no Visual Studio.
Consulte também
Tarefas
Explicação Passo a Passo: Desenvolvendo e Usando um Controle de Servidor Personalizado
Conceitos
Desenvolvendo Controles Personalizados de Servidores Web Vinculados a Dados para ASP.NET 2.0
Visão geral de controle servidor Web com dados vinculados
Atributos Metadata para Controles de Servidor Personalizados
Visão Geral sobre os Designers de Controle do ASP.NET
Referência
HierarchicalDataBoundControlDesigner