Como: Personalizar a aparência de campo de dados e o comportamento para tipos de dados não intrínsecas no modelo de dados
Quando você estiver trabalhando com dados dinâmicos do ASP.NET, você pode usar o System.ComponentModel.DataAnnotations.DataTypeAttribute atributo para atribuir um tipo de dados a um campo de modelo de dados. Isso é útil se você quiser atribuir um tipo é mais específico a esse campo de dados do que o tipo de CLR é inferido por dados dinâmicos.
Por exemplo, você pode marcar um campo de texto que contém endereços de email sistema autônomo um tipo de email, seria definido sistema autônomo um tipo específico de texto.O modelo de campo de texto que processa o campo pode usar as informações fornecidas por esse atributo para criar a interface de usuário especial para exibir e editar o tipo de email.Um campo de texto é marcado com o EmailAddress() atributo pode ser exibido sistema autônomo um System.Web.UI.WebControls.HyperLink controle.
Você também pode usar um modelo de campo personalizado juntamente com o UIHint atributo para especificar especializada tratamento para tipos de dados específicos. The DataTypeAttribute atributo permite usar um modelo de campo para vários tipos.
A decisão de usar o DataTypeAttribute atributo ou a UIHint atributo geralmente é um estilo e conveniência. Para obter informações sobre como usar o UIHint propriedade, consulte Como: Personalizar modelos de campo ASP.NET Dados Dinâmicos padrão.
Este tópico descreve como usar o DataTypeAttribute atributo.
Para associar atributos de tipo de dados um campo de dados
em aberto no site da Web ASP.NET onde desejado para personalizar os campos de dados.
Observação: O site da Web deve ser configurado para dados dinâmicos.
In O gerenciador de soluções, clicar com o botão direito do mouse na posta App_Code pasta e, em seguida, clique em Adicionar novo item.
Em Modelos instalados, clicar Classe.
Digite um nome para o arquivo no Nome box.
O nome de classe que você criar deve corresponder ao nome de classe de entidade que representa a tabela.Por exemplo, se você estiver trabalhando com a tabela cliente, nomeie a classe Customer.
Adicionar o Partial palavra-chave em Visual Basic ou o partial palavra-chave em Visual C# a definição de classe para torná-lo em uma classe parcial.
Adicionar referências para o System.ComponentModel e System.ComponentModel.DataAnnotations espaços para nome usando o Imports palavra-chave em Visual Basic ou o using palavra-chave em Visual C#, conforme mostrado no exemplo a seguir:
using System.ComponentModel; using System.ComponentModel.DataAnnotations;
Imports System.ComponentModel Imports System.ComponentModel.DataAnnotations
Adicione um acessador de propriedade para cada campo de dados que você deseja fornecer atributos para.
O exemplo a seguir mostra como criar os acessadores da propriedade para três propriedades que correspondem aos campos no cliente tabela.
public class CustomerMetaData { public object PasswordHash { get; set; } public object PasswordSalt { get; set; } public object ModifiedDate { get; set; } }
Public Class CustomerMetaData Public PasswordHash As Object Public PasswordSalt As Object Public ModifiedDate As Object End Class
Crie outra classe que atuará sistema autônomo a classe de metadados associados para a classe parcial.Você pode dar a classe qualquer nome que já não está sendo usado.Por exemplo, você pode criar uma classe que tem o nome de CustomerMetaData sistema autônomo a classe de metadados associados para a classe cliente.
Adicionar o MetadataTypeAttribute o atributo à definição de classe parcial. O atributo do parâmetro, use o nome da classe metadados associados que você criou na etapa anterior.
[MetadataType(typeof(CustomerMetaData))] public partial class Customer { }
<MetadataType(GetType(CustomerMetaData))> _ Partial Public Class Customer End Class
Na classe metadados, adicione DataAnnotations atribui a cada campo cuja exibição ou o comportamento que você deseja modificar.
O exemplo a seguir mostra uma classe parcial concluída para a tabela cliente e uma classe de metadados associados nomeada CustomerMetaData. A classe de metadados contém campos de classe pública que correspondem aos campos do banco de dados.The PasswordHash e PasswordSalt campos marcados com o ScaffoldColumnattribute atributo, que é conjunto para false. Isso impede que os campos que estão sendo exibidos por dados dinâmicos.The ModifiedDate campo é marcado com o DataType atributo cujo valor é conjunto para DataType.Date. Isso especifica que os dados para este campo são exibidos usando o formato de data abreviada.
using System.ComponentModel; using System.ComponentModel.DataAnnotations; [MetadataType(typeof(CustomerMetaData))] public partial class Customer { } public class CustomerMetaData { [ScaffoldColumn(false)] public object PasswordHash { get; set; } [ScaffoldColumn(false)] public object PasswordSalt { get; set; } [DataTypeAttribute(DataType.Date)] public object ModifiedDate { get; set; } }
Imports Microsoft.VisualBasic Imports System.ComponentModel Imports System.ComponentModel.DataAnnotations <MetadataType(GetType(CustomerMetaData))> _ Partial Public Class Customer End Class Public Class CustomerMetaData <ScaffoldColumn(False)> _ Public PasswordSalt As Object <DataTypeAttribute(DataType.Date)> _ Public PasswordSalt As Object <DataTypeAttribute(DataType.Date)> _ Public ModifiedDate As Object End Class
Para certificar-se de que a classe parcial, metadados de classe e atributos estão funcionando, execute o aplicativo e exibir a tabela.
Para modificar um modelo de campo para usar atributos de dados personalizados
em aberto o modelo de campo que deseja personalizar.Se você desejar personalizar um modelo interno, em aberto o modelo de campo que corresponde ao tipo de dados que mapeia os dados para dados dinâmicos.
Por exemplo, se você estiver personalizando o modelo do campo usado para exibir seqüências de caracteres, abra Texto.ascx no diretório DynamicData\FieldTemplates.
Se necessário, altere a marcação.
No arquivo code-behind, substitua o OnDataBinding método, que é chamado quando o controle de campo de modelo obtém os dados a serem exibidos. No método, obter o atributo ou atributos para o campo de dados corrente do MetadataAttributes propriedade das FieldTemplateUserControl classe que deriva de modelo de campo de. Você pode, em seguida, formato ou processo os dados de acordo com quais atributos do campo são marcados com.
O exemplo a seguir mostra o código que pode ser usado no modelo Texto.ascx campo para exibir os campos de dados que foram modificados anteriormente neste tópico.
Imports System Imports System.Data Imports System.Configuration Imports System.Collections Imports System.Collections.Specialized Imports System.Linq Imports System.Web Imports System.Web.Security Imports System.Web.UI Imports System.Web.UI.WebControls Imports System.Web.UI.WebControls.WebParts Imports System.Web.UI.HtmlControls Imports System.Xml.Linq Imports System.Web.DynamicData Imports System.ComponentModel.DataAnnotations Partial Class TextField Inherits System.Web.DynamicData.FieldTemplateUserControl Private Function getNavUrl() As String Dim metadata = MetadataAttributes.OfType(Of DataTypeAttribute).FirstOrDefault() If (metadata Is Nothing) Then Return FieldValueString End If Dim url As String = FieldValueString Select Case metadata.DataType Case DataType.Url url = FieldValueString If (url.StartsWith("http://", StringComparison.OrdinalIgnoreCase) Or _ url.StartsWith("https://", StringComparison.OrdinalIgnoreCase)) Then Return url End If Return "http://" + FieldValueString Case DataType.EmailAddress Return "mailto:" + FieldValueString Case Else Throw New Exception("Unknow DataType") End Select End Function Protected Overrides Sub OnDataBinding(ByVal e As System.EventArgs) MyBase.OnDataBinding(e) If (String.IsNullOrEmpty(FieldValueString)) Then Return End If Dim metadata = MetadataAttributes.OfType(Of DataTypeAttribute).FirstOrDefault() If (metadata Is Nothing Or String.IsNullOrEmpty(FieldValueString)) Then Dim literal As New Literal() literal.Text = FieldValueString Controls.Add(literal) Return End If If (metadata.DataType = DataType.Url Or _ metadata.DataType = DataType.EmailAddress) Then Dim hyperlink As New HyperLink hyperlink.Text = FieldValueString hyperlink.href = getNavUrl() hyperlink.Target = "_blank" Controls.Add(hyperlink) Return End If If (metadata.DataType = DataType.Custom And _ String.Compare(metadata.CustomDataType, "BoldRed", True) = 0) Then Dim lbl As New Label() lbl.Text = FieldValueString lbl.Font.Bold = True lbl.ForeColor = System.Drawing.Color.Red Controls.Add(lbl) End If End Sub End Class
using System; using System.Data; using System.Configuration; using System.Collections; using System.Collections.Specialized; using System.Linq; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; using System.Xml.Linq; using System.Web.DynamicData; using System.ComponentModel.DataAnnotations; public partial class TextField : System.Web.DynamicData.FieldTemplateUserControl { string getNavUrl() { var metadata = MetadataAttributes.OfType<DataTypeAttribute>().FirstOrDefault(); if (metadata == null) return FieldValueString; switch (metadata.DataType) { case DataType.Url: string url = FieldValueString; if (url.StartsWith("http://", StringComparison.OrdinalIgnoreCase) || url.StartsWith("https://", StringComparison.OrdinalIgnoreCase)) return url; return "http://" + FieldValueString; case DataType.EmailAddress: return "mailto:" + FieldValueString; default: throw new Exception("Unknown DataType"); } } protected override void OnDataBinding(EventArgs e) { base.OnDataBinding(e); if (string.IsNullOrEmpty(FieldValueString)) return; var metadata = MetadataAttributes.OfType<DataTypeAttribute>().FirstOrDefault(); if (metadata == null || string.IsNullOrEmpty(FieldValueString)) { Literal literal = new Literal(); literal.Text = FieldValueString; Controls.Add(literal); return; } if (metadata.DataType == DataType.Url || metadata.DataType == DataType.EmailAddress) { HyperLink hyperlink = new HyperLink(); hyperlink.Text = FieldValueString; hyperlink.href = getNavUrl(); hyperlink.Target = "_blank"; Controls.Add(hyperlink); return; } if (metadata.DataType == DataType.Custom && string.Compare(metadata.CustomDataType, "BoldRed", true) == 0) { Label lbl = new Label(); lbl.Text = FieldValueString; lbl.Font.Bold = true; lbl.ForeColor = System.Drawing.Color.Red; Controls.Add(lbl); } } }
O código obtém os atributos para o campo corrente.Ele testa os atributos e executa a lógica diferente, dependendo de qual atributo o campo foi marcado com.Por exemplo, o código pode determinar que o campo está marcado com o personalizadoBoldRed atributo testando Custom() e os testes que o CustomDataType()propriedade é "BoldRed". Se for, o código cria a interface do usuário para exibir sistema autônomo dados em um Label controle com o estilo sistema autônomo texto em vermelho.
Exemplo
O exemplo a seguir mostra como personalizar a aparência do campo de dados e o comportamento para tipos de dados não intrínsecos.O código personaliza como dados dinâmicos exibe os campos EmailAddress, o vendedor e o sobrenome da tabela Customers do banco de dados AdventureWorksLT.
Imports System.ComponentModel
Imports System.ComponentModel.DataAnnotations
<MetadataType(GetType(CustomerMetaData))> _
Partial Public Class Customer
End Class
Public Class CustomerMetaData
<ScaffoldColumn(False)> _
Public PasswordHash As Object
<ScaffoldColumn(False)> _
Public PasswordSalt As Object
<DataTypeAttribute(DataType.Date)> _
Public ModifiedDate As Object
<DataTypeAttribute(DataType.EmailAddress)> _
Public EmailAddress As Object
<DataTypeAttribute(DataType.Url)> _
Public SalesPerson As Object
<DataTypeAttribute("BoldRed")> _
<DisplayName("Last")> _
Public ReadOnly Property LastName() As Object
Get
Return ""
End Get
End Property
End Class
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
[MetadataType(typeof(CustomerMetaData))]
public partial class Customer {
}
public class CustomerMetaData {
[ScaffoldColumn(false)]
public object PasswordHash { get; set; }
[ScaffoldColumn(false)]
public object PasswordSalt { get; set; }
[DataTypeAttribute(DataType.Date)]
public object ModifiedDate { get; set; }
[DataTypeAttribute(DataType.EmailAddress)]
public object EmailAddress { get; set; }
[DataTypeAttribute(DataType.Url)]
public object SalesPerson { get; set; }
[DisplayName("Last")]
[DataTypeAttribute("BoldRed")]
[RegularExpression(@"^[a-zA-Z''-'\s]{1,40}$",
ErrorMessage = "Characters are not allowed.")]
public object LastName { get; set; }
}
No exemplo, a DataTypeAttribute o atributo é conjunto para EmailAddress() para o EmailAddress propriedade. The DataTypeAttribute atributo é definido como Url() para o SalesPerson propriedade e o DataTypeAttribute atributo é definido como BoldRed para o LastName propriedade. BoldRed é definido sistema autônomo uma propriedade personalizada.
Compilando o código
Para compilar o código de exemplo, você precisa do seguinte:
Microsoft Visual Studio 2008 serviço empacotar 1 ou Visual Web Developer 2008 Express Edition serviço empacotar 1.
O banco de dados de exemplo AdventureWorksLT.Para obter informações sobre como baixar e instalar o banco de dados de exemplo do SQL servidor, consulte Exemplos de produtos do Microsoft SQL servidor: Banco de dados no site da CodePlex.Certifique-se de instalar a versão correta do banco de dados de exemplo para a versão do SQL servidor que você está executando (Microsoft SQL Server 2005 ou Microsoft SQL Server 2008).
Um orientados por dados site dinâmico.Isso permite que você criar um contexto de dados para o banco de dados e criar a classe que contém o campo de dados para personalizar e os métodos para substituir.Para obter mais informações, consulte Walkthrough: Creating a New Dynamic Data Web Site using Scaffolding.
Consulte também
Tarefas
Como: Personalizar modelos de campo ASP.NET Dados Dinâmicos padrão
Date |
History |
Motivo |
---|---|---|
Julho de 2008 |
Tópico adicional. |
Alteração de recurso do SP1. |