Para ver el artículo en inglés, active la casilla Inglés. También puede ver el texto en inglés en una ventana emergente si pasa el puntero del mouse por el texto.
Traducción
Inglés

Modelos y validación en ASP.NET MVC

En el marco de ASP.NET MVC, el modelo forma parte de la aplicación que es responsable de la aplicación básica o la lógica comercial. Los objetos de modelo normalmente obtienen acceso a los datos desde un almacén persistente, como SQL Server, y realizan la lógica comercial en esos datos. Los modelos son específicos de la aplicación y, por consiguiente, el marco de ASP.NET MVC no impone ninguna restricción sobre los tipos de objetos de modelo que se pueden generar. Por ejemplo, puede utilizar objetos DataReader o DataSet de ADO.NET o puede utilizar un conjunto personalizado de objetos de dominio. También puede utilizar una combinación de tipos de objeto para trabajar con datos.

El modelo no es una clase o interfaz determinada. Una clase forma parte del modelo no porque implemente una determinada interfaz o derive de una determinada clase base, sino debido al rol que la clase representa en la aplicación ASP.NET MVC y dónde la clase se encuentra en la estructura de carpetas de la aplicación. Una clase de modelo en una aplicación ASP.NET MVC no administra directamente la entrada del explorador ni genera la salida HTML al explorador.

Los objetos del modelo son las partes de la aplicación que implementan la lógica del dominio, también conocida como la lógica comercial. La lógica del dominio administra los datos que se pasan entre la base de datos y la interfaz de usuario. Por ejemplo, en un sistema de inventario, el modelo lleva un seguimiento de los elementos en almacenamiento y la lógica para determinar si un artículo está en inventario. Además, el modelo formaría parte de la aplicación que actualiza la base de datos cuando un artículo se vende y distribuye fuera del almacén. A menudo, el modelo también almacena y recupera el estado modelo en una base de datos.

La carpeta recomendada para colocar las clases de modelo es la carpeta Models, proporcionada por Visual Studio en la plantilla de la aplicación ASP.NET MVC. Sin embargo, también es habitual colocar las clases modelo en un ensamblado independiente, para que puedan reutilizarse estas clases en aplicaciones diferentes.

Utilizar las clases modelo de un controlador normalmente consiste en crear instancias de las clases modelo en acciones de controlador, llamando a métodos de los objetos modelo y extrayendo los datos adecuados de estos objetos para mostrarlos en vistas. Este es el enfoque recomendado para implementar las acciones. También mantiene la separación entre los elementos lógicos de la aplicación, lo que facilita probar la lógica de la aplicación sin tener que probarla mediante la interfaz de usuario.

En el ejemplo siguiente se muestra una clase de modelo simple que representa un rol.


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 enlazador modelo en MVC proporciona una manera sencilla para asignar los valores de formulario expuestos a un tipo .NET Framework y pasar el tipo a un método de acción como un parámetro. Los enlazadores también ofrecen control sobre la deserialización de tipos que se pasan a los métodos de acción. Los enlazadores modelo son como los convertidores de tipos, porque pueden convertir las solicitudes HTTP en objetos que se pasan a un método de acción. Sin embargo, también tienen información sobre el contexto del controlador actual.

Un enlazador de modelos permite asociar una clase que implementa la interfaz IModelBinder mediante un parámetro del método de acción o mediante un tipo. La interfaz IModelBinder contiene un método GetValue al que llama el marco para recuperar el valor de un parámetro o tipo especificado. La clase DefaultModelBinder funciona con la mayoría de los tipos .NET Framework, incluidos matrices e IList, y los objetos IDictionary e ICollection.

Ejemplo de enlace modelo

En el ejemplo siguiente se muestra cómo implementar el enlace modelo simple. El modelo utilizado en este ejemplo es la clase Person que se definió en un ejemplo anterior. En este ejemplo se incluyen una clase PersonController y las vistas Index, Create y Details. La clase PersonController crea una lista para almacenar los objetos Person. La vista Index muestra las propiedades Id y Name de cada objeto Person de la lista. La vista Create permite al usuario escribir la información para un rol. La vista Details muestra toda la información sobre un rol seleccionado.

En el siguiente ejemplo se muestra la clase 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");
    }
}


En el ejemplo siguiente se muestra la vista 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>


En el ejemplo siguiente se muestra la vista 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>


En el siguiente ejemplo se muestra la vista 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>


Adiciones de comunidad

AGREGAR
Mostrar: