Compartir vía


Acceso a los datos del modelo desde un controlador mediante una plantilla de vista

por Rick Anderson

Nota:

Hay disponible aquí una versión actualizada de este tutorial que usa ASP.NET MVC 5 y Visual Studio 2013. Es más segura, mucho más sencilla de seguir y muestra más características.

En esta sección, creará una clase MoviesController y escribirá código que recupere los datos de películas y los muestre en el explorador mediante una plantilla de vista.

Compile la aplicación antes de continuar con el paso siguiente.

Haga clic con el botón derecho en la carpeta Controllers y cree un controlador MoviesController. Las opciones siguientes no aparecerán hasta que compile la aplicación. Seleccione las opciones siguientes:

  • Nombre del controlador: MoviesController. (Es el valor predeterminado).
  • Plantilla: Controlador de MVC con acciones de lectura o escritura y vistas que usan Entity Framework.
  • Clase de modelo: Movie (MvcMovie.Models).
  • Clase de contexto de datos: MovieDBContext (MvcMovie.Models).
  • Vistas: Razor (CSHTML). (El valor predeterminado).

AddScaffoldedMovieController

Haga clic en Agregar. Visual Studio Express crea los siguientes archivos y carpetas:

  • Un archivo MoviesController.cs en la carpeta Controllers del proyecto.
  • Una carpeta Movies en la carpeta Views del proyecto.
  • Create.cshtml, Delete.cshtml, Details.cshtml, Edit.cshtml y Index.cshtml en la nueva carpeta Views\Movies.

ASP.NET MVC 4 ha creado automáticamente los métodos de acción CRUD (crear, leer, actualizar y eliminar) y las vistas (la creación automática de métodos de acción CRUD y vistas se conoce como scaffolding). Ahora tiene una aplicación web totalmente funcional que le permite crear, enumerar, editar y eliminar entradas de películas.

Ejecute la aplicación y vaya al controlador Movies; para ello, anexe /Movies a la URL en la barra de direcciones del explorador. Como la aplicación se basa en el enrutamiento predeterminado (definido en el archivo Global.asax), la solicitud del explorador http://localhost:xxxxx/Movies se enruta al método de acción Index predeterminado del controlador Movies. Es decir, la solicitud del explorador http://localhost:xxxxx/Movies es efectivamente la misma que la solicitud del explorador http://localhost:xxxxx/Movies/Index. El resultado es una lista vacía de películas, ya que aún no ha agregado ninguna.

Captura de pantalla que muestra la página Índice de películas de M V C.

Creación de una película

Seleccione el vínculo Crear nuevo. Escriba algunos detalles sobre una película y, después, haga clic en el botón Crear.

Captura de pantalla que muestra la página Creación de películas de M V C.

Al hacer clic en el botón Crear, el formulario se publica en el servidor, donde la información de la película se guarda en la base de datos. Después, se le redirige a la dirección URL /Movies, donde puede ver la película recién creada en la lista.

IndexWhenHarryMet

Cree un par de entradas más de película. Compruebe que todos los vínculos Editar, Detalles y Eliminar son funcionales.

Examen del código generado

Abra el archivo Controllers\MoviesController.cs y examine el método Index generado. A continuación se muestra una parte del controlador de película con el método Index.

public class MoviesController : Controller
{
    private MovieDBContext db = new MovieDBContext();

    //
    // GET: /Movies/

    public ActionResult Index()
    {
        return View(db.Movies.ToList());
    }

La siguiente línea de la clase MoviesController crea una instancia de un contexto de base de datos de películas, como se ha descrito antes. Puede usar el contexto de base de datos de películas para consultar, editar y eliminar películas.

private MovieDBContext db = new MovieDBContext();

Una solicitud al controlador Movies devuelve todas las entradas de la tabla Movies de la base de datos de películas y, después, pasa los resultados a la vista Index.

Modelos fuertemente tipados y la palabra clave @model

Anteriormente en este tutorial, ha visto cómo un controlador puede pasar datos u objetos a una vista mediante el objeto ViewBag. ViewBag es un objeto dinámico que proporciona una cómoda manera enlazada en tiempo de ejecución de pasar información a una vista.

ASP.NET MVC también ofrece la funcionalidad de pasar datos u objetos fuertemente tipados a una plantilla de vista. Este enfoque fuertemente tipado permite una mejor comprobación en tiempo de compilación del código e IntelliSense más enriquecido en el editor de Visual Studio. El mecanismo de scaffolding de Visual Studio ha usado este enfoque con la clase MoviesController y las plantillas de vista al crear los métodos y las vistas.

En el archivo Controllers\MoviesController.cs, examine el método Details generado. A continuación se muestra una parte del controlador de película con el método Details.

public ActionResult Details(int id = 0)
{
    Movie movie = db.Movies.Find(id);
    if (movie == null)
    {
        return HttpNotFound();
    }
    return View(movie);
}

Si se encuentra Movie, se pasa una instancia del modelo Movie a la vista Details. Examine el contenido del archivo Views/Movies/Details.cshtml.

Mediante la inclusión de una instrucción @model en la parte superior del archivo de plantilla de vista, puede especificar el tipo de objeto que espera la vista. Cuando se creó el controlador de película, Visual Studio incluyó automáticamente la siguiente instrucción @model en la parte superior del archivo Details.cshtml:

@model MvcMovie.Models.Movie

Esta directiva @model permite acceder a la película que el controlador pasó a la vista usando un objeto Model fuertemente tipado. Por ejemplo, en la plantilla Details.cshtml, el código pasa cada campo de película a los asistentes de HTML DisplayNameFor y DisplayFor con el objeto Model fuertemente tipado. Los métodos Create y Edit, y las plantillas de vista también pasan un objeto de modelo de película.

Examine la plantilla de vista Index.cshtml y el método Index en el archivo MoviesController.cs. Observe cómo el código crea un objeto List cuando llama al método asistente View en el método de acción Index. Después, el código pasa esta lista Movies desde el controlador a la vista:

public ActionResult Index()
{
    return View(db.Movies.ToList());
}

Al crear el controlador de película, Visual Studio Express ha incluido automáticamente la siguiente instrucción @model en la parte superior del archivo Index.cshtml:

@model IEnumerable<MvcMovie.Models.Movie>

Esta directiva @model permite acceder a la lista de películas que el controlador ha pasado a la vista mediante un objeto Model fuertemente tipado. Por ejemplo, en la plantilla Index.cshtml, el código recorre en bucle las películas con una instrucción foreach sobre el objeto Model fuertemente tipado:

@foreach (var item in Model) {
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.Title)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.ReleaseDate)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Genre)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Price)
        </td>
         <th>
            @Html.DisplayFor(modelItem => item.Rating)
        </th>
        <td>
            @Html.ActionLink("Edit", "Edit", new { id=item.ID }) |
            @Html.ActionLink("Details", "Details", { id=item.ID })  |
            @Html.ActionLink("Delete", "Delete", { id=item.ID }) 
        </td>
    </tr>
}

Como el objeto Model es fuertemente tipado (como un objeto IEnumerable<Movie>), cada objeto item del bucle está tipado como Movie. Entre otras ventajas, esto significa que obtiene la comprobación en tiempo de compilación del código y la compatibilidad completa de IntelliSense en el editor de código:

ModelIntelliSense

Trabajar con SQL Server LocalDB

Code First de Entity Framework ha detectado que la cadena de conexión de la base de datos proporcionada apuntaba a una base de datos Movies que aún no existía, por lo que Code First ha creado automáticamente la base de datos. Para comprobar que se ha creado, busque en la carpeta App_Data. Si no ve el archivo Movies.mdf, haga clic en el botón Mostrar todos los archivos de la barra de herramientas del Explorador de soluciones, haga clic en el botón Actualizar y, después, expanda la carpeta App_Data.

Captura de pantalla que muestra la ventana Explorador de soluciones. El icono Mostrar todos los archivos se encuentra en rojo y se selecciona la carpeta Datos de la aplicación.

Haga doble clic en Movies.mdf para abrir el Explorador de bases de datos y expanda la carpeta Tables para ver la tabla Movies.

DB_explorer

Nota:

Si el Explorador de bases de datos no aparece, en el menú HERRAMIENTAS, seleccione Conectar a la base de datos y, después, cancele el cuadro de diálogo Elegir origen de datos. Esto forzará la apertura del explorador de bases de datos.

Nota:

Si usa VWD o Visual Studio 2010, y recibe un error similar al siguiente:

  • La base de datos "C:\Webs\MVC4\MVCMOVIE\MVCMOVIE\APP_DATA\MOVIES.MDF" no se puede abrir porque es la versión 706. Este servidor admite la versión 655 y anteriores. No se admite esta ruta de actualización.
  • "Excepción InvalidOperation Exception no controlada en el código del usuario" El valor SqlConnection proporcionado no especifica un catálogo inicial.

Debe instalar SQL Server Data Tools y LocalDB. Compruebe la cadena de conexión MovieDBContext especificada en la página anterior.

Haga clic con el botón derecho en la tabla Movies y seleccione Mostrar datos de tabla para ver los datos que ha creado.

Captura de pantalla que muestra la pestaña d b o dot Movies Data (Datos de películas).

Haga clic con el botón derecho en la tabla Movies y seleccione Abrir definición de tabla para ver la estructura de tabla que Code First de Entity Framework ha creado automáticamente.

Captura de pantalla que muestra la ventana Explorador de bases de datos. La opción Abrir definición de tabla está seleccionada en el menú Películas clic con el botón derecho.

Captura de pantalla que muestra la pestaña d b o dot Movies y el código de Entity Framework debajo.

Observe cómo el esquema de la tabla Movies se asigna a la clase Movie que ha creado antes. Code First de Entity Framework ha creado automáticamente este esquema en función de la clase Movie.

Cuando haya terminado, para cerrar la conexión haga clic con el botón derecho en MovieDBContext y seleccione Cerrar conexión. (Si no cierra la conexión, es posible que reciba un error la próxima vez que ejecute el proyecto).

Captura de pantalla que muestra la ventana Explorador de bases de datos. Cerrar conexión está seleccionada en el menú contextual movie D B.

Ahora tiene la base de datos y una página de descripción sencilla para mostrar contenido de ella. En el siguiente tutorial, se examinará el resto del código con scaffolding y se agregará un método SearchIndex y una vista SearchIndex que le permite buscar películas en esta base de datos.