Compartilhar via


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

  1. 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.

  2. 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.

  3. Em Modelos instalados, clicar Classe.

  4. 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.

  5. 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.

  6. 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 
    
  7. 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
    
  8. 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.

  9. 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
    
  10. 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
    
  11. 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

  1. 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.

  2. Se necessário, altere a marcação.

  3. 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.