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.
Informazioni su come eseguire la convalida in un'applicazione MVC ASP.NET. In questa esercitazione Stephen Walther presenta lo stato del modello e gli helper HTML di convalida.
L'obiettivo di questa esercitazione è spiegare come eseguire la convalida all'interno di un'applicazione MVC ASP.NET. Si apprenderà ad esempio come impedire a un utente di inviare un modulo che non contiene un valore per un campo obbligatorio. Si apprenderà come usare lo stato del modello e gli helper HTML di convalida.
Informazioni sullo stato del modello
È possibile usare lo stato del modello, o più accuratamente, il dizionario dello stato del modello per rappresentare gli errori di convalida. Ad esempio, l'azione Create() in Listing 1 convalida le proprietà di una classe Product prima di aggiungere la classe Product a un database.
Non è consigliabile aggiungere la logica di convalida o di database a un controller. Un controller deve contenere solo la logica correlata al controllo del flusso dell'applicazione. Stiamo prendendo una scorciatoia per mantenere le cose semplici.
Elenco 1 - Controllers\ProductController.cs
//
// POST: /Product/Create
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create([Bind(Exclude="Id")] Product productToCreate)
{
// Validation logic
if (productToCreate.Name.Trim().Length == 0)
ModelState.AddModelError("Name", "Name is required.");
if (productToCreate.Description.Trim().Length == 0)
ModelState.AddModelError("Description", "Description is required.");
if (productToCreate.UnitsInStock
Nell'elenco 1 vengono convalidate le proprietà Name, Description e UnitsInStock della classe Product. Se una di queste proprietà non supera un test di convalida, viene aggiunto un errore al dizionario dello stato del modello (rappresentato dalla proprietà ModelState della classe Controller).
Se sono presenti errori nello stato del modello, la proprietà ModelState.IsValid restituisce false. In tal caso, il modulo HTML per la creazione di un nuovo prodotto viene rieseguito. In caso contrario, se non sono presenti errori di convalida, il nuovo prodotto viene aggiunto al database.
Uso degli helper di convalida
Il framework MVC ASP.NET include due helper di convalida: l'helper Html.ValidationMessage() e l'helper Html.ValidationSummary(). Questi due helper vengono usati in una visualizzazione per visualizzare i messaggi di errore di convalida.
Gli helper Html.ValidationMessage() e Html.ValidationSummary() vengono usati nelle visualizzazioni Crea e Modifica generate automaticamente dal ASP.NET scaffolding MVC. Per generare la visualizzazione Crea, seguire questa procedura:
- Fare clic con il pulsante destro del mouse sull'azione Crea() nel controller del prodotto e selezionare l'opzione di menu Aggiungi visualizzazione (vedere la figura 1).
- Nella finestra di dialogo Aggiungi visualizzazione selezionare la casella di controllo Crea una visualizzazione fortemente tipizzata (vedere la figura 2).
- Nell'elenco a discesa Visualizza classe dati selezionare la classe Product.
- Nell'elenco a discesa Visualizza contenuto selezionare Crea.
- Fare clic su Add .
Assicurarsi di compilare l'applicazione prima di aggiungere una visualizzazione. In caso contrario, l'elenco delle classi non verrà visualizzato nell'elenco a discesa Visualizza classe dati .
Figura 01: Aggiunta di una visualizzazione (fare clic per visualizzare l'immagine a dimensione intera)
Figura 02: Creazione di una visualizzazione fortemente tipizzata (fare clic per visualizzare l'immagine a dimensione intera)
Dopo aver completato questi passaggi, si ottiene la visualizzazione Crea nell'elenco 2.
Elenco 2 - Views\Product\Create.aspx
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<MvcApplication1.Models.Product>" %>
<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server">
<title>Create</title>
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<h2>Create</h2>
<%= Html.ValidationSummary() %>
<% 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="Price">Price:</label>
<%= Html.TextBox("Price") %>
<%= Html.ValidationMessage("Price", "*") %>
</p>
<p>
<label for="UnitsInStock">UnitsInStock:</label>
<%= Html.TextBox("UnitsInStock") %>
<%= Html.ValidationMessage("UnitsInStock", "*") %>
</p>
<p>
<input type="submit" value="Create" />
</p>
</fieldset>
<% } %>
<div>
<%=Html.ActionLink("Back to List", "Index") %>
</div>
</asp:Content>
Nell'elenco 2 l'helper Html.ValidationSummary() viene chiamato immediatamente sopra il modulo HTML. Questo helper viene usato per visualizzare un elenco di messaggi di errore di convalida. L'helper Html.ValidationSummary() esegue il rendering degli errori in un elenco puntato.
L'helper Html.ValidationMessage() viene chiamato accanto a ognuno dei campi del modulo HTML. Questo helper viene usato per visualizzare un messaggio di errore proprio accanto a un campo modulo. Nel caso dell'elenco 2, l'helper Html.ValidationMessage() visualizza un asterisco quando si verifica un errore.
La pagina nella figura 3 illustra i messaggi di errore visualizzati dagli helper di convalida quando il modulo viene inviato con campi mancanti e valori non validi.
Figura 03: La visualizzazione Crea inviata con problemi (fare clic per visualizzare l'immagine a dimensione intera)
Si noti che l'aspetto dei campi di input HTML viene modificato anche quando si verifica un errore di convalida. L'helper Html.TextBox() esegue il rendering di un attributo class="input-validation-error" quando si verifica un errore di convalida associato alla proprietà sottoposta a rendering dall'helper Html.TextBox().
Sono disponibili tre classi di fogli di stile a catena usate per controllare l'aspetto degli errori di convalida:
- input-validation-error : applicato al tag di input> di cui è stato eseguito il rendering dall'helper <Html.TextBox().
- field-validation-error : applicato al tag span> di cui è stato eseguito il <rendering dall'helper Html.ValidationMessage().
- validation-summary-errors : applicato al tag ul> sottoposto a <rendering dall'helper Html.ValidationSummary().
È possibile modificare queste classi di fogli di stile css e quindi modificare l'aspetto degli errori di convalida modificando il file Site.css che si trova nella cartella Contenuto.
Nota
La classe HtmlHelper include proprietà statiche di sola lettura per recuperare i nomi delle classi CSS correlate alla convalida. Queste proprietà statiche sono denominate ValidationInputCssClassName, ValidationFieldCssClassName e ValidationSummaryCssClassName.
Convalida di prebinding e convalida post-associazione
Se invii il modulo HTML per la creazione di un prodotto e immetti un valore non valido per il campo prezzo e nessun valore per il campo UnitsInStock, riceverai i messaggi di convalida visualizzati nella figura 4. Da dove provengono questi messaggi di errore di convalida?
Figura 04: Errori di convalida di prebinding (fare clic per visualizzare l'immagine a dimensione intera)
Esistono in realtà due tipi di messaggi di errore di convalida: quelli generati prima che i campi del modulo HTML siano associati a una classe e quelli generati dopo che i campi modulo sono associati alla classe . In altre parole, sono presenti errori di convalida prebinding e errori di convalida postbinding.
L'azione Create() esposta dal controller Product nell'elenco 1 accetta un'istanza della classe Product. La firma del metodo Create è simile alla seguente:
public ActionResult Create([Bind(Exclude="Id")] Product productToCreate)
I valori dei campi modulo HTML del modulo Create sono associati alla classe productToCreate da un elemento denominato strumento di associazione di modelli. Lo strumento di associazione di modelli predefinito aggiunge automaticamente un messaggio di errore allo stato del modello quando non può associare un campo modulo a una proprietà del modulo.
Lo strumento di associazione di modelli predefinito non può associare la stringa "apple" alla proprietà Price della classe Product. Non è possibile assegnare una stringa a una proprietà decimale. Di conseguenza, lo strumento di associazione di modelli aggiunge un errore allo stato del modello.
Lo strumento di associazione di modelli predefinito non può anche assegnare un valore Null a una proprietà che non accetta valori Null. In particolare, lo strumento di associazione di modelli non può assegnare un valore Null alla proprietà UnitsInStock. Ancora una volta, lo strumento di associazione di modelli rinuncia e aggiunge un messaggio di errore allo stato del modello.
Se si vuole personalizzare l'aspetto di questi messaggi di errore di prebinding, è necessario creare stringhe di risorse per questi messaggi.
Riepilogo
L'obiettivo di questa esercitazione era descrivere i meccanismi di base della convalida nel framework ASP.NET MVC. Si è appreso come usare lo stato del modello e gli helper HTML di convalida. È stata anche illustrata la distinzione tra la convalida di prebinding e postbinding. In altre esercitazioni verranno illustrate varie strategie per spostare il codice di convalida dai controller e nelle classi del modello.