Condividi tramite


Esecuzione di una convalida semplice (VB)

di Stephen Walther

Informazioni su come eseguire la convalida in un'applicazione MVC ASP.NET. In questa esercitazione Stephen Walther introduce 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. Ad esempio, si apprenderà 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

Si usa 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 List 1 convalida le proprietà di una classe Product prima di aggiungere la classe Product a un database.

Non è consigliabile aggiungere la convalida o la logica di database a un controller. Un controller deve contenere solo la logica correlata al controllo del flusso dell'applicazione. Stiamo prendendo un collegamento per mantenere semplici le cose.

Elenco 1 - Controller\ProductController.vb

'
' POST: /Product/Create

<AcceptVerbs(HttpVerbs.Post)> _
Public Function Create(<Bind(Exclude:="Id")> ByVal productToCreate As Product) As ActionResult
    ' Validation logic
    If productToCreate.Name.Trim().Length = 0 Then
    ModelState.AddModelError("Name", "Name is required.")
    End If
    If productToCreate.Description.Trim().Length = 0 Then
    ModelState.AddModelError("Description", "Description is required.")
    End If
    If productToCreate.UnitsInStock

Nell'elenco 1 vengono convalidate le proprietà Name, Description e UnitsInStock della classe Product. Se una di queste proprietà non riesce un test di convalida, viene aggiunto un errore al dizionario dello stato del modello (rappresentato dalla proprietà ModelState della classe Controller).

Se si verificano 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 redisplayed. In caso contrario, se non sono presenti errori di convalida, il nuovo prodotto viene aggiunto al database.

Uso degli helper di convalida

Il framework ASP.NET MVC 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 Create and Edit generate automaticamente dalla ASP.NET MVC scaffolding. Seguire questa procedura per generare la visualizzazione Crea:

  1. Fare clic con il pulsante destro del mouse sull'azione Create() nel controller Product e selezionare l'opzione aggiungi visualizzazione del menu (vedere Figura 1).
  2. Nella finestra di dialogo Aggiungi visualizzazione selezionare la casella di controllo Creata una visualizzazione fortemente tipizzata (vedere la figura 2).
  3. Nell'elenco a discesa Visualizza classe dati selezionare la classe Product.
  4. Nell'elenco a discesa Visualizza contenuto selezionare Crea.
  5. 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 .

Screenshot del file Product Controller dot c s nell'editor di codice, che mostra il menu con il pulsante destro del mouse con la voce di menu Aggiungi visualizzazione evidenziata.

Figura 01: Aggiunta di una vista(Fare clic per visualizzare l'immagine full-size)

Screenshot della finestra di dialogo Aggiungi visualizzazione, che mostra che la casella di controllo Crea una visualizzazione fortemente tipizzata viene compilata.

Figura 02: Creazione di una visualizzazione fortemente tipizzata (fare clic per visualizzare l'immagine a dimensioni complete)

Dopo aver completato questi passaggi, si ottiene la visualizzazione Crea nella presentazione 2.

Presentazione 2 - Views\Product\Create.aspx

<%@ Page Title="" Language="VB" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage(Of MvcApplication1.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>

    <% End Using %>

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

Screenshot della finestra Internet Explorer che mostra la visualizzazione Crea con messaggi di errore risultanti dai campi compilati con valori non validi.

Figura 03: La visualizzazione Crea inviata con problemi (Fare clic per visualizzare l'immagine full-size)

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().

Esistono tre classi del foglio di stile a catena usate per controllare l'aspetto degli errori di convalida:

  • input-validation-error: applicato al tag di input> sottoposto a rendering dall'helper <Html.TextBox().
  • field-validation-error: applicato al tag di intervallo> sottoposto a rendering dall'helper <Html.ValidationMessage().
  • validation-summary-errors: applicato al tag ul> sottoposto a rendering dall'helper <Html.ValidationSummary().

È possibile modificare queste classi del foglio di stile a catena e quindi modificare l'aspetto degli errori di convalida modificando il file Site.css presente 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 prebinding e convalida postbinding

Se si invia il modulo HTML per la creazione di un prodotto e si immette un valore non valido per il campo prezzo e nessun valore per il campo UnitsInStock, si otterranno i messaggi di convalida visualizzati nella figura 4. Da dove provengono questi messaggi di errore di convalida?

Screenshot della finestra Internet Explorer, che mostra i campi Price and Units in Stock ( Prezzi e unità) sono errori di convalida.

Figura 04: Prebinding Validation Errors (Fare clic per visualizzare l'immagine full-size)

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 del modulo sono associati alla classe. In altre parole, esistono errori di convalida prebinding e postbinding degli errori di convalida.

L'azione Create() esposta dal controller Product in List 1 accetta un'istanza della classe Product. La firma del metodo Create è simile alla seguente:

Public Function Create(<Bind(Exclude:="Id")> ByVal productToCreate As Product) As ActionResult

I valori dei campi del modulo HTML dal modulo Create sono associati alla classe ProductToCreate da qualcosa denominato binding del modello. Il binding del modello predefinito aggiunge automaticamente un messaggio di errore allo stato del modello quando non può associare un campo modulo a una proprietà del modulo.

Il binding del modello predefinito non può associare la stringa "apple" alla proprietà Price della classe Product. Non è possibile assegnare una stringa a una proprietà decimale. Pertanto, il binding del modello aggiunge un errore allo stato del modello.

Il binding del modello predefinito non può anche assegnare il valore Nothing a una proprietà che non accetta il valore Nothing. In particolare, il bindinger del modello non può assegnare il valore Nothing alla proprietà UnitsInStock. Ancora una volta, il binder del modello 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 è descrivere la meccanica di base della convalida nel framework MVC ASP.NET. Si è appreso come usare lo stato del modello e gli helper HTML di convalida. È stata anche illustrata la distinzione tra la prebinding e la convalida postbinding. In altre esercitazioni verranno illustrate varie strategie per spostare il codice di convalida dai controller e nelle classi di modello.