Per visualizzare l'articolo in inglese, selezionare la casella di controllo Inglese. È possibile anche visualizzare il testo inglese in una finestra popup posizionando il puntatore del mouse sopra il testo.
Traduzione
Inglese

Modelli e convalida in ASP.NET MVC

Nel framework di MVC ASP.NET il modello è la parte dell'applicazione responsabile dell'applicazione principale o della logica di business. Gli oggetti modello effettuano in genere l'accesso ai dati da un archivio permanente, ad esempio SQL Server, ed eseguono la logica di business su tali dati. I modelli sono specifici dell'applicazione e pertanto il framework di MVC ASP.NET non applica restrizioni ai tipi di oggetti modello che è possibile compilare. È ad esempio possibile utilizzare oggetti DataSet o DataReader ADO.NET oppure è possibile utilizzare un set personalizzato di oggetti dominio, nonché una combinazione di tipi di oggetto da utilizzare con i dati.

Il modello non corrisponde a una classe o interfaccia specifica. Una classe fa parte del modello non perché implementa una determinata interfaccia o deriva da una particolare classe di base. Al contrario, una classe fa parte del modello per il ruolo svolto dalla classe nell'applicazione MVC ASP.NET e la posizione in cui la classe si trova nella struttura di cartelle dell'applicazione. Una classe di modello in un'applicazione ASP.NET non gestisce direttamente di input dal browser, né genera output HTML per il browser.

Gli oggetto modello sono le parti dell'applicazione che implementano la logica di dominio, nota anche come logica di business. La logica di dominio gestisce i dati passati tra il database e l'interfaccia utente. Ad esempio, in un sistema di inventario il modello tiene traccia degli elementi a magazzino e della logica per determinare se un elemento è in giacenza. Il modello costituisce inoltre la parte dell'applicazione che aggiorna il database quando un elemento viene venduto e spedito. Spesso inoltre il modello archivia a recupera lo stato del modello in un database.

La cartella consigliata in cui inserire le classi di modello è la cartella Models fornita da Visual Studio nel modello di applicazione MVC ASP.NET. È tuttavia consuetudine inserire le classi di modello in un assembly distinto, in modo da poterle riutilizzare in applicazioni diverse.

L'utilizzo di classi di modello da un controller consiste in genere nella creazione di un'istanza delle classi del modello nelle azioni del controller e nell'estrazione dei dati appropriati da tali oggetti da includere nelle visualizzazioni. Si tratta dell'approccio consigliato per l'implementazione di azioni. Consente inoltre di mantenere separati gli elementi logici dell'applicazione, rendendo più facile eseguire il test della logica dell'applicazione senza dover ricorrere all'interfaccia utente.

Nell'esempio seguente viene illustrata una classe di modello semplice che rappresenta una persona.


using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace MvcSimpleModelBinding.Models
{
    public class Person
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public int Age { get; set; }
        public string Street { get; set; }
        public string City { get; set; }
        public string State { get; set; }
        public int Zipcode { get; set; }
    }
}


Un raccoglitore di modelli in MVC offre un modo semplice per eseguire il mapping dei valori del form inseriti a un tipo di .NET Framework e per passare il tipo a un metodo di azione come parametro. I raccoglitori offrono inoltre il controllo sulla deserializzazione dei tipi passati ai metodi di azione. I raccoglitori di modelli sono simili ai convertitori di tipi, in quanto possono convertire richieste HTTP in oggetti che vengono passati a un metodo di azione. Anch'essi dispongono tuttavia di informazioni sul contesto del controller corrente.

Un gestore di associazione di modelli consente di associare una classe che implementa l'interfaccia IModelBinder mediante un parametro del metodo di azione o un tipo. L'interfaccia IModelBinder contiene un metodo GetValue chiamato dal framework per recuperare il valore di un parametro o di un tipo specificato. La classe DefaultModelBinder può essere utilizzata con la maggior parte dei tipi di .NET Framework, tra cui matrici e oggetti IList, ICollection e IDictionary.

Esempio di raccoglitore di modelli

Nell'esempio seguente viene illustrato come implementare un raccoglitore di modelli semplice. Il modello utilizzato in questo esempio è costituito dalla classe Person definita in un esempio precedente. In questo esempio sono inclusi una classe PersonController, una visualizzazione Index, una visualizzazione Create e una visualizzazione Details. La classe PersonController crea un elenco per l'archiviazione di oggetti Person. Nella visualizzazione Index sono incluse le proprietà Id e Name per ogni oggetto Person dell'elenco. La visualizzazione Create consente all'utente di immettere le informazioni per una persona. Nella visualizzazione Details sono incluse tutte le informazioni per una persona selezionata.

Nell'esempio seguente viene illustrata la classe PersonController:


public class PersonController : Controller
{
    static List<Person> people = new List<Person>();

    //
    // GET: /Person/
    public ActionResult Index()
    {
        return View(people);
    }

    //
    // GET: /Person/Details/5
    public ActionResult Details(Person person)
    {
        return View(person);
    }

    //
    // GET: /Person/Create
    public ActionResult Create()
    {
        return View();
    } 

    //
    // POST: /Person/Create
    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Create(Person person)
    {
        if (!ModelState.IsValid)
        {
            return View("Create", person);
        }

        people.Add(person);

        return RedirectToAction("Index");
    }
}


Nell'esempio seguente viene illustrata la visualizzazione Index:


<h2>Index</h2>

<table>
    <tr>
        <th></th>
        <th>
            Id
        </th>
        <th>
            Name
        </th>
    </tr>

<% foreach (var person in Model) { %>

    <tr>
        <td>
            <%= Html.ActionLink("Details", "Details", person )%>
        </td>
        <td>
            <%= Html.Encode(person.Id) %>
        </td>
        <td>
            <%= Html.Encode(person.Name) %>
        </td>
    </tr>

<% } %>

</table>

<p>
    <%= Html.ActionLink("Create New", "Create") %>
</p>


Nell'esempio seguente viene illustrata la visualizzazione Create:


<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="Id">Id:</label>
            <%= Html.TextBox("Id") %>
            <%= Html.ValidationMessage("Id", "*") %>
        </p>
        <p>
            <label for="Name">Name:</label>
            <%= Html.TextBox("Name") %>
            <%= Html.ValidationMessage("Name", "*") %>
        </p>
        <p>
            <label for="Age">Age:</label>
            <%= Html.TextBox("Age") %>
            <%= Html.ValidationMessage("Age", "*") %>
        </p>
        <p>
            <label for="Street">Street:</label>
            <%= Html.TextBox("Street") %>
            <%= Html.ValidationMessage("Street", "*") %>
        </p>
        <p>
            <label for="City">City:</label>
            <%= Html.TextBox("City") %>
            <%= Html.ValidationMessage("City", "*") %>
        </p>
        <p>
            <label for="State">State:</label>
            <%= Html.TextBox("State") %>
            <%= Html.ValidationMessage("State", "*") %>
        </p>
        <p>
            <label for="Zipcode">Zipcode:</label>
            <%= Html.TextBox("Zipcode") %>
            <%= Html.ValidationMessage("Zipcode", "*") %>
        </p>
        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>

<% } %>

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


Nell'esempio seguente viene illustrata la visualizzazione Details:


<h2>Details</h2>

<fieldset>
    <legend>Fields</legend>
    <p>
        Id:
        <%= Html.Encode(Model.Id) %>
    </p>
    <p>
        Name:
        <%= Html.Encode(Model.Name) %>
    </p>
    <p>
        Age:
        <%= Html.Encode(Model.Age) %>
    </p>
    <p>
        Street:
        <%= Html.Encode(Model.Street) %>
    </p>
    <p>
        City:
        <%= Html.Encode(Model.City) %>
    </p>
    <p>
        State:
        <%= Html.Encode(Model.State) %>
    </p>
    <p>
        Zipcode:
        <%= Html.Encode(Model.Zipcode) %>
    </p>
</fieldset>
<p>
    <%=Html.ActionLink("Back to List", "Index") %>
</p>


Aggiunte alla community

AGGIUNGI
Mostra: