Condividi tramite


Convalida con i validator di annotazione dei dati (VB)

di Microsoft

Sfruttare lo strumento di associazione di modelli di annotazione dati per eseguire la convalida all'interno di un'applicazione MVC ASP.NET. Informazioni su come usare i diversi tipi di attributi di validator e usarli in Microsoft Entity Framework.

In questa esercitazione si apprenderà come usare i validator di annotazione dati per eseguire la convalida in un'applicazione MVC ASP.NET. Il vantaggio dell'uso dei validator di annotazione dati consiste nel fatto che consentono di eseguire la convalida semplicemente aggiungendo uno o più attributi, ad esempio l'attributo Required o StringLength, a una proprietà di classe.

È importante comprendere che Data Annotations Model Binder non è una parte ufficiale del framework Microsoft ASP.NET MVC. Anche se l'oggetto Data Annotations Model Binder è stato creato dal team microsoft ASP.NET MVC, Microsoft non offre supporto ufficiale per il gestore di associazione di annotazioni dei dati descritto e usato in questa esercitazione.

Uso di Data Annotation Model Binder

Per usare data annotations Model Binder in un'applicazione MVC ASP.NET, è necessario innanzitutto aggiungere un riferimento all'assembly Microsoft.Web.Mvc.DataAnnotations.dll e all'assembly System.ComponentModel.DataAnnotations.dll. Selezionare l'opzione di menu Progetto, Aggiungi riferimento. Fare quindi clic sulla scheda Sfoglia e passare al percorso in cui è stato scaricato (e decompresso) l'esempio di strumento di associazione di modelli di annotazioni dati (vedere la figura 1).

Immagine della finestra di dialogo Aggiungi riferimento

Figura 1: Aggiunta di un riferimento allo strumento di associazione di modelli di annotazioni dati (fare clic per visualizzare l'immagine a dimensione intera)

Selezionare sia l'assembly Microsoft.Web.Mvc.DataAnnotations.dll che l'assembly System.ComponentModel.DataAnnotations.dll e fare clic sul pulsante OK .

Non è possibile usare l'assembly System.ComponentModel.DataAnnotations.dll incluso in .NET Framework Service Pack 1 con lo strumento di associazione di modelli di annotazioni dati. È necessario usare la versione dell'assembly System.ComponentModel.DataAnnotations.dll incluso nel download dell'esempio di associazione di modelli di annotazioni dati.

Infine, è necessario registrare DataAnnotations Model Binder nel file Global.asax. Aggiungere la riga di codice seguente al gestore eventi Application_Start() in modo che il metodo Application_Start() sia simile al seguente:

Protected Sub Application_Start()
    RegisterRoutes(RouteTable.Routes)
    ModelBinders.Binders.DefaultBinder = New Microsoft.Web.Mvc.DataAnnotations.DataAnnotationsModelBinder()
End Sub

Questa riga di codice registra DataAnnotationsModelBinder come strumento di associazione di modelli predefinito per l'intera applicazione MVC ASP.NET.

Uso degli attributi di convalida dell'annotazione dei dati

Quando si usa lo strumento di associazione di modelli di annotazioni dati, usare gli attributi del validator per eseguire la convalida. Lo spazio dei nomi System.ComponentModel.DataAnnotations include gli attributi di validator seguenti:

  • Intervallo: consente di verificare se il valore di una proprietà rientra tra un intervallo di valori specificato.
  • RegularExpression: consente di convalidare se il valore di una proprietà corrisponde a un criterio di espressione regolare specificato.
  • Obbligatorio: consente di contrassegnare una proprietà come richiesto.
  • StringLength: consente di specificare una lunghezza massima per una proprietà stringa.
  • Validation: classe di base per tutti gli attributi del validator.

Nota

Se le esigenze di convalida non sono soddisfatte da nessuno dei validator standard, è sempre possibile creare un attributo di validator personalizzato ereditando un nuovo attributo validator dall'attributo Di convalida di base.

La classe Product in Listing 1 illustra come usare questi attributi di validator. Le proprietà Name, Description e UnitPrice sono contrassegnate come obbligatorie. La proprietà Name deve avere una lunghezza di stringa minore di 10 caratteri. Infine, la proprietà UnitPrice deve corrispondere a un criterio di espressione regolare che rappresenta un importo di valuta.

Imports System.ComponentModel
Imports System.ComponentModel.DataAnnotations

Public Class Product

    Private _id As Integer
    Private _name As String
    Private _description As String
    Private _unitPrice As Decimal

    Public Property Id() As Integer
        Get
            Return _id
        End Get
        Set(ByVal value As Integer)
            _id = value
        End Set
    End Property

     _
    Public Property Name() As String
        Get
            Return _name
        End Get
        Set(ByVal value As String)
            _name = value
        End Set
    End Property

     _
    Public Property Description() As String
        Get
            Return _description
        End Get
        Set(ByVal value As String)
            _description = value
        End Set
    End Property

     _
    Public Property UnitPrice() As Decimal
        Get
            Return _unitPrice
        End Get
        Set(ByVal value As Decimal)
            _unitPrice = value
        End Set
    End Property

End Class

Elenco 1: Models\Product.vb

La classe Product illustra come usare un attributo aggiuntivo: l'attributo DisplayName. L'attributo DisplayName consente di modificare il nome della proprietà quando la proprietà viene visualizzata in un messaggio di errore. Anziché visualizzare il messaggio di errore "Il campo UnitPrice è obbligatorio", è possibile visualizzare il messaggio di errore "Il campo Prezzo è obbligatorio".

Nota

Se si vuole personalizzare completamente il messaggio di errore visualizzato da un validator, è possibile assegnare un messaggio di errore personalizzato alla proprietà ErrorMessage del validator come segue: <Required(ErrorMessage:="This field needs a value!")>

È possibile usare la classe Product nell'elenco 1 con l'azione del controller Create() nell'elenco 2. Questa azione del controller riproduce la visualizzazione Crea quando lo stato del modello contiene eventuali errori.

Public Class ProductController
    Inherits System.Web.Mvc.Controller

    '
    ' GET: /Product/Create

    Function Create() As ActionResult
        Return View()
    End Function

    '
    ' POST: /Product/Create

     _
    Function Create( ByVal productToCreate As Product) As ActionResult

        If Not ModelState.IsValid Then
            Return View()
        End If

        Return RedirectToAction("Index")

    End Function

End Class

Elenco 2: Controllers\ProductController.vb

Infine, è possibile creare la visualizzazione in Listato 3 facendo clic con il pulsante destro del mouse sull'azione Create() e selezionando l'opzione di menu Aggiungi visualizzazione. Creare una visualizzazione fortemente tipizzata con la classe Product come classe del modello. Selezionare Crea dall'elenco a discesa visualizza contenuto (vedere la figura 2).

Immagine della finestra di dialogo Aggiungi visualizzazione

Figura 2: Aggiunta della visualizzazione Crea

<%@ Page Title="" Language="VB" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage(Of MvcApplication1.Product)" %>

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
Create
</asp:Content>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">

    <h2>Create</h2>

    <%= Html.ValidationSummary("Create was unsuccessful. Please correct the errors and try again.") %>

    <% Using Html.BeginForm()%>

        <fieldset>
            <legend>Fields</legend>
            <p>
                <label for="Name">Name:</label>
                <%= Html.TextBox("Name") %>
                <%= Html.ValidationMessage("Name", "*") %>
            </p>
            <p>
                <label for="Description">Description:</label>
                <%= Html.TextBox("Description") %>
                <%= Html.ValidationMessage("Description", "*") %>
            </p>
            <p>
                <label for="UnitPrice">UnitPrice:</label>
                <%= Html.TextBox("UnitPrice") %>
                <%= Html.ValidationMessage("UnitPrice", "*") %>
            </p>
            <p>
                <input type="submit" value="Create" />
            </p>
        </fieldset>

    <% End Using %>

    <div>
        <%=Html.ActionLink("Back to List", "Index") %>
    </div>

</asp:Content>

Elenco 3: Views\Product\Create.aspx

Nota

Rimuovere il campo ID dall'opzione di menu Crea modulo generato dall'opzione di menu Aggiungi visualizzazione . Poiché il campo ID corrisponde a una colonna Identity, non si vuole consentire agli utenti di immettere un valore per questo campo.

Se si invia il modulo per la creazione di un prodotto e non si immettono i valori per i campi obbligatori, vengono visualizzati i messaggi di errore di convalida nella figura 3 .

Immagine di tutti i messaggi di errore di convalida

Figura 3: Campi obbligatori mancanti

Se si immette un importo di valuta non valido, viene visualizzato il messaggio di errore nella figura 4 .

Immagine del messaggio di errore di valuta non valido

Figura 4: Importo valuta non valido

Uso dei validator di annotazione dei dati con Entity Framework

Se si usa Microsoft Entity Framework per generare le classi del modello di dati, non è possibile applicare gli attributi del validator direttamente alle classi. Poiché Entity Framework Designer genera le classi del modello, tutte le modifiche apportate alle classi del modello verranno sovrascritte alla successiva modifica apportata alla Designer.

Se si vogliono usare i validator con le classi generate da Entity Framework, è necessario creare classi di metadati. Si applicano i validator alla classe dei metadati anziché applicare i validator alla classe effettiva.

Si supponga, ad esempio, di aver creato una classe Movie usando Entity Framework (vedere la figura 5). Si supponga, inoltre, di voler rendere obbligatorie le proprietà Titolo film e Regista. In tal caso, è possibile creare la classe parziale e la classe metadati in Listato 4.

Immagine della classe film

Figura 5: Classe Movie generata da Entity Framework

Imports System.ComponentModel
Imports System.ComponentModel.DataAnnotations

 _
Partial Public Class Movie
End Class

Public Class MovieMetaData

    Private _title As Object
    Private _director As Object
    Private _dateReleased As Object

     _
    Public Property Title() As Object
        Get
            Return _title
        End Get
        Set(ByVal value As Object)
            _title = value
        End Set
    End Property

     _
    Public Property Director() As Object
        Get
            Return _director
        End Get
        Set(ByVal value As Object)
            _director = value
        End Set
    End Property

     _
    Public Property DateReleased() As Object
        Get
            Return _dateReleased
        End Get
        Set(ByVal value As Object)
            _dateReleased = value
        End Set
    End Property
End Class

Elenco 4: Models\Movie.vb

Il file nell'elenco 4 contiene due classi denominate Movie e MovieMetaData. La classe Movie è una classe parziale. Corrisponde alla classe parziale generata da Entity Framework contenuta in DataModel. file Designer.vb.

Attualmente, .NET Framework non supporta proprietà parziali. Pertanto, non è possibile applicare gli attributi del validator alle proprietà della classe Movie definita in DataModel. Designer.vb file applicando gli attributi del validator alle proprietà della classe Movie definita nel file nell'elenco 4.

Si noti che la classe parziale Movie è decorata con un attributo MetadataType che punta alla classe MovieMetaData. La classe MovieMetaData contiene proprietà proxy per le proprietà della classe Movie.

Gli attributi del validator vengono applicati alle proprietà della classe MovieMetaData. Le proprietà Title, Director e DateReleased sono tutte contrassegnate come proprietà obbligatorie. Alla proprietà Director deve essere assegnata una stringa contenente meno di 5 caratteri. Infine, l'attributo DisplayName viene applicato alla proprietà DateReleased per visualizzare un messaggio di errore simile a "Il campo Data di rilascio è obbligatorio". Invece dell'errore "Il campo DateReleased è obbligatorio".

Nota

Si noti che le proprietà proxy nella classe MovieMetaData non devono rappresentare gli stessi tipi delle proprietà corrispondenti nella classe Movie. Ad esempio, la proprietà Director è una proprietà stringa nella classe Movie e una proprietà dell'oggetto nella classe MovieMetaData.

La pagina nella figura 6 illustra i messaggi di errore restituiti quando si immettono valori non validi per le proprietà Movie.

Immagine del messaggio di errore relativo ai valori dei film non validi

Figura 6: Uso dei validator con Entity Framework (fare clic per visualizzare l'immagine a dimensione intera)

Riepilogo

In questa esercitazione si è appreso come sfruttare data annotation Model Binder per eseguire la convalida all'interno di un'applicazione MVC ASP.NET. Si è appreso come usare i diversi tipi di attributi del validator, ad esempio gli attributi Required e StringLength. Si è anche appreso come usare questi attributi quando si usa Microsoft Entity Framework.