Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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).
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).
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 .
Figura 3: Campi obbligatori mancanti
Se si immette un importo di valuta non valido, viene visualizzato il messaggio di errore nella figura 4 .
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.
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.
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.