Freigeben über


Gewusst wie: Anpassen der Datenfeldvalidierung im Datenmodell

Aktualisiert: Juli 2008

Mit ASP.NET Dynamic Data können Sie die Datenvalidierung für das Datenmodell anpassen und ausbauen. In diesem Thema erfahren Sie, wie Sie eine Datenfeldvalidierung im Datenmodell anhand der folgenden Vorgehensweisen hinzufügen können:

  • Anpassen der Validierung für einzelne Datenfelder durch Anwenden von Dynamic Data-System.ComponentModel.DataAnnotations-Attributen auf die Felder. Durch diese Attribute werden übliche Validierungsmuster wie die Bereichsprüfung oder die Überprüfung von Pflichtfeldern definiert. Bei diesem Ansatz können Sie vordefinierte Validierungen mit nur wenig Code verwenden. Verwenden Sie diese Vorgehensweise, wenn Sie die von Dynamic Data bereitgestellte Validierung erweitern möchten und die Standard-System.ComponentModel.DataAnnotations-Attribute Ihren Anforderungen genügen.

    Hinweis:

    Sie können auch eigene benutzerdefinierte Validierungsattribute erstellen. Auf diese Weise können Sie die von den System.ComponentModel.DataAnnotations-Attributen bereitgestellte Validierung ausbauen. Dies ist nützlich, wenn die verfügbaren Attribute nicht den Validierungsanforderungen für ein bestimmtes Datenfeld entsprechen. Weitere Informationen hierzu finden Sie unter Gewusst wie: Anpassen der Datenfeldvalidierung im Datenmodell mit benutzerdefinierten Attributen.

  • Anpassen der Validierung für ein einzelnes Datenfeld durch Außerkraftsetzen der Methode der partiellen Klasse, von der Änderungen für dieses Datenfeld verarbeitet werden (bzw. durch Verarbeitung eines entsprechenden Ereignisses). Mit dieser Vorgehensweise können Sie eine Validierung und eine Geschäftslogik für ein einzelnes Feld hinzufügen.

  • Anpassen der Validierung für alle Datenfelder durch Außerkraftsetzen der OnValidate-Methode (bzw. Verarbeitung des Validate-Ereignisses). Diese Methode wird aufgerufen, wenn ein Datenfeld in der Tabelle verarbeitet wird. Dies ist eine allgemeinere Vorgehensweise als das Hinzufügen einer Validierung für ein einzelnes Feld. Sie ist nützlich, wenn dieselbe Validierungslogik für mehrere Datenfelder verwendet werden kann. Sie ermöglicht zudem die Validierung mehrerer Felder.

Alle Validierungsausnahmen, die im Datenmodell ausgelöst werden, werden vom DynamicValidator-Steuerelement abgefangen. Wenn eine Seite ein DynamicValidator-Steuerelement enthält, kann der Fehler auf der Seite angezeigt werden.

  • Bei allen dem Datenmodell hinzugefügten Validierungen müssen Sie eine partielle Klasse erstellen, die die Tabellenklasse im Datenmodell erweitert. Sie fügen dann die Validierungen zur partiellen Klasse hinzu.

Hier finden Sie ein Onlinebeispiel für dieses Feature.

Erstellen einer partiellen Klasse für die Validierung

Bevor Sie die Validierung auf Datenmodellebene anpassen können, müssen Sie eine partielle Klasse implementieren, die das Datenmodell erweitert. Dann können Sie Folgendes tun:

  • Anpassen der Validierung durch Hinzufügen von Metadateninformationen über Attribute

  • Anpassen der Validierung durch Implementierung von Methoden der partiellen Klasse, mit denen Sie Ihre eigene Validierungslogik erstellen können

So erstellen Sie eine partielle Klasse für die Validierung

  1. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf den Ordner App_Code, und klicken Sie dann auf Neues Element hinzufügen.

  2. Klicken Sie unter Von Visual Studio installierte Vorlagen auf Klasse.

    Geben Sie im Feld Name den Namen der Datentabelle ein, für die Sie eine Validierung hinzufügen möchten.

    Der Klassenname muss dem Entitätsklassennamen, der die Tabelle repräsentiert, entsprechen. Wenn Sie zum Beispiel eine Validierung für die Customers-Tabelle hinzufügen möchten, müssen Sie der Datei in Visual C# den Namen Customer.cs bzw. in Visual Basic den Namen Customer.vb zuweisen und der Klasse den Namen Customer.

  3. Fügen Sie das Partial-Schlüsselwort in Visual Basic bzw. das partial-Schlüsselwort in Visual C# zur Klassendefinition hinzu, um eine partielle Klasse zu erstellen. 

    Im folgenden Beispiel wird die aktualisierte Klassendeklaration veranschaulicht:

    public partial class Customer {
    
    }
    
    Partial Public Class Customer
    
    End Class
    
  4. Wenn Sie die Klasse in Visual C# erstellen, löschen Sie den Standardkonstruktor.

  5. Fügen Sie dem System.Web.DynamicData-Namespace und dem System.ComponentModel.DataAnnotations-Namespace mithilfe des Imports-Schlüsselworts in Visual Basic bzw. des using-Schlüsselworts in Visual C# Verweise hinzu, wie im folgenden Beispiel zu sehen:

    using System.Web.DynamicData;
    using System.ComponentModel.DataAnnotations;
    
    Imports System.Web.DynamicData
    Imports System.ComponentModel.DataAnnotations
    
  6. Erstellen Sie in derselben Datei eine zweite Klasse, die als zugehörige Metadatenklasse fungiert. Sie können der Klasse jeden Namen zuweisen, solange es sich um einen gültigen Klassennamen handelt, der noch nicht verwendet wird.

    Im folgenden Beispiel wird die Deklaration der Metadatenklasse veranschaulicht:

    [C#]

    public class CustomerMetadata
    {
    
    }
    
    Public Class CustomerMetadata 
    
    End Class
    

    Die zugehörige Metadatenklasse stellt ein Objekt bereit, dem Sie Validierungsattribute zuweisen können.

  7. Verwenden Sie das MetadataTypeAttribute-Attribut für die Definition der partiellen Klasse. Verwenden Sie als Parameter für das Attribut den Namen der zugehörigen Metadatenklasse, die Sie im vorigen Schritt erstellt haben.

    Im folgenden Beispiel wird die Definition der partiellen Klasse mit hinzugefügtem Attribut gezeigt.

    [MetadataType(typeof(CustomerMetadata))]
    public partial class Customer {
    
    }
    
    <MetadataType(GetType(CustomerMetadata))> _
    Partial Public Class Customer
    
    End Class
    

Anpassen der Validierung mithilfe von Attributen

In diesem Abschnitt erfahren Sie, wie Sie die Validierung mithilfe der von den Dynamic Data-System.ComponentModel.DataAnnotations-Attributen bereitgestellten Standardvalidierungsregeln anpassen können.

So validieren Sie ein bestimmtes Datenfeld mithilfe von Validierungsattributen

  1. Erstellen Sie in der Metadatenklasse eine Eigenschaft oder ein Feld, dessen Name dem zu validierenden Datenfeld entspricht.

  2. Verwenden Sie eines der Attribute im System.ComponentModel.DataAnnotations-Namespace für die Eigenschaft.

    Das folgende Beispiel zeigt, wie Sie das System.ComponentModel.DataAnnotations.RequiredAttribute-Attribut auf das Title-Datenfeld in der zugehörigen Metadatenklasse anwenden können. Falls eine leere Zeichenfolge eingegeben wird, löst die IsValid-Methode eine Validierungsausnahme aus und erzeugt eine Fehlermeldung.

    Hinweis:

    Indem Sie das RequiredAttribute-Attribut verwenden, erzwingen Sie die Eingabe eines Werts, selbst wenn dies seitens der Datenbank nicht erforderlich ist.

    public class CustomerMetadata
    {
      [Required()]
      public object Title;
    }
    
    Public Class CustomerMetadata 
      <Required()> _
      Public Title As Object
    End Class
    

Anpassen der Validierung für ein einzelnes Datenfeld mithilfe der Methode einer partiellen Klasse

In diesem Abschnitt erfahren Sie, wie Sie die Validierung anpassen können, indem Sie die Methode einer partiellen Klasse außer Kraft setzen, mit der die Änderungen, die an einem einzelnen Datenfeld vorgenommen werden, verarbeitet werden. Bei dieser Art der Validierung können Sie Ihre eigenen Regeln für die Validierung erstellen. Sie müssen nicht auf die integrierten, in den System.ComponentModel.DataAnnotations-Attributen implementierten Dynamic Data-Validierungen zurückgreifen.

So validieren Sie ein bestimmtes Datenfeld mit der Methode einer partiellen Klasse

  1. Setzen Sie die Methode in der partiellen Klasse außer Kraft, mit der die am Datenfeld vorgenommenen Änderungen verarbeitet werden.

  2. Fügen Sie Ihre eigene Validierungslogik hinzu.

    Das folgende Beispiel zeigt, wie Sie die OnTitleChanging-Methode in einer partiellen Customer-Klasse außer Kraft setzen. Die Methode wird aufgerufen, wenn sich das Title-Feld der Customer-Datentabelle ändert. Der Code im Beispiel überprüft, ob der neu eingegebene Titel mit einem Großbuchstaben beginnt. Wenn die Daten die Validierung nicht bestehen, löst die Methode eine Ausnahme aus. Der zu überprüfende Wert wird als einziger Parameter an die Methode übergeben. Der Typ des Parameters wird so festgelegt, dass er dem Datentyp der zu validierenden Daten entspricht.

    Hinweis:

    Alle Validierungsausnahmen, die im Datenmodell ausgelöst werden, werden vom DynamicValidator-Steuerelement abgefangen. Wenn eine Seite ein DynamicValidator-Steuerelement enthält, kann der Fehler auf der Seite angezeigt werden.

    public partial class Customer 
    {
      partial void OnTitleChanging(string value) 
      {
        if (!Char.IsUpper(value[0])) {
          throw new ValidationException(
           "Title must start with an uppercase letter.");}
        }
    }
    
    Public Partial Class Customer
      Private Sub OnTitleChanging(ByVal value As String)
        If Not [Char].IsUpper(value(0)) Then
          Throw New ValidationException( _
            "Title must start with an uppercase letter.")
        End If
      End Sub
    End Class
    

Anpassen der Validierung für alle Datenfelder mithilfe der Methode einer partiellen Klasse

In diesem Abschnitt erfahren Sie, wie Sie die Validierung anpassen können, indem Sie die Methode einer partiellen Klasse außer Kraft setzen, mit der Änderungen, die an einem Datenfeld in der Tabelle vorgenommen werden, verarbeitet werden. Bei dieser Art der Validierung können Sie Ihre eigenen Regeln für die Validierung erstellen. Sie müssen nicht auf die integrierten, in den System.ComponentModel.DataAnnotations-Attributen implementierten Dynamic Data-Validierungen zurückgreifen. Sie ist nützlich, wenn dieselbe Validierungslogik für mehrere Datenfelder verwendet werden kann. Sie ermöglicht zudem die Validierung mehrerer Felder.

So validieren Sie ein Datenfeld mit der Methode einer partiellen Klasse

  1. Setzen Sie die OnValidate-Methode der partiellen Klasse außer Kraft, die aufgerufen wird, wenn an einem Datenfeld in der Tabelle Änderungen vorgenommen werden.

  2. Fügen Sie Ihre eigene Validierungslogik hinzu.

    Im folgenden Beispiel sehen Sie, wie die OnValidate-Methode überschrieben wird. Durch diesen Beispielcode wird überprüft, ob der eingegebene Vor- und Nachname mit einem Großbuchstaben beginnt. Wenn die Daten die Validierung nicht bestehen, löst die Methode eine Ausnahme aus.

    Hinweis:

    Alle Validierungsausnahmen, die im Datenmodell ausgelöst werden, werden vom DynamicValidator-Steuerelement abgefangen. Wenn eine Seite ein DynamicValidator-Steuerelement enthält, kann der Fehler auf der Seite angezeigt werden.

    partial void OnValidate(
        System.Data.Linq.ChangeAction action)
        {
            if (!Char.IsUpper(this._LastName[0]) || 
                !Char.IsUpper(this._FirstName[0]))
              throw new  ValidationException(
                 "Name must start with an uppercase letter.");
            }
    
    Private Sub OnValidate(ByVal action As _  
           System.Data.Linq.ChangeAction)
        If Not [Char].IsUpper(Me._LastName(0)) OrElse _
                Not [Char].IsUpper(Me._FirstName(0)) Then
            Throw New ValidationException( _
                "Name must start with an uppercase letter.")
        End If
    End Sub
    

Beispiel

Im folgenden Codebeispiel wird veranschaulicht, wie Sie mit dem RequiredAttribute-Attribut die Title-Daten der Customer-Tabelle validieren können. Das Beispiel verwendet die OnValidate-Methode der partiellen Klasse, um zu gewährleisten, dass die für die Datenfelder Title, FirstName und LastName eingegebenen Werte mit einem Großbuchstaben beginnen. Im Code wird außerdem die OnOderQtyChanging-Methode der partiellen Klasse verwendet, um sicherzustellen, dass der für das OrderQty-Datenfeld der SalesOrderDetails-Tabelle eingegebene Wert größer als der festgelegte Mindestwert ist.

Imports System
Imports System.Collections.Generic
Imports System.Linq
Imports System.Web
Imports System.Web.DynamicData
Imports System.ComponentModel.DataAnnotations

<MetadataType(GetType(CustomerMetadata))> _
Partial Public Class Customer


    Private Sub OnValidate(ByVal action As System.Data.Linq.ChangeAction)
        If Not Char.IsUpper(Me._LastName(0)) _
        OrElse Not Char.IsUpper(Me._FirstName(0)) _
        OrElse Not Char.IsUpper(Me._Title(0)) Then
            Throw New ValidationException( _
               "Data value must start with an uppercase letter.")
        End If
    End Sub


End Class

Public Class CustomerMetadata
    <Required()> _
    Public Title As Object

End Class
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.DynamicData;
using System.ComponentModel.DataAnnotations;

[MetadataType(typeof(CustomerMetadata))]
public partial class Customer
{


    partial void OnValidate(System.Data.Linq.ChangeAction action)
    {
        if (!char.IsUpper(this._LastName[0]) ||
            !char.IsUpper(this._FirstName[0])  ||
            !char.IsUpper(this._Title[0]))
            throw new ValidationException(
               "Data value must start with an uppercase letter.");
    }


}

public class CustomerMetadata
{
    [Required()]
    public object Title;

}
Imports System
Imports System.Collections.Generic
Imports System.Linq
Imports System.Web
Imports System.Web.DynamicData
Imports System.ComponentModel.DataAnnotations

Partial Public Class SalesOrderDetail
    Private Sub OnOrderQtyChanging(ByVal value As Short)
        If value < 100 Then
            Throw New ValidationException( _
               "Quantity is less than the allowed minimum of 100.")
        End If
    End Sub
End Class

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.DynamicData;
using System.ComponentModel.DataAnnotations;

public partial class SalesOrderDetail
{
    partial void OnOrderQtyChanging(short value)
    {
        if (value < 100)
        {
            throw new ValidationException(
                "Quantity is less than the allowed minimum of 100.");
        }
    }
}

<%@ Page Language="VB" 
AutoEventWireup="true" CodeFile="CustomValidation.aspx.vb" 
Inherits="CustomValidation" %>


<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" >
    <title></title>
    <link href="~/Site.css" rel="stylesheet" type="text/css" />
</head>
<body>
     <h2>Example: <%=Title%></h2>

     <!-- Enable dynamic behavior. The GridView must be 
     registered with the manager. See code-behind file. -->
    <asp:DynamicDataManager ID="DynamicDataManager1" 
        AutoLoadForeignKeys="true" />


    <form id="form1" >

        <!-- Capture validation exceptions -->
        <asp:DynamicValidator ID="ValidatorID" ControlToValidate="GridView1" 
             /> 
        <asp:DynamicValidator ID="DynamicValidator1" ControlToValidate="GridView2" 
             /> 
        <table>
            <tr>
                <td align="left" valign="top" style="font-weight:bold">
                    Customize Validation Using the Table OnValidate 
                </td>
                <td>
                    <asp:GridView ID="GridView1" 
                         
                        DataSourceID="GridDataSource" 
                        AutoGenerateColumns="false"  
                        AutoGenerateEditButton="true"
                        AllowPaging="true" 
                        PageSize="5"
                        AllowSorting="true">
                        <Columns>
                            <asp:DynamicField DataField="Title" />
                            <asp:DynamicField DataField="FirstName" />
                            <asp:DynamicField DataField="LastName" />
                        </Columns>
                        <EmptyDataTemplate>
                            There are currently no items in this table.
                        </EmptyDataTemplate>
                    </asp:GridView>
                </td>
            </tr>
            <tr>
                <td align="left" valign="top" style="font-weight:bold">
                    Customize Validation Using OnOrderQtyChanging
                </td>
                <td>
                    <asp:GridView ID="GridView2" 
                         
                        DataSourceID="GridDataSource2" 
                        AutoGenerateColumns="false"  
                        AutoGenerateEditButton="true"
                        AllowPaging="true" 
                        PageSize="5"
                        AllowSorting="true">
                        <Columns>
                            <asp:DynamicField DataField="OrderQty" />
                        </Columns>
                        <EmptyDataTemplate>
                            There are currently no items in this table.
                        </EmptyDataTemplate>
                    </asp:GridView>
                </td>
            </tr>
        </table>

    </form>

    <!-- Connect to the database -->
    <asp:LinqDataSource ID="GridDataSource"   
         TableName="Customers" EnableUpdate="true"
        ContextTypeName="AdventureWorksLTDataContext">

    </asp:LinqDataSource>

     <!-- Connect to the database -->
    <asp:LinqDataSource ID="GridDataSource2"   
         TableName="SalesOrderDetails" EnableUpdate="true"
        ContextTypeName="AdventureWorksLTDataContext">

    </asp:LinqDataSource>
</body>
</html>
<%@ Page Language="C#" 
AutoEventWireup="true" CodeFile="CustomValidation.aspx.cs" 
Inherits="CustomValidation" %>


<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" >
    <title></title>
    <link href="~/Site.css" rel="stylesheet" type="text/css" />
</head>
<body>
     <h2>Example: <%=Title%></h2>

     <!-- Enable dynamic behavior. The GridView must be 
     registered with the manager. See code-behind file. -->
    <asp:DynamicDataManager ID="DynamicDataManager1" 
        AutoLoadForeignKeys="true" />


    <form id="form1" >

        <!-- Capture validation exceptions -->
        <asp:DynamicValidator ID="ValidatorID" ControlToValidate="GridView1" 
             /> 
        <asp:DynamicValidator ID="DynamicValidator1" ControlToValidate="GridView2" 
             /> 
        <table>
            <tr>
                <td align="left" valign="top" style="font-weight:bold">
                    Customize Validation Using the Table OnValidate 
                </td>
                <td>
                    <asp:GridView ID="GridView1" 
                         
                        DataSourceID="GridDataSource" 
                        AutoGenerateColumns="false"  
                        AutoGenerateEditButton="true"
                        AllowPaging="true" 
                        PageSize="5"
                        AllowSorting="true">
                        <Columns>
                            <asp:DynamicField DataField="Title" />
                            <asp:DynamicField DataField="FirstName" />
                            <asp:DynamicField DataField="LastName" />
                        </Columns>
                        <EmptyDataTemplate>
                            There are currently no items in this table.
                        </EmptyDataTemplate>
                    </asp:GridView>
                </td>
            </tr>
            <tr>
                <td align="left" valign="top" style="font-weight:bold">
                    Customize Validation Using OnOrderQtyChanging
                </td>
                <td>
                    <asp:GridView ID="GridView2" 
                         
                        DataSourceID="GridDataSource2" 
                        AutoGenerateColumns="false"  
                        AutoGenerateEditButton="true"
                        AllowPaging="true" 
                        PageSize="5"
                        AllowSorting="true">
                        <Columns>
                            <asp:DynamicField DataField="OrderQty" />
                        </Columns>
                        <EmptyDataTemplate>
                            There are currently no items in this table.
                        </EmptyDataTemplate>
                    </asp:GridView>
                </td>
            </tr>
        </table>

    </form>

    <!-- Connect to the database -->
    <asp:LinqDataSource ID="GridDataSource"   
         TableName="Customers" EnableUpdate="true"
        ContextTypeName="AdventureWorksLTDataContext">

    </asp:LinqDataSource>

     <!-- Connect to the database -->
    <asp:LinqDataSource ID="GridDataSource2"   
         TableName="SalesOrderDetails" EnableUpdate="true"
        ContextTypeName="AdventureWorksLTDataContext">

    </asp:LinqDataSource>
</body>
</html>
Imports System
Imports System.Collections
Imports System.Configuration
Imports System.Web.DynamicData

Partial Public Class CustomValidation
    Inherits System.Web.UI.Page
    Protected _table1 As MetaTable, _table2 As MetaTable

    Protected Sub Page_Init(ByVal sender As Object, ByVal e As EventArgs)
        ' Register data controls with the data manager.
        DynamicDataManager1.RegisterControl(GridView1)
        DynamicDataManager1.RegisterControl(GridView2)
    End Sub

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
        ' Get the table entities.
        _table1 = GridDataSource.GetTable()
        _table2 = GridDataSource2.GetTable()

        ' Assign title dynamically.
        Title = String.Concat("Customize Validation of the ", _
                              _table1.Name, " and ", _table2.Name, " Tables")

    End Sub
End Class
using System;
using System.Collections;
using System.Configuration;
using System.Web.DynamicData;

public partial class CustomValidation : System.Web.UI.Page
{
    protected MetaTable _table1, _table2;

    protected void Page_Init(object sender, EventArgs e)
    {
        // Register data controls with the data manager.
        DynamicDataManager1.RegisterControl(GridView1);
        DynamicDataManager1.RegisterControl(GridView2);
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        // Get the table entities.
        _table1 = GridDataSource.GetTable();
        _table2 = GridDataSource2.GetTable();

        // Assign title dynamically.
        Title = string.Concat("Customize Validation of the ",
            _table1.Name, " and ",  _table2.Name, " Tables");

    }
}

Kompilieren des Codes

Zum Kompilieren des Beispielcodes benötigen Sie Folgendes:

  • Microsoft Visual Studio 2008 Service Pack 1 oder Visual Web Developer 2008 Express Edition Service Pack 1

  • Die AdventureWorksLT-Beispieldatenbank. Informationen über das Herunterladen und Installieren der SQL Server-Beispieldatenbank finden Sie auf der CodePlex-Website unter Microsoft SQL Server Product Samples: Database. Vergewissern Sie sich, dass Sie die richtige Version der Beispieldatenbank für die von Ihnen verwendete SQL Server-Version (Microsoft SQL Server 2005 oder Microsoft SQL Server 2008) installieren.

Eine Dynamic Data-Website. So können Sie einen Datenkontext für die Datenbank und die Klasse, die das anzupassende Datenfeld und die außer Kraft zu setzenden Methoden enthält, erstellen. Weitere Informationen hierzu finden Sie unter Walkthrough: Creating a New Dynamic Data Web Site Using Scaffolding.

Siehe auch

Konzepte

Übersicht über ASP.NET Dynamic Data-Feldvorlagen

Übersicht über das ASP.NET Dynamic Data-Modell

Übersicht über ASP.NET Dynamic Data

Referenz

RequiredAttribute

DynamicValidator

Partielle Klassen und Methoden (C#-Programmierhandbuch)

Änderungsprotokoll

Date

Versionsgeschichte

Grund

Juli 2008

Thema hinzugefügt

SP1-Featureänderung.