Você está na página 1de 96

Introduccin a ASP.

NET MVC 4
Intro to ASP.NET MVC 4
Por Rick Anderson|15 De agosto de 2012

Este tutorial le ensear los fundamentos de la creacin de una aplicacin ASP.NET MVC 4 Web utilizando
Microsoft Visual Studio Express 2012 o Visual Web Developer 2010 Express Service Pack 1. Visual Studio
2012 se recomienda, no necesitars instalar nada para completar el tutorial. Si est utilizando Visual
Studio 2010, debe instalar los componentes ms abajo. Puede instalar todas ellas haciendo clic en los
enlaces siguientes:
Requisitos visuales Studio Web Developer Express SP1
Instalador WPI para ASP.NET MVC 4
LocalDB
SSDT
Si est utilizando Visual Studio 2010 en lugar de Visual Web Developer 2010, instale el instalador WPI para
ASP.NET MVC 4 y el: requisitos previos de Visual Studio 2010
Un proyecto de Visual Web Developer con cdigo fuente C# est disponible para acompaar a este
tema.Descargar la versin de C#.
En el tutorial de ejecutar la aplicacin en Visual Studio. Tambin puedes la aplicacin disponible en Internet
mediante la implementacin de un proveedor de hosting. Microsoft ofrece alojamiento web gratis para
hasta 10 sitios web en una cuenta de prueba gratis de Windows Azure. Para obtener informacin sobre
cmo implementar un proyecto web de Visual Studio a un sitio Web de Windows Azure, consulte crear e
implementar un sitio web ASP.NET y base de datos SQL con Visual Studio. Este tutorial tambin muestra
cmo utilizar la entidad marco cdigo primera migraciones para implementar su base de datos de SQL
Server en la base de datos de SQL Azure del Windows (anteriormente SQL Azure).

Lo que construirs
A aplicar una sencilla aplicacin de pelcula-listado que apoya la creacin, edicin, bsqueda y listado de
pelculas de una base de datos. A continuacin se muestran dos imgenes de la aplicacin que
construirs. Incluye una pgina que muestra una lista de pelculas desde una base de datos:
La aplicacin tambin le permite agregar, editar y eliminar pelculas, as como ver detalles sobre los
individuales.Todos los escenarios de entrada de datos incluyen la validacin para garantizar que los datos
almacenados en la base de datos estn correctos.
Getting Started
Inicie Visual Studio Express 2012 o Visual Web Developer 2010 Express. La mayora de las capturas de
pantalla en esta serie de aplicacin Visual Studio Express 2012, pero usted puede completar este tutorial
con Visual Studio 2010/SP1, 2012 de Visual Studio, Visual Studio Express 2012 o Visual Web Developer
2010 Express. SeleccioneNuevo proyecto en la pgina de Inicio .
Visual Studio es un IDE o entorno de desarrollo integrado. Al igual que utilizar Microsoft Word para escribir
documentos, utilizar un IDE para crear aplicaciones. En Visual Studio, hay una barra de herramientas en
la parte superior que muestra varias opciones disponibles para usted. Tambin hay un men que ofrece
otra manera para realizar tareas en el IDE. (Por ejemplo, en lugar de seleccionar el Nuevo proyecto de la
pgina de Inicio , puede utilizar el men y seleccione archivo > Nuevo proyecto.)

Crear su primera aplicacin


Puede crear aplicaciones usando Visual Basic o Visual C# como lenguaje de programacin. Seleccione
Visual C# a la izquierda y seleccione La aplicacin Web ASP.NET MVC 4. Nombre de su proyecto
"MvcMovie" y haga clic enAceptar.
En el cuadro de dilogo Nuevo proyecto de ASP.NET MVC 4 , seleccione Aplicacin de Internet. Deje
laafeitadora como el motor de vista predeterminado.
Haga clic en Aceptar. Visual Studio utiliza una plantilla predeterminada para el proyecto de ASP.NET MVC
que acaba de crear, para que tenga una aplicacin de trabajo ahora mismo sin hacer nada! Se trata de un
simple proyecto " Hola mundo!", y es un buen lugar para comenzar su aplicacin.
Desde el men depurar , seleccione Iniciar depuracin.
Observe que el mtodo abreviado de teclado para empezar a depurar es F5.

F5 hace que Visual Studio Inicie IIS Express y ejecutar la aplicacin web. Visual Studio entonces lanza un
navegador y abre la Pgina principal de la aplicacin. Tenga en cuenta que la barra de direcciones del
navegador dicelocalhost y no algo como example.com. Eso es porque localhost apunta siempre a su propio
equipo local, que en este caso se ejecuta la aplicacin que usted slo construido. Cuando se ejecuta un
proyecto web en Visual Studio, un puerto aleatorio se utiliza para el servidor web. En la imagen siguiente,
el nmero de puerto es 41788.Cuando se ejecuta la aplicacin, probablemente veremos un nmero de
puerto distinto.
Sacarlo de la caja esta plantilla predeterminada le da inicio, contactos y sobre las pginas. Tambin presta
apoyo para registrarse y acceder y enlaces a Facebook y Twitter. El siguiente paso es cambiar el
funcionamiento de esta aplicacin y aprender un poco sobre ASP.NET MVC. Cerrar el navegador y vamos a
cambiar algo de cdigo.

Aadir un controlador
Adding a Controller
Por Rick Anderson|28 De agosto de 2012

MVC est parado para model-view-controller. MVC es un patrn para el desarrollo de aplicaciones que son
fciles de mantener, bien diseada y comprobable. Aplicaciones basadas en MVC contienen:
Modelos: clases que representan los datos de la aplicacin y que usar la lgica de validacin para
aplicar reglas de negocio para los datos.
Vaba: archivos de plantilla que la aplicacin utiliza para generar dinmicamente las respuestas
HTML.
Controllers: clases que manejan las solicitudes entrantes de navegador, recuperar datos de modelo
y especificar plantillas de vista que devuelven una respuesta al navegador.
Nosotros ser cubriendo todos estos conceptos en esta serie de tutoriales y mostrarle cmo utilizarlos para
crear una aplicacin.
Vamos a empezar por crear una clase de controlador. En Explorador de soluciones, haga clic
derecho en elcontroladores carpeta y a continuacin, seleccione Agregar controlador.

Nombre de su nuevo controlador "HelloWorldController". Dejar la plantilla predeterminada


como controlador MVC vaco y haga clic en Agregar.
Aviso Explorador de soluciones que crea un nuevo archivo ha sido
nombrado HelloWorldController.cs. El archivo est abierto en el IDE.
Sustituir el contenido del archivo con el cdigo siguiente.

using System.Web;
using System.Web.Mvc;

namespace MvcMovie.Controllers
{
public class HelloWorldController : Controller
{
//
// GET: /HelloWorld/

public string Index()


{
return "This is my <b>default</b> action...";
}

//
// GET: /HelloWorld/Welcome/
public string Welcome()
{
return "This is the Welcome action method...";
}
}
}
Los mtodos del controlador devolver una cadena de HTML como un ejemplo. El controlador se
denominaHelloWorldController y se llama el primer mtodo anterior Index. Vamos a invocarlo desde un
navegador.Ejecute la aplicacin (presione F5 o Ctrl + F5). En el navegador, anexar "HelloWorld" a la ruta
en la barra de direcciones. (Por ejemplo, en la figura de abajo, es http://localhost:1234/HelloWorld.) La
pgina en el navegador se ver como la siguiente pantalla. En el mtodo anterior, el cdigo devuelto una
cadena directamente. Me dijiste que el sistema slo volver algunos HTML, y as fue!

ASP.NET MVC invoca otro regulador clases (y mtodos de accin diferentes dentro de ellos) dependiendo
de la URL de entrada. La lgica de enrutamiento de enlace por defecto utilizada por ASP.NET MVC utiliza un
formato como este para determinar qu cdigo para invocar:
/[Controller]/[ActionName]/[Parameters]
La primera parte de la URL determina la clase del controlador para ejecutar. Tan /HelloWorld asigna a
laHelloWorldController clase. La segunda parte de la URL determina el mtodo de accin en la clase a
ejecutar.Tan /HelloWorld/Index causara la Index mtodo de la HelloWorldController clase a ejecutar. Tenga
en cuenta que slo tuvimos que buscar a /HelloWorld y el Index mtodo fue utilizado por defecto. Esto es
porque un mtodo denominado Index es el mtodo por defecto que se llamar en un controlador, si uno no
se especifica explcitamente.
Vaya a http://localhost:xxxx/HelloWorld/Welcome. El Welcome mtodo funciona y devuelve la cadena "Este
es el mtodo de accin Bienvenido...". La asignacin de MVC predeterminada es/[Controller]/
[ActionName]/[Parameters]. Para esta URL, es el controlador HelloWorld y Welcome es el mtodo de
accin. No has usado el [Parameters] parte de la URL todava.
Vamos a modificar un poco el ejemplo por lo que puede pasar alguna informacin del parmetro de la URL
al controlador (por ejemplo, /HelloWorld/bienvenida? nombre = Scott & numtimes = 4). Cambio
su Welcome mtodo para incluir dos parmetros como se muestra a continuacin. Observe que el cdigo
utiliza la caracterstica de parmetro opcional de C# para indicar que el numTimes parmetro debe por
defecto a 1 si no se pasa ningn valor para ese parmetro.
public string Welcome(string name, int numTimes = 1) {
return HttpUtility.HtmlEncode("Hello " + name + ", NumTimes is: " + numTimes);
}
Ejecutar la aplicacin y vaya a la URL de ejemplo (http://localhost:xxxx/HelloWorld/Welcome?
name=Scott&numtimes=4). Puedes probar diferentes valores para name y numtimes en la URL. El sistema
de fijacin de ASP.NET MVC modelo asigna automticamente los parmetros con nombre de la cadena de
consulta en la barra de direcciones para parmetros en su mtodo.
En tanto estos ejemplos el controlador viene realizando la parte de "VC" de MVC es decir, la obra vista y
controlador. El controlador est volviendo HTML directamente. Normalmente no quieren controladores
volver HTML directamente, puesto llega a ser muy incmodo al cdigo. En cambio, normalmente usaremos
un archivo de plantilla de vista separada para ayudar a generar la respuesta HTML. Echemos un vistazo
siguiente en cmo podemos hacer esto.

Agregar una vista


Adding a View
Por Rick Anderson|28 De agosto de 2012

En esta seccin vas a modificar la clase de HelloWorldController para utilizar archivos de plantilla de la
vista para encapsular limpiamente el proceso de generar respuestas HTML a un cliente.

A crear un archivo de plantilla de vista utilizando el motor de vistas de maquinilla de afeitar con ASP.NET
MVC 3.Enfoque basado en la maquinilla de afeitar las plantillas tienen un .cshtml extensin del archivo y
proporcionar una manera elegante de crear HTML de salida utilizando C#. Maquinilla de afeitar minimiza el
nmero de caracteres y pulsaciones de teclas necesarias al escribir una plantilla de vista y permite un
fluido rpido, codificacin de flujo de trabajo.

Actualmente el mtodo de Index devuelve una cadena con un mensaje codificado en la clase del
controlador.Cambiar el mtodo de Index para devolver un objeto View , como se muestra en el siguiente
cdigo:

public ActionResult Index()


{
return View();
}

El mtodo de Index anterior utiliza una plantilla de vista para generar una respuesta HTML al
navegador. Mtodos de controlador (tambin conocido como mtodos de accin), como el mtodo
de Index anterior, generalmente devuelven un ActionResult (o una clase derivada de ActionResult), los
tipos primitivos no como cadena.

En el proyecto, agregue una plantilla de vista que se puede utilizar con el mtodo de Index . Para ello,
haga clic derecho dentro del mtodo de Index y haga clic en Agregar ver.
Aparece el cuadro de dilogo Agregar ver . Dejar los predeterminados de la manera que se haga clic en
el botnAgregar :

Se crean la carpeta MvcMovie\Views\HelloWorld y el archivo MvcMovie\Views\HelloWorld\Index.cshtml . Se


los puede ver en el Explorador de soluciones:
A continuacin muestra el archivo Index.cshtml que se cre:
Agregue el siguiente cdigo HTML en la etiqueta <h2> .

<p>Hello from our View Template!</p>

A continuacin se muestra el archivo completo de MvcMovie\Views\HelloWorld\Index.cshtml .

@{
ViewBag.Title = "Index";
}

<h2>Index</h2>

<p>Hello from our View Template!</p>

Si est utilizando Visual Studio 2012, en el explorador de soluciones, haga clic con el botn derecho el
archivoIndex.cshtml y seleccione Mostrar en la pgina Inspector.
El Inspector pgina tutorial tiene ms informacin acerca de esta nueva herramienta.

Tambin puede ejecutar la aplicacin y busque el


controlador HelloWorld (http://localhost:xxxx/HelloWorld). El mtodo de Index en su controlador no mucho
trabajo; simplemente funcion la declaracin return View(), que especifica que el mtodo debe utilizar un
archivo de plantilla de vista para representar una respuesta al navegador. Porque no especificar
explcitamente el nombre del archivo de plantilla de vista utilizar, ASP.NET MVC por defecto utilizando
el Index.cshtml Ver archivo en la carpeta \Views\HelloWorld . La imagen de abajo muestra la cadena "Hola
de nuestra plantilla de vista!" en la vista.
Se ve bastante bien. Sin embargo, observe que barra de ttulo del navegador muestra "ndice mi A
ASP.NET" y el gran enlace en la parte superior de la pgina dice "logo aqu." A continuacin el enlace de
"su logotipo aqu." registro y entrar en enlaces y por debajo de la que se vincula a la casa, cerca y pginas
de contacto. Vamos a cambiar algunas de ellas.

Cambiar puntos de vista y pginas de diseo


En primer lugar, usted quiere cambiar el ttulo "tu logo aqu.", en la parte superior de la pgina. Ese texto
es comn a todas las pginas. Realmente se implementa en un nico lugar en el proyecto, a pesar de que
aparece en cada pgina de la aplicacin. Vaya a la carpeta /Views/Shared en el Explorador de
soluciones y abra el archivo_Layout.cshtml . Este archivo se llama una pgina de diseo y es compartido
"shell" que utilizan todas las dems pginas.
Las plantillas de diseo permiten especificar el diseo de envase HTML de su sitio en un solo lugar y luego
aplicarlo a travs de varias pginas en su sitio. Busque la lnea de @RenderBody() . RenderBody es un
marcador de posicin donde todas las pginas de vista que creas demuestran para arriba, "envueltas" en
la pgina de diseo.Por ejemplo, si selecciona el enlace de sobre, el punto de
vista Views\Home\About.cshtml se representa dentro del mtodo RenderBody .

Cambie el encabezado del ttulo de sitio en la plantilla de diseo de "tu logo aqu" a la pelcula"MVC".
<div class="float-left">
<p class="site-title">@Html.ActionLink("MVC Movie", "Index", "Home")</p>
</div>

Reemplace el contenido del elemento title con el siguiente marcado:

<title>@ViewBag.Title - Movie App</title>

Ejecute la aplicacin y observe que ahora dice "MVC Movie". Haga clic en el enlace de sobre y ver cmo
esa pgina muestra "la pelcula MVC", tambin. Hemos sido capaces de hacer el cambio una vez en la
plantilla de diseo y con todas las pginas en el sitio reflejan el nuevo ttulo.

Ahora, vamos a cambiar el ttulo de la vista de ndice.

Abrir MvcMovie\Views\HelloWorld\Index.cshtml. Hay dos lugares para hacer un cambio: en primer lugar, el
texto que aparece en el ttulo del navegador y luego en el encabezado secundario (el elemento <h2> ). Te
haces algo diferente para que pueda ver que poco de cdigo cambia que parte de la aplicacin.
@{
ViewBag.Title = "Movie List";
}

<h2>My Movie List</h2>

<p>Hello from our View Template!</p>

Para indicar el ttulo HTML para mostrar, el cdigo anterior establece una propiedad Title del
objeto ViewBag(que es en la plantilla de vista de la Index.cshtml ). Si miras hacia atrs en el cdigo de la
plantilla de diseo, usted notar que la plantilla utiliza este valor en el elemento de <title> como parte de
la seccin <head> del HTML que modificamos anteriormente. Utilizando este enfoque ViewBag ,
fcilmente puede pasar otros parmetros entre la plantilla de la vista y el archivo de diseo.

Ejecute la aplicacin y vaya a http://localhost:xx/HelloWorld. Tenga en cuenta que han cambiado el ttulo
del navegador, el ttulo principal y los ttulos secundarios. (Si no ve cambios en el navegador, usted puede
estar viendo contenido almacenado en cach. Presione CTRL+F5 en tu navegador para forzar la respuesta
desde el servidor a cargarse). El ttulo del navegador se crea con la ViewBag.Title que hemos creado en la
plantilla de vista de la Index.cshtml y el adicional "-pelcula App" en el archivo de diseo.

Tambin se observa cmo el contenido de la plantilla de vista Index.cshtml se fusion con la plantilla de
vista_Layout.cshtml y una sola respuesta HTML fue enviada al navegador. Plantillas de diseo hacen
realmente fciles de realizar cambios que afecten a travs de todas las pginas de la aplicacin.

Nuestro poco de "datos" (en este caso el mensaje "Hola de nuestra plantilla de vista!") es modificable, sin
embargo. La aplicacin MVC tiene una "V" (ver) y ya tienes una "C" (controlador), pero no "M" (modelo)
todava.Dentro de poco, caminaremos a travs de cmo crear una base de datos y recuperar datos de
modelo de l.

Pasar datos del controlador a la vista


Antes de ir a una base de datos y hablar de modelos, sin embargo, primero hablemos pasando informacin
del controlador a la vista. Las clases del controlador se invocan en respuesta a una solicitud de enlace
entrante. Una clase de controlador es donde se escribe el cdigo que controla el navegador entrante pide,
recupera los datos de una base de datos y en ltima instancia decide qu tipo de respuesta para enviar
hacia el navegador. Plantillas de vista pueden utilizarse luego de un controlador para generar y dar
formato a una respuesta HTML al navegador.

Controladores son responsables de proporcionar cualquier informacin u objetos son necesaria para una
plantilla de vista representar una respuesta al navegador. Una mejor prctica: una plantilla de vista
nunca debe realizar la lgica de negocio o interactuar con una base de datos directamente. En
cambio, una plantilla de vista debe trabajar slo con los datos que es proporcionados por el
controlador. Mantener esta "separacin de preocupaciones" ayuda a mantener el cdigo limpio,
comprobables y ms fcil de mantener.

Actualmente, el mtodo de accin Welcome en la clase HelloWorldController tiene un name y un


parmetro denumTimes y entonces salidas los valores directamente en el navegador. En lugar de tener el
controlador representar esta respuesta como una cadena, vamos a cambiar el controlador para usar una
plantilla de vista en su lugar. La plantilla de vista generar una respuesta dinmica, por lo que usted tiene
que pasar brocas adecuadas de datos del controlador a la vista con el fin de generar la respuesta. Puede
hacer esto al tener el controlador de poner los datos dinmicos (parmetros) que la plantilla de vista en un
objeto ViewBag que se puede acceder a la plantilla de la vista.

Volver al archivo HelloWorldController.cs y cambiar el mtodo de Welcome para agregar un valor


de Message yNumTimes al objeto ViewBag . ViewBag es un objeto dinmico, que significa que usted puede
poner lo que quierasel objeto ViewBag no tiene ninguna propiedad definida hasta que ponga algo en su
interior. El sistema de fijacin de ASP.NET MVC modelo asigna automticamente los parmetros con
nombre (name y numTimes) de la cadena de consulta en la barra de direcciones a parmetros en su
mtodo. El archivo completo de HelloWorldController.cs se ve as:

using System.Web;
using System.Web.Mvc;

namespace MvcMovie.Controllers
{
public class HelloWorldController : Controller
{
public ActionResult Index()
{
return View();
}

public ActionResult Welcome(string name, int numTimes = 1)


{
ViewBag.Message = "Hello " + name;
ViewBag.NumTimes = numTimes;
return View();
}
}
}

Ahora el objeto ViewBag contiene datos que se pasarn automticamente a la vista.

A continuacin, necesita una plantilla de vista Bienvenido! En el men generar , seleccione Crear
MvcMovie para asegurarse de que el proyecto se compila.

Luego haga clic derecho dentro del mtodo Welcome y haga clic en Agregar ver.
Esto es lo que parece el cuadro de dilogo Agregar ver :

Haga clic en Agregary luego agregue el cdigo siguiente debajo del elemento de <h2> en el nuevo
archivoWelcome.cshtml . A crear un bucle que dice "Hola" tantas veces como el usuario dice que debe. A
continuacin se muestra el archivo completo de Welcome.cshtml .

@{
ViewBag.Title = "Welcome";
}

<h2>Welcome</h2>

<ul>
@for (int i=0; i < ViewBag.NumTimes; i++) {
<li>@ViewBag.Message</li>
}
</ul>

Ejecute la aplicacin y vaya a la siguiente URL:

http://localhost:XX/HelloWorld/Welcome?name=Scott&numtimes=4
Ahora datos es tomadas de la URL y pasados al controlador usando la carpeta del modelo. El controlador
paquetes los datos en un objeto ViewBag y pasa ese objeto a la vista. La vista mostrar los datos como
HTML al usuario.

En el ejemplo anterior, utilizamos un objeto ViewBag para pasar los datos del controlador a la vista. Este
ltimo en el tutorial, usaremos un modelo de vista para pasar datos de un controlador a la vista. El
enfoque del modelo de vista pasando datos se prefiere generalmente mucho sobre el enfoque de la bolsa
de vista. Ver la entrada de blogDinmico V fuertemente escribi Views para obtener ms informacin.

Bueno, era una especie de "M" para el modelo, pero no el tipo de base de datos. Vamos a hacer lo que has
aprendido y crear una base de datos de pelculas.

Agregar un modelo
Por Rick Anderson|28 De agosto de 2012

En esta seccin aadiremos algunas clases para gestionar pelculas en una base de datos. Estas clases
ser la parte de "modelo" de la aplicacin ASP.NET MVC.

Usted usar una tecnologa de acceso a datos de .NET Framework conocida como el Entity Framework para
definir y trabajar con estas clases de modelo. Entity Framework (a menudo denominado EF) apoya un
paradigma de desarrollo llamado Primer cdigo. Cdigo primero permite crear objetos del modelo
escribiendo clases simples.(Estos son tambin conocidos como clases POCO, de "objetos CLR de llanura de
edad.") Con ella podrs tener la base de datos creada sobre la marcha de sus clases, que permite un flujo
de trabajo de desarrollo muy limpio y rpido.

Agregar clases de modelo


En el Explorador de soluciones, haga clic derecho en la carpeta de modelos , seleccione Agregary
seleccioneclase.

Introduzca el nombre de la clase "Pelcula".

Agregue las siguientes cinco propiedades a la clase de Movie :

public class Movie


{
public int ID { get; set; }
public string Title { get; set; }
public DateTime ReleaseDate { get; set; }
public string Genre { get; set; }
public decimal Price { get; set; }
}

Vamos a usar la clase de Movie para representar pelculas en una base de datos. Cada instancia de un
objeto deMovie corresponder a una fila de una tabla de base de datos, y cada propiedad de la clase
de Movie se asigne a una columna en la tabla.

En el mismo archivo, agregue la siguiente clase de MovieDBContext :

public class MovieDBContext : DbContext


{
public DbSet<Movie> Movies { get; set; }
}

La clase MovieDBContext representa el contexto de la base de datos de pelcula de Entity Framework, que
se encarga de obtener, almacenar y actualizar instancias de la clase de Movie en una base de
datos. ElMovieDBContext se deriva de la clase base DbContext de Entity Framework.

Con el fin de ser capaces de referencia DbContext y DbSet, debe aadir la siguiente instruccin using al
principio del archivo:

using System.Data.Entity;

A continuacin se muestra el archivo completo de Movie.cs . (Varios usando declaraciones que no sean
necesarios han sido removido.)

using System;
using System.Data.Entity;

namespace MvcMovie.Models
{
public class Movie
{
public int ID { get; set; }
public string Title { get; set; }
public DateTime ReleaseDate { get; set; }
public string Genre { get; set; }
public decimal Price { get; set; }
}

public class MovieDBContext : DbContext


{
public DbSet<Movie> Movies { get; set; }
}
}
Crear una cadena de conexin y trabajando con SQL
Server LocalDB
La clase MovieDBContext que creaste encarga de la tarea de conectar a la base de datos y mapeo de
objetos de la Movie a los registros de la base de datos. Una pregunta, que usted podra preguntarse, sin
embargo, es cmo especificar que se conectar a la base de datos. Hars agregando informacin de
conexin en el archivoWeb.config de la aplicacin.

Abra el archivo Web.config de la aplicacin raz. (No el archivo Web.config en la carpeta Views .) Abra
el archivoWeb.config en rojo.

Aadir la siguiente cadena de conexin para el elemento <connectionStrings> en el


archivo Web.config .

<add name="MovieDBContext"
connectionString="Data Source=(LocalDB)\v11.0;AttachDbFilename=|
DataDirectory|\Movies.mdf;Integrated Security=True"
providerName="System.Data.SqlClient"
/>

En el ejemplo siguiente se muestra una porcin del archivo Web.config con la nueva cadena de conexin
agregada:

<connectionStrings>
<add name="DefaultConnection"
connectionString="Data Source=(LocalDb)\v11.0;Initial Catalog=aspnet-MvcMovie-
2012213181139;Integrated Security=true"
providerName="System.Data.SqlClient"
/>
<add name="MovieDBContext"
connectionString="Data Source=(LocalDB)\v11.0;AttachDbFilename=|
DataDirectory|\Movies.mdf;Integrated Security=True"
providerName="System.Data.SqlClient"
/>
</connectionStrings>

Esta pequea cantidad de cdigo y XML es todo lo que necesita para escribir para representar y almacenar
los datos de la pelcula en una base de datos.

A continuacin, construirs una nueva clase de MoviesController que puede utilizar para mostrar los datos
de la pelcula y permiten a los usuarios crear nueva cartelera.

Acceso a datos de su modelo desde un controlador


Por Rick Anderson|28 De agosto de 2012

En esta seccin, podr crear una nueva clase de MoviesController y escribir cdigo que recupera los datos
de la pelcula y lo muestra en el navegador mediante una plantilla de vista.

Generar la aplicacin antes de pasar al siguiente paso.

Haga clic derecho en la carpeta Controllers y crear un nuevo controlador de MoviesController . Las
siguientes opciones no aparecern hasta que construyes tu aplicacin. Seleccione las siguientes opciones:

Nombre del controlador: MoviesController. (Este es el valor por defecto).


Plantilla: Controlador MVC con acciones de lectura/escritura y vistas, con Entity
Framework.
Modelo de clase: pelcula (MvcMovie.Models).
Clase de contexto de datos: MovieDBContext (MvcMovie.Models).
Vistas: maquinilla de afeitar (CSHTML). (Predeterminado).
Haga clic en Agregar. Visual Studio Express crea los siguientes archivos y carpetas:

MoviesController.cs de un archivo en la carpeta de controladores .


Una carpeta " pelculas " en la carpeta del proyecto Views .
Create.cshtml, Delete.cshtml, Details.cshtml, Edit.cshtmly Index.cshtml en la
carpeta Views\Movies .

ASP.NET MVC 4 crea automticamente el CRUD (crear, leer, actualizar y eliminar) mtodos de accin y
vistas para usted (la creacin automtica de vistas y mtodos de accin CRUD es conocida como
andamio). Ahora tienes una aplicacin web completamente funcional que permite crear, lista, editar y
borrar las entradas de la pelcula.

Ejecute la aplicacin y busque el controlador de Movies aadiendo /Movies a la URL en la barra de


direcciones del navegador. Porque la aplicacin se basa en el valor predeterminado enrutamiento (definida
en el archivoGlobal.asax ), la peticin de navegador http://localhost:xxxxx/Movies se dirige al mtodo de
accin de Indexpredeterminado del controlador de Movies . En otras palabras, la solicitud de
navegadorhttp://localhost:xxxxx/Movies es que efectivamente igual al navegador
solicitar http://localhost:xxxxx/Movies/Index. El resultado es una lista vaca de pelculas, porque an alguno
no ha aadido.
Crear una pelcula
Seleccione el vnculo Crear nuevo . Entrar en algunos detalles acerca de una pelcula y haga clic en el
botn crear .
Haga clic en el botn crear causa la forma ser publicada en el servidor donde se guarda la informacin de
la pelcula en la base de datos. Luego est redirigido a la URL /Movies , donde se puede ver la pelcula
recin creada en el listado.
Crear un par ms entradas de cine. Trate de Editar, los datosy eliminar enlaces, que son todo funcional.

Examinar el cdigo generado


Abra el archivo Controllers\MoviesController.cs y examinar el mtodo de Index generado. A continuacin se
muestra una porcin del controlador de la pelcula con el mtodo de Index .

public class MoviesController : Controller


{
private MovieDBContext db = new MovieDBContext();

//
// GET: /Movies/

public ActionResult Index()


{
return View(db.Movies.ToList());
}

La siguiente lnea de la clase MoviesController crea un contexto de base de datos de la pelcula, como se
ha descrito anteriormente. Puede utilizar el contexto de la base de datos de la pelcula para consultar,
editar y borrar peliculas.

private MovieDBContext db = new MovieDBContext();


Una solicitud al controlador de Movies devuelve todas las entradas en la tabla de Movies de la base de
datos de la pelcula y luego pasa los resultados a la vista de Index .

Modelos inflexible y la palabra clave de @model


Anteriormente en este tutorial, usted vio cmo un controlador puede pasar datos u objetos a una plantilla
de vista mediante el objeto ViewBag . El ViewBag es un objeto dinmico que proporciona una forma
conveniente de enlazados para pasar informacin a la vista.

ASP.NET MVC tambin ofrece la posibilidad de pasar fuertemente escribe datos u objetos a una plantilla de
vista.Esto inflexible de enfoque permite mejor tiempo de compilacin de su cdigo y ms rico IntelliSense
en el editor de Visual Studio. El mecanismo de andamios en Visual Studio utiliza este enfoque con las
plantillasMoviesController de la clase y ver cuando se crean los mtodos y las vistas.

En el archivo Controllers\MoviesController.cs examinar el mtodo de Details generado. A continuacin se


muestra una porcin del controlador de la pelcula con el mtodo de Details .

public ActionResult Details(int id = 0)


{
Movie movie = db.Movies.Find(id);
if (movie == null)
{
return HttpNotFound();
}
return View(movie);
}

Si se encuentra una Movie , se pasa una instancia de la modelo de la Movie a la vista de


detalles. Examinar el contenido del archivo Views\Movies\Details.cshtml .

Mediante la inclusin de una declaracin de @model en la parte superior del archivo de plantilla de vista,
puede especificar el tipo de objeto que espera de la vista. Al crear el controlador de la pelcula, Visual
Studio incluye automticamente la siguiente declaracin de @model en la parte superior del
archivo Details.cshtml :

@model MvcMovie.Models.Movie

Esta directiva de @model le permite acceder a la pelcula que el controlador pasa a la vista mediante
un Model de objeto que es inflexible. Por ejemplo, en la plantilla de Details.cshtml , el cdigo pasa cada
campo de pelcula a losDisplayNameFor y ayudantes de DisplayFor HTML con el objeto
de Model inflexible. Los mtodos de crear y editar y vista plantillas tambin pasan un objeto de modelo de
la pelcula.

Examinar la plantilla de vista de la Index.cshtml y el mtodo de Index en el


archivo MoviesController.cs . Observe cmo el cdigo crea un objeto List cuando llama al mtodo de
ayudante de View en el mtodo de accin delIndex . El cdigo pasa esta lista de Movies del controlador a
la vista:

public ActionResult Index()


{
return View(db.Movies.ToList());
}

Al crear el controlador de la pelcula, Visual Studio Express incluye automticamente la siguiente


declaracin de@model en la parte superior del archivo Index.cshtml :

@model IEnumerable<MvcMovie.Models.Movie>

Esta directiva de @model permite acceder a la lista de pelculas que el controlador pasa a la vista
mediante unModel de objeto que es inflexible. Por ejemplo, en la plantilla de Index.cshtml , el cdigo
recorre las pelculas haciendo una instruccin foreach sobre el objeto Model inflexible:

@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>
}

Porque el objeto del Model es inflexible (como un objeto IEnumerable<Movie> ), cada objeto del item en el
lazo se escribe como Movie. Entre otros beneficios, esto significa que puedes Obtn comprobacin en
tiempo de compilacin del cdigo y soporte de IntelliSense en el editor de cdigo:
Trabajando con SQL Server LocalDB
Cdigo de entidad marco primera detect que la cadena de conexin de base de datos que proporcionaron
seal a una base de datos de Movies que no exista todava, primer cdigo creado automticamente la
base de datos. Se puede comprobar que se ha creado por mirar en la carpeta App_Data . Si no ves el
archivo Movies.mdf , haga clic en el botn Mostrar todos los archivos en la barra de herramientas
del Explorador de soluciones , haga clic en el botn Actualizar y continuacin, expanda la
carpeta App_Data .

Haga doble clic en Movies.mdf para abrir el Explorador de base de datos, a continuacin, expanda la
carpetatablas para ver la tabla de pelculas.
Nota: Si no aparece el explorador de base de datos, en el men Herramientas , seleccioneconectar a la
base de datosy cancelar el cuadro de dilogo Elegir origen de datos . Esto forzar abrir el explorador
de base de datos.

Nota: Si usted est usando VWD o Visual Studio 2010 y sale un error similar a cualquiera de las siguientes
opciones siguientes:

La base de datos ' C:\Webs\MVC4\MVCMOVIE\MVCMOVIE\APP_DATA\MOVIES.MDF' no se puede abrir


porque es versin 706. Este servidor compatible con la versin anterior y 655. No se admite un
camino de descenso de categora.
"Excepcin InvalidOperation fue no controlada por el cdigo de usuario" el SqlConnection
suministrado no especifica un catlogo inicial.

Es necesario instalar las Herramientas de datos de SQL Server y LocalDB. Verificar la cadena de
conexin MovieDBContext especificada en la pgina anterior.

Haga la tabla Movies y seleccione Mostrar datos de la tabla para ver los datos que creaste.

Haga la tabla Movies y seleccione Abrir definicin de tabla para ver la estructura de la tabla que
entidad marco cdigo primer creado para usted.
Observe cmo el esquema de los mapas de la tabla de Movies a la clase de Movie que cre
anteriormente.Cdigo de entidad marco primera crea automticamente este esquema para usted, basado
en la clase de Movie .

Cuando haya terminado, cierre la conexin MovieDBContext de clic derecho y seleccionando Cerrar la
conexin. (Si no cierra la conexin, usted podra obtener un error la prxima vez que ejecute el proyecto).
Ahora tienes la base de datos y una pgina de listado simple para mostrar el contenido de ella. En el
siguiente tutorial, a examinar el resto del cdigo escalonado y aadir un mtodo de SearchIndex y una
vista deSearchIndex que le permite buscar pelculas en esta base de datos.

Examinar los mtodos de editar y editar vista


Examining the Edit Methods and Edit View
Por Rick Anderson|28 De agosto de 2012

En esta seccin, podr examinar los mtodos de accin generados y vistas para el controlador de la
pelcula.Entonces aades una pgina de bsqueda personalizada.
Ejecute la aplicacin y busque el controlador de Movies aadiendo /Movies a la URL en la barra de
direcciones del navegador. Mantenga el puntero del ratn sobre un enlace Editar para ver la direccin URL
que enlaza con.

El enlace Editar fue generado por el mtodo de Html.ActionLink en la vista de Views\Movies\Index.cshtml :

@Html.ActionLink("Edit", "Edit", new { id=item.ID })

El objeto Html es un ayudante que se expone utilizando una propiedad en la clase


baseSystem.Web.Mvc.WebViewPage . El mtodo ActionLink de la ayudante facilita generar dinmicamente
hipervnculos HTML que vinculan a los mtodos de accin en los controladores. El primer argumento al
mtodoActionLink es el enlace de texto para representar (por ejemplo, <a>Edit Me</a>). El segundo
argumento es el nombre de invocar el mtodo de accin. El argumento final es un objeto Annimo que
genera los datos de la ruta (en este caso, el ID de 4).

El vnculo generado que se muestra en la imagen anterior es http://localhost:xxxxx/Movies/Edit/4. La ruta


por defecto (establecida en App_Start\RouteConfig.cs) toma el patrn de URL {controller}/{action}/
{id}. Por lo tanto, ASP.NET se traduce a http://localhost:xxxxx/Movies/Edit/4 en una solicitud para el
mtodo de accin Edit del controlador de Movies con el parmetro ID igual a 4. Examine el cdigo
siguiente en el archivoApp_Start\RouteConfig.cs .

public static void RegisterRoutes(RouteCollection routes)


{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index",
id = UrlParameter.Optional }
);
}

Tambin puede pasar parmetros de mtodo de accin utilizando una cadena de consulta. Por ejemplo, la
URLhttp://localhost:xxxxx/Movies/Edit?ID=4 tambin pasa el parmetro ID de 4 para el mtodo de
accin Edit del controlador de Movies .
Abrir el controlador de Movies . Los dos mtodos de accin Edit se muestran a continuacin.

//
// GET: /Movies/Edit/5

public ActionResult Edit(int id = 0)


{
Movie movie = db.Movies.Find(id);
if (movie == null)
{
return HttpNotFound();
}
return View(movie);
}

//
// POST: /Movies/Edit/5

[HttpPost]
public ActionResult Edit(Movie movie)
{
if (ModelState.IsValid)
{
db.Entry(movie).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
return View(movie);
}

Aviso el segundo mtodo de accin Edit es precedido por el atributo HttpPost . Este atributo especifica que
la sobrecarga del mtodo Edit puede ser invocado slo para solicitudes POST. Se podra aplicar el
atributo HttpGetpara el primer mtodo de edicin, pero que no es necesario porque es el valor por
defecto. (Nos referiremos a los mtodos de accin que implcitamente se asignaron el
atributo HttpGet como HttpGet mtodos).

El mtodo de Edit HttpGet toma el parmetro ID de pelcula, levanta la pelcula usando el mtodo de Entity
Framework Find y devuelve la pelcula seleccionada a la vista de edicin. El parmetro ID especifica
un valor predeterminado de cero si se llama al mtodo Edit sin un parmetro. Si no se encuentra una
pelcula, se devuelveHttpNotFound . Cuando el sistema de andamios crea la vista Edit, examin la clase
de Movie y crea cdigo para representar elementos <label> y <input> para cada propiedad de la
clase. En el ejemplo siguiente se muestra la vista Edit generado:

@model MvcMovie.Models.Movie

@{
ViewBag.Title = "Edit";
}

<h2>Edit</h2>

@using (Html.BeginForm()) {
@Html.ValidationSummary(true)

<fieldset>
<legend>Movie</legend>

@Html.HiddenFor(model => model.ID)

<div class="editor-label">
@Html.LabelFor(model => model.Title)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Title)
@Html.ValidationMessageFor(model => model.Title)
</div>

<div class="editor-label">
@Html.LabelFor(model => model.ReleaseDate)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.ReleaseDate)
@Html.ValidationMessageFor(model => model.ReleaseDate)
</div>

<div class="editor-label">
@Html.LabelFor(model => model.Genre)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Genre)
@Html.ValidationMessageFor(model => model.Genre)
</div>

<div class="editor-label">
@Html.LabelFor(model => model.Price)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Price)
@Html.ValidationMessageFor(model => model.Price)
</div>

<p>
<input type="submit" value="Save" />
</p>
</fieldset>
}

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

@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
}

Observe cmo la plantilla de vista tiene una declaracin de @model MvcMovie.Models.Movie en la parte
superior del archivo, especifica que la vista espera que el modelo de la plantilla de vista de tipo Movie.

El cdigo escalonado utiliza varios mtodos auxiliares para optimizar el cdigo HTML. El ayudante
deHtml.LabelFor muestra el nombre del campo ("Title", "ReleaseDate", "Gnero" o "Precio"). El ayudante
deHtml.EditorFor representa un elemento HTML <input> . El ayudante
de Html.ValidationMessageFor muestra los mensajes de validacin asociados con esa propiedad.

Ejecute la aplicacin y vaya a la URL /Movies . Haga clic en un enlace de Editar . En el navegador, ver el
origen de la pgina. A continuacin se muestra el cdigo HTML del elemento de formulario.

<form action="/Movies/Edit/4" method="post"> <fieldset>


<legend>Movie</legend>

<input data-val="true" data-val-number="The field ID must be a number." data-val-required="The ID


field is required." id="ID" name="ID" type="hidden" value="4" />
<div class="editor-label">
<label for="Title">Title</label>
</div>
<div class="editor-field">
<input class="text-box single-line" id="Title" name="Title" type="text" value="Rio Bravo" />
<span class="field-validation-valid" data-valmsg-for="Title" data-valmsg-replace="true"></span>
</div>

<div class="editor-label">
<label for="ReleaseDate">ReleaseDate</label>
</div>
<div class="editor-field">
<input class="text-box single-line" data-val="true" data-val-date="The field ReleaseDate must be
a date." data-val-required="The ReleaseDate field is required." id="ReleaseDate" name="ReleaseDate"
type="text" value="4/15/1959 12:00:00 AM" />
<span class="field-validation-valid" data-valmsg-for="ReleaseDate" data-valmsg-
replace="true"></span>
</div>

<div class="editor-label">
<label for="Genre">Genre</label>
</div>
<div class="editor-field">
<input class="text-box single-line" id="Genre" name="Genre" type="text" value="Western" />
<span class="field-validation-valid" data-valmsg-for="Genre" data-valmsg-
replace="true"></span>
</div>

<div class="editor-label">
<label for="Price">Price</label>
</div>
<div class="editor-field">
<input class="text-box single-line" data-val="true" data-val-number="The field Price must be a
number." data-val-required="The Price field is required." id="Price" name="Price" type="text"
value="2.99" />
<span class="field-validation-valid" data-valmsg-for="Price" data-valmsg-replace="true"></span>
</div>

<p>
<input type="submit" value="Save" />
</p>
</fieldset>
</form>

Los elementos <input> se encuentran en un elemento HTML de <form> cuyo atributo de action se
establece a la URL /Movies/Edit . Los datos del formulario se registrar en el servidor cuando se hace clic
en el botn Editar .

Procesar la peticin POST


El listado siguiente muestran la versin HttpPost del mtodo de accin Edit .

[HttpPost]
public ActionResult Edit(Movie movie)
{
if (ModelState.IsValid)
{
db.Entry(movie).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
return View(movie);
}

La carpeta del modelo ASP.NET MVC toma los valores de forma publicada y crea un objeto de Movie que se
pasa como parmetro del movie . El mtodo ModelState.IsValid verifica que los datos presentados en
forma pueden usarse para modificar (edicin o actualizacin) un objeto de Movie . Si los datos son vlidos,
los datos de la pelcula se guardarn en la coleccin de Movies de la db(MovieDBContext instance). Los
nuevos datos de la pelcula se guardan en la base de datos llamando al
mtodo SaveChanges de MovieDBContext. Despus de guardar los datos, el cdigo redirige al usuario al
mtodo de accin del Index de la clase MoviesController , que muestra la de coleccin de pelculas,
incluyendo los cambios que acaba de hacer.

Si los valores publicados no vlidos, ellos se volvern a Mostrar en el formulario. Los ayudantes
deHtml.ValidationMessageFor en la plantilla de vista de Edit.cshtml cuidar de Mostrar mensajes de error
apropiado.
Nota para apoyar la validacin de jQuery para no-Ingls locales que usan una coma (",") para un punto
decimal, debe incluir la globalize.js y su archivo
especfico cultures/globalize.cultures.js(de https://github.com/jquery/globalize ) y JavaScript para
utilizar Globalize.parseFloat. El cdigo siguiente muestra las modificaciones en el archivo
Views\Movies\Edit.cshtml para trabajar con la cultura "fr-FR":

@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
<script src="~/Scripts/globalize.js"></script>
<script src="~/Scripts/globalize.culture.fr-FR.js"></script>
<script>
$.validator.methods.number = function (value, element) {
return this.optional(element) ||
!isNaN(Globalize.parseFloat(value));
}
$(document).ready(function () {
Globalize.culture('fr-FR');
});
</script>
<script>
jQuery.extend(jQuery.validator.methods, {
range: function (value, element, param) {
//Use the Globalization plugin to parse the value
var val = $.global.parseFloat(value);
return this.optional(element) || (
val >= param[0] && val <= param[1]);
}
});

</script>
}

El campo decimal puede requerir un campo comn, no un punto decimal. Como una solucin temporal,
puede agregar el elemento de la globalizacin para el archivo raz web.config de proyectos. El cdigo
siguiente muestra el elemento de la globalizacin con la cultura en Espaol de Estados Unidos.

<system.web>
<globalization culture ="en-US" />
<!--elements removed for clarity-->
</system.web>

Todos los mtodos de HttpGet siguen un patrn similar. Obtener un objeto de pelcula (o lista de objetos,
en el caso de Index) y pasar el modelo a la vista. El mtodo Create pasa un objeto de pelcula vaco a la
vista de la creacin. Todos los mtodos que crean, edicin, borrar o modifican datos de hacen en la
sobrecarga HttpPostdel mtodo. Modificar datos en un mtodo HTTP GET es un riesgo de seguridad, como
se describe en la entrada de blog post ASP.NET MVC Tip #46 no utiliza enlaces de eliminar porque crear
agujeros de seguridad.Modificacin de datos en un mtodo GET tambin viola las mejores prcticas HTTP y
el patrn arquitectnico delresto , que especifica que las solicitudes GET no deben cambiar el estado de su
aplicacin. En otras palabras, realizar una operacin de obtencin debe ser una operacin segura que no
tiene efectos secundarios y no modifica sus datos persistentes.

Agregar un mtodo de bsqueda y vista de bsqueda


En esta seccin a aadir un mtodo de accin de SearchIndex que le permite buscar pelculas por gnero o
nombre. Esto estar disponible usando la URL /Movies/SearchIndex . La solicitud mostrar un formulario
HTML que contiene elementos de entrada que un usuario puede escribir con el fin de buscar una
pelcula. Cuando un usuario enva el formulario, el mtodo de accin obtener los valores de bsqueda
escritos por el usuario y utilizar los valores para buscar la base de datos.

Mostrando la forma de SearchIndex


Comience agregando un mtodo de accin SearchIndex a la clase de MoviesController existente. El
mtodo devuelve una vista que contiene un formulario HTML. Aqu est el cdigo:

public ActionResult SearchIndex(string searchString)


{
var movies = from m in db.Movies
select m;

if (!String.IsNullOrEmpty(searchString))
{
movies = movies.Where(s => s.Title.Contains(searchString));
}

return View(movies);
}

La primera lnea del mtodo SearchIndex crea la siguiente consulta LINQ para seleccionar las pelculas:

var movies = from m in db.Movies


select m;

La consulta se define en este momento, pero an no ha sido dirigida contra el almacn de datos.

Si el parmetro searchString contiene una cadena, la consulta de pelculas se modifica para filtrar en el
valor de la cadena de bsqueda, utilice el siguiente cdigo:

if (!String.IsNullOrEmpty(searchString))
{
movies = movies.Where(s => s.Title.Contains(searchString));
}

El s => s.Title cdigo anterior es una Expresin Lambda. Lambdas se utilizan en las consultas LINQ basada
en mtodos como argumentos a los mtodos de operador de consulta estndar como donde el mtodo
utilizado en el cdigo anterior. Las consultas LINQ no se ejecutan cuando se definen o cuando son
modificados por llamar a un mtodo como Where o OrderBy. En cambio, ejecucin de la consulta es
diferida, lo que significa que la evaluacin de una expresin se retrasa hasta que su valor realmente se
itera sobre o se llama al mtodo ToList . En la muestra de SearchIndex , se ejecuta la consulta en la vista
SearchIndex. Para obtener ms informacin sobre la ejecucin de la consulta diferidos, ver la Ejecucin de
la consulta.

Ahora puede implementar la visin SearchIndex que mostrar el formulario para el usuario. Haga clic
derecho dentro del mtodo SearchIndex y haga clic en Agregar ver. En el cuadro de dilogo Agregar
ver especificar que vas a pasar un objeto de Movie a la plantilla de ver como su clase modelo. En la lista
de plantillas de andamio , elija de la listay, a continuacin, haga clic en Agregar.
Al hacer clic en el botn Agregar , se crea la plantilla de vista Views\Movies\SearchIndex.cshtml . Porque
elegiste lalista en la lista de plantilla del andamio , Visual Studio genera automticamente (escalonada)
algunos marcado por defecto en la vista. El andamiaje haba creado un formulario HTML. Examin la clase
de Movie y crea cdigo para representar elementos de <label> para cada propiedad de la clase. El listado
a continuacin muestra la visin de crear que se gener:

@model IEnumerable<MvcMovie.Models.Movie>

@{
ViewBag.Title = "SearchIndex";
}

<h2>SearchIndex</h2>

<p>
@Html.ActionLink("Create New", "Create")
</p>
<table>
<tr>
<th>
Title
</th>
<th>
ReleaseDate
</th>
<th>
Genre
</th>
<th>
Price
</th>
<th></th>
</tr>

@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>
<td>
@Html.ActionLink("Edit", "Edit", new { id=item.ID }) |
@Html.ActionLink("Details", "Details", new { id=item.ID }) |
@Html.ActionLink("Delete", "Delete", new { id=item.ID })
</td>
</tr>
}

</table>

Ejecute la aplicacin y vaya a /Movies/SearchIndex. Aadir una cadena de consulta como ?


searchString=ghost a la URL. Se muestran las pelculas filtradas.
Si cambia la firma del mtodo SearchIndex para tener un parmetro denominado id, el
parmetro id coincidir con el marcador de posicin de {id} para las rutas por defecto en el
archivo Global.asax .

{controller}/{action}/{id}

El mtodo de SearchIndex original se ve as::

public ActionResult SearchIndex(string searchString)


{
var movies = from m in db.Movies
select m;

if (!String.IsNullOrEmpty(searchString))
{
movies = movies.Where(s => s.Title.Contains(searchString));
}

return View(movies);
}

El mtodo modificado de SearchIndex sera como sigue:


public ActionResult SearchIndex(string id)
{
string searchString = id;
var movies = from m in db.Movies
select m;

if (!String.IsNullOrEmpty(searchString))
{
movies = movies.Where(s => s.Title.Contains(searchString));
}

return View(movies);
}

Ahora puede pasar el ttulo de bsqueda como datos de la ruta (un segmento de la URL) en vez de como
un valor de cadena de consulta.

Sin embargo, no pueden esperar los usuarios modificar la URL cada vez desean buscar una pelcula. Ahora
usted aadiremos UI para ayudar a filtran pelculas. Si cambiaste la firma del mtodo SearchIndex para
probar cmo pasar el parmetro ID de ruta-limite, cambiarlo para que el mtodo SearchIndex toma un
parmetro de cadena denominado searchString:
public ActionResult SearchIndex(string searchString)
{
var movies = from m in db.Movies
select m;

if (!String.IsNullOrEmpty(searchString))
{
movies = movies.Where(s => s.Title.Contains(searchString));
}

return View(movies);
}

Abra el archivo Views\Movies\SearchIndex.cshtml y justo despus de @Html.ActionLink("Create New",


"Create"), agregar lo siguiente:

@using (Html.BeginForm()){
<p> Title: @Html.TextBox("SearchString")<br />
<input type="submit" value="Filter" /></p>
}

En el ejemplo siguiente se muestra una porcin del archivo Views\Movies\SearchIndex.cshtml con el


marcado de filtrado adicional.

@model IEnumerable<MvcMovie.Models.Movie>

@{
ViewBag.Title = "SearchIndex";
}

<h2>SearchIndex</h2>

<p>
@Html.ActionLink("Create New", "Create")

@using (Html.BeginForm()){
<p> Title: @Html.TextBox("SearchString") <br />
<input type="submit" value="Filter" /></p>
}
</p>

El ayudante de Html.BeginForm crea una abertura <form> etiqueta. El ayudante de Html.BeginForm causa
la forma a s mismo cuando el usuario enva el formulario haciendo clic en el botn de filtro .

Ejecute la aplicacin y trate de buscar una pelcula.


No hay ninguna sobrecarga HttpPost del mtodo SearchIndex . No es necesario, porque el mtodo no es
cambiar el estado de la aplicacin, slo filtrado de datos.

Se podra agregar el siguiente mtodo HttpPost SearchIndex . En ese caso, el invocador de accin
coincidira con el mtodo HttpPost SearchIndex , y el mtodo HttpPost SearchIndex funcionara como se
muestra en la imagen de abajo.

[HttpPost]
public string SearchIndex(FormCollection fc, string searchString)
{
return "<h3> From [HttpPost]SearchIndex: " + searchString + "</h3>";
}
Sin embargo, incluso si agrega esta versin HttpPost del mtodo SearchIndex , existe una limitacin en
cmo esto todos se implement. Imagnese que usted quiere marcar una bsqueda particular o desea
enviar un enlace a amigos que puede hacer clic para ver la misma lista filtrada de pelculas. Tenga en
cuenta que la direccin URL de la solicitud HTTP POST es la misma que la URL de la solicitud GET
(localhost:xxxxx/Peliculas/SearchIndex)--no hay ninguna informacin de bsqueda en la URL de s
mismo. Derecho ahora, la informacin de la cadena de bsqueda se enva al servidor como el valor de un
campo de formulario. Esto significa que usted no puede capturar esa informacin de bsqueda para
marcar o enviar a amigos en una direccin URL.

La solucin es utilizar una sobrecarga de BeginForm que especifica que la solicitud POST debe aadir la
informacin de bsqueda en la URL y se lo enva a la versin HttpGet del mtodo SearchIndex . Reemplace
el mtodo sin parmetros existente de la BeginForm con lo siguiente:

@using (Html.BeginForm("SearchIndex","Movies",FormMethod.Get))

Ahora cuando usted enva una bsqueda, la URL contiene una cadena de consulta de bsqueda. Busca
tambin ir al mtodo de accin HttpGet SearchIndex , incluso si tienes un mtodo HttpPost SearchIndex .
Aadir bsqueda por gnero
Si ha agregado la versin HttpPost del mtodo SearchIndex , borrar ahora.

A continuacin, aades una caracterstica para permitir a los usuarios buscar pelculas por
gnero. Reemplace el mtodo de SearchIndex con el siguiente cdigo:

public ActionResult SearchIndex(string movieGenre, string searchString)


{
var GenreLst = new List<string>();

var GenreQry = from d in db.Movies


orderby d.Genre
select d.Genre;
GenreLst.AddRange(GenreQry.Distinct());
ViewBag.movieGenre = new SelectList(GenreLst);

var movies = from m in db.Movies


select m;
if (!String.IsNullOrEmpty(searchString))
{
movies = movies.Where(s => s.Title.Contains(searchString));
}

if (string.IsNullOrEmpty(movieGenre))
return View(movies);
else
{
return View(movies.Where(x => x.Genre == movieGenre));
}

Esta versin del mtodo SearchIndex toma un parmetro adicional, es decir, movieGenre. Las primeras
lneas de cdigo crean un objeto de la List que contenga los gneros del cine de la base de datos.

El cdigo siguiente es una consulta LINQ que recupera todos los gneros de la base de datos.

var GenreQry = from d in db.Movies


orderby d.Genre
select d.Genre;

El cdigo utiliza el mtodo AddRange de la coleccin genrica de la List para agregar todos los gneros
distintos a la lista. (Sin el modificador Distinct , se agregaran duplicados gneros por ejemplo, la
comedia se agregarn dos veces en nuestra muestra). El cdigo entonces almacena la lista de gneros en
el objeto ViewBag .

El cdigo siguiente muestra cmo comprobar el parmetro movieGenre . Si no est vaco, el cdigo ms
limita la consulta de pelculas para limitar las pelculas seleccionadas para el gnero especificado.

if (string.IsNullOrEmpty(movieGenre))
return View(movies);
else
{
return View(movies.Where(x => x.Genre == movieGenre));
}

Agregar marcado a la vista de SearchIndex para apoyar


la bsqueda por gnero
Aadir un ayudante de Html.DropDownList en el archivo Views\Movies\SearchIndex.cshtml , justo antes de
la ayudante de TextBox . A continuacin se muestra el marcado terminado:

<p>
@Html.ActionLink("Create New", "Create")
@using (Html.BeginForm("SearchIndex","Movies",FormMethod.Get)){
<p>Genre: @Html.DropDownList("movieGenre", "All")
Title: @Html.TextBox("SearchString")
<input type="submit" value="Filter" /></p>
}
</p>

Ejecute la aplicacin y vaya a /Movies/SearchIndex. Intente una bsqueda por gnero, por el nombre de la
pelcula y por ambos criterios.

En esta seccin se examinan los mtodos de accin CRUD y vistas generadas por el marco. Cre un
mtodo de accin de bsqueda y vista que permiten a los usuarios buscar por ttulo de la pelcula y
gnero. En la siguiente seccin, veremos cmo agregar una propiedad al modelo de la Movie y cmo
agregar a un inicializador que crear automticamente una base de datos de prueba.

Agregar un nuevo campo a la modelo pelcula y la


Tabla
Adding a New Field to the Movie Model and Table
Por Rick Anderson|28 De agosto de 2012

En esta seccin deber usar entidad marco cdigo primera migraciones migrar algunos cambios a las
clases de modelo para que el cambio se aplica a la base de datos.
De forma predeterminada, cuando se utiliza cdigo de entidad marco primera para crear automticamente
una base de datos, como lo hizo anteriormente en este tutorial, primer cdigo agrega una tabla a la base
de datos para ayudar a seguir el esquema de la base de datos sea en sincrona con las clases de modelo
se gener desde.Si no estn sincronizados, Entity Framework produce un error. Esto facilita localizar temas
en tiempo de desarrollo que podran de lo contrario slo encuentras (por errores oscuros) en tiempo de
ejecucin.
Configuracin de migraciones primer cdigo para
modelar los cambios
Si est utilizando Visual Studio 2012, haga doble clic en el archivo Movies.mdf desde el explorador de
soluciones para abrir la herramienta de base de datos. Visual Studio Express para Web mostrar el
explorador de base de datos, que Visual Studio 2012 mostrar el explorador de servidores. Si est
utilizando Visual Studio 2010, utilice el explorador de objeto de servidor SQL.
La herramienta de base de datos (Database Explorer, explorador de servidores o explorador del objeto de
servidor SQL), haga clic en MovieDBContext y seleccione borrar a la base de datos de pelculas.

Navegar hacia el explorador de soluciones. Haga clic derecho sobre el archivo Movies.mdf y
seleccione borrar para eliminar la base de datos de pelculas.
Generar la aplicacin para asegurarse de que no hay ningn error.

Desde el men Herramientas , haga clic en Gestor de paquetes de biblioteca y luego la Consola del
administrador de paquetes.

En la ventana de la Consola de administrador de paquetes en el PM> el smbolo del sistema escriba


"Enable-migraciones - ContextTypeName MvcMovie.Models.MovieDBContext".
El comando Enable-migraciones (mostrado arriba) crea un archivo Configuration.cs en una nueva
carpeta demigraciones .

Visual Studio abre el archivo Configuration.cs . Reemplace el mtodo de la Seed en el


archivo Configuration.cs con el siguiente cdigo:
protected override void Seed(MvcMovie.Models.MovieDBContext context)
{
context.Movies.AddOrUpdate( i => i.Title,
new Movie
{
Title = "When Harry Met Sally",
ReleaseDate = DateTime.Parse("1989-1-11"),
Genre = "Romantic Comedy",
Price = 7.99M
},

new Movie
{
Title = "Ghostbusters ",
ReleaseDate = DateTime.Parse("1984-3-13"),
Genre = "Comedy",
Price = 8.99M
},

new Movie
{
Title = "Ghostbusters 2",
ReleaseDate = DateTime.Parse("1986-2-23"),
Genre = "Comedy",
Price = 9.99M
},

new Movie
{
Title = "Rio Bravo",
ReleaseDate = DateTime.Parse("1959-4-15"),
Genre = "Western",
Price = 3.99M
}
);

}
Haga clic derecho sobre la lnea serpenteante roja bajo la Movie y
seleccionar resolver luego, usandoMvcMovie.Models;
Hacerlo aade la siguiente instruccin using:

using MvcMovie.Models;
Migraciones primer cdigo llama al mtodo de Seed despus de cada migracin (es decir,
llamada actualizacin base de datos en la consola del administrador de paquetes) y este mtodo filas
de actualizaciones que ya se han insertado o inserta si an no existe.

Presione CTRL-SHIFT-B para construir el proyecto.(Los siguientes pasos se producir un error si tu no


construir en este momento.)
El siguiente paso es crear una clase de DbMigration para la migracin inicial. Esta migracin a crea una
nueva base de datos, por eso borr el archivo movie.mdf en un paso anterior.
En la ventana de la Consola de administrador de paquetes , escriba el comando "add-migracin
inicial" para crear la migracin inicial. El nombre "Inicial" es arbitrario y se utiliza para nombrar el archivo
de migracin creado.

Migraciones primer cdigo crea otro archivo de clase en la carpeta de migraciones (con el
nombre{DateStamp}_Initial.cs ), y esta clase contiene cdigo que crea el esquema de base de datos. El
nombre de archivo de migracin es preventa con una marca de tiempo para ayudar con el
pedido. Examinar la {DateStamp}_Initial.csarchivo, contiene las instrucciones para crear la tabla de
pelculas para la DB de la pelcula. Cuando se actualiza la base de datos en las instrucciones a
continuacin, esto {DateStamp}_Initial.cs archivo funcionar y crear el el esquema de BD. Luego se
ejecutar el mtodo de la semilla para rellenar la DB con datos de prueba.
En la Consola del administrador de paquetes, introduce el comando "actualizacin-base de datos"
para crear la base de datos y ejecutar el mtodo de la semilla .
Si sale un error que indica una tabla ya existe y no puede ser creada, es probablemente porque funcion la
aplicacin despus de que ha eliminado la base de datos y antes de que ejecute la update-database. En
ese caso, elimine el archivo de Movies.mdf otra vez y vuelva a intentar el comando de update-
database . Si sigue obteniendo un error, elimine la carpeta de las migraciones y contenido luego empezar
con las instrucciones en la parte superior de esta pgina (que es borrar el archivo Movies.mdf entonces
procede a habilitar migraciones).
Ejecute la aplicacin y vaya a la URL /Movies . Visualizacin de los datos de la semilla.
Agregar una propiedad de calificacin para el modelo de
la pelcula
Empezar por aadir una nueva propiedad de Rating a la clase de Movie existente. Abra el
archivo Models\Movie.csy agregue la propiedad Rating como ste:
public string Rating { get; set; }
La clase de Movie completa parece ahora el siguiente cdigo:
public class Movie
{
public int ID { get; set; }
public string Title { get; set; }
public DateTime ReleaseDate { get; set; }
public string Genre { get; set; }
public decimal Price { get; set; }
public string Rating { get; set; }
}
Generar la aplicacin usando el construir > Construir pelculas men comando o pulsando CTRL-SHIFT-
B.
Ahora que has actualizado la clase Model , tambin necesitamos actualizar las plantillas de
vista\Views\Movies\Index.cshtml y \Views\Movies\Create.cshtml con el fin de Mostrar la nueva propiedad
de Rating en la vista de navegador.
Abra el archivo \Views\Movies\Index.cshtml y agrega un encabezado de columna <th>Rating</th> justo
despus de la columna de precio . Luego agregar una columna de <td> cerca del final de la plantilla para
hacer el@item.Rating valor. A continuacin es lo que parece la plantilla de vista actualizada
de Index.cshtml :
@model IEnumerable<MvcMovie.Models.Movie>

@{
ViewBag.Title = "Index";
}

<h2>Index</h2>

<p>
@Html.ActionLink("Create New", "Create")
</p>
<table>
<tr>
<th>
@Html.DisplayNameFor(model => model.Title)
</th>
<th>
@Html.DisplayNameFor(model => model.ReleaseDate)
</th>
<th>
@Html.DisplayNameFor(model => model.Genre)
</th>
<th>
@Html.DisplayNameFor(model => model.Price)
</th>
<th>
@Html.DisplayNameFor(model => model.Rating)
</th>
<th></th>
</tr>

@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>
<td>
@Html.DisplayFor(modelItem => item.Rating)
</td>
<td>
@Html.ActionLink("Edit", "Edit", new { id=item.ID }) |
@Html.ActionLink("Details", "Details", new { id=item.ID }) |
@Html.ActionLink("Delete", "Delete", new { id=item.ID })
</td>
</tr>
}

</table>
A continuacin, abra el archivo \Views\Movies\Create.cshtml y agregue el siguiente marcado casi al final
del formulario. Esto representa un cuadro de texto para que se puede especificar una calificacin cuando
se crea una nueva pelcula.
<div class="editor-label">
@Html.LabelFor(model => model.Rating)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Rating)
@Html.ValidationMessageFor(model => model.Rating)
</div>
Ahora ha actualizado el cdigo de la aplicacin para apoyar la nueva propiedad de Rating .
Ahora ejecutar la aplicacin y vaya a la URL /Movies . Al hacer esto, sin embargo, ver uno de los
siguientes errores:
Ests viendo este error porque la clase de modelo de Movie actualizada en la aplicacin ahora es diferente
que el esquema de la tabla de la Movie de la base de datos existente. (No hay ninguna Rating de columna
en la tabla de base de datos).
Existen algunos enfoques para resolver el error:

1. Tienen Entity Framework automticamente soltar y volver a crear la base de datos basada en el
nuevo esquema de clase de modelo. Este enfoque es muy conveniente al hacer desarrollo activo en
una base de datos de prueba; permite evolucionar rpidamente el esquema de base de datos y
modelo juntos. El lado negativo, sin embargo, es que pierdes los datos existentes en la base de datos,
por lo que no quiere utilizar este enfoque en una base de datos de produccin! Utilizar a un
inicializador para automticamente una base de datos con datos de prueba de la semilla es a menudo
una forma productiva para el desarrollo de una aplicacin. Para obtener ms informacin sobre los
inicializadores de la base de datos de Entity Framework, vea de Tom Dykstra tutorial de ASP.NET
MVC/Entity Framework.
2. Explcitamente modifica el esquema de la base de datos existente para que coincida con las clases
del modelo. La ventaja de este enfoque es que usted mantenga sus datos. Puede hacer este cambio
ya sea manualmente o mediante la creacin de una base de datos cambiar el guin.
3. Utilice migraciones primer cdigo para actualizar el esquema de base de datos.
Para este tutorial, usaremos las migraciones primer cdigo.
Actualizar el mtodo de la semilla para que proporciona un valor para la nueva columna. Abra el archivo
Migrations\Configuration.cs y agregar un campo de calificacin a cada objeto de la pelcula.
new Movie
{
Title = "When Harry Met Sally",
ReleaseDate = DateTime.Parse("1989-1-11"),
Genre = "Romantic Comedy",
Rating = "G",
Price = 7.99M
},
Construir la solucin y luego abrir la ventana de la Consola de administrador de paquetes y escriba el
siguiente comando:
add-migration AddRatingMig
El comando de add-migration indica el marco de la migracin para examinar el modelo actual de la
pelcula con el actual esquema de BD de pelcula y crear el cdigo necesario para migrar la DB al nuevo
modelo. El AddRatingMig es arbitraria y se utiliza para nombrar el archivo de migracin. Es til usar un
nombre significativo para el paso de la migracin.
Cuando termina de este comando, Visual Studio abre el archivo de clase que define la nueva clase
derivada deDbMIgration , y en el mtodo de Up se puede ver el cdigo crea la nueva columna.
public partial class AddRatingMig : DbMigration
{
public override void Up()
{
AddColumn("dbo.Movies", "Rating", c => c.String());
}

public override void Down()


{
DropColumn("dbo.Movies", "Rating");
}
}
Construir la solucin e introduzca el comando "actualizacin de base de datos" en la ventana de
la Consola de administrador de paquetes .
La siguiente imagen muestra el resultado en la ventana de la Consola de administrador de
paquetes (la fecha anteponiendo AddRatingMig ser diferente).

Vuelva a ejecutar la aplicacin y vaya a la URL /Movies. Puedes ver el nuevo campo de calificacin.
Haga clic en el enlace Crear nuevo para agregar una nueva pelcula. Tenga en cuenta que puede agregar
una calificacin.
Haga clic en crear. La nueva pelcula, incluida la clasificacin, ahora aparece en las listado de pelculas:
Tambin debe agregar el campo de Rating a las plantillas de vista edicin, detalles y SearchIndex.
Puede escribir el comando "actualizacin de base de datos" en la ventana de la Consola de
administrador de paquetes otra vez y no se hara ningn cambio, porque el esquema coincide con el
modelo.
En esta seccin usted vio cmo puede modificar el modelo de objetos y mantener la base de datos
sincronizados con los cambios. Tambin vimos una forma para llenar una base de datos recin creada con
datos de la muestra para que usted puede probar escenarios. A continuacin, veamos cmo puede
agregar lgica de validacin ms rico a las clases de modelo y habilitar algunas reglas de negocios que se
aplique.

Agregar validacin del modelo


Adding Validation to the Model
Por Rick Anderson|28 De agosto de 2012
En esto esta seccin a aadir lgica de validacin para el modelo de la Movie y usted garantizar que las
reglas de validacin se aplican a cualquier momento que un usuario intenta crear o editar una pelcula con
la aplicacin.
Mantener las cosas secas
Uno de los principios de diseo de base de ASP.NET MVC es seco ("Don't Repeat Yourself"). ASP.NET MVC
anima a especificar la funcionalidad o comportamiento slo una vez, y luego que se refleja en todas partes
en una aplicacin. Esto reduce la cantidad de cdigo que necesita para escribir y hace el cdigo que
escriba menos error propenso y fcil de mantener.
El apoyo de validacin que ASP.NET MVC y entidad marco cdigo primero es un gran ejemplo del principio
seco en accin. Mediante declaracin puede especificar reglas de validacin en un solo lugar (en la clase
de modelo) y las reglas se aplican en todas partes en la aplicacin.
Echemos un vistazo a cmo puede tomar ventaja de este apoyo de validacin en la aplicacin de la
pelcula.

Agregar reglas de validacin para el modelo de la pelcula


Empezars aadiendo algunos lgica de validacin para la clase de Movie .
Abra el archivo Movie.cs . Agregue una instruccin using en la parte superior del archivo que hace
referencia el espacio de nombres System.ComponentModel.DataAnnotations :
using System.ComponentModel.DataAnnotations;
Tenga en cuenta que el espacio de nombres no contiene System.Web. DataAnnotations proporciona un
conjunto integrado de atributos de validacin que se pueden aplicar de forma declarativa a cualquier clase
o propiedad.
Ahora actualizar la clase de Movie para aprovechar las ventajas del
incorporado Required, StringLengthy Rangeatributos de validacin. Utilice el cdigo siguiente como un
ejemplo de cmo aplicar los atributos.
public class Movie {
public int ID { get; set; }

[Required]
public string Title { get; set; }

[DataType(DataType.Date)]
public DateTime ReleaseDate { get; set; }

[Required]
public string Genre { get; set; }

[Range(1, 100)]
[DataType(DataType.Currency)]
public decimal Price { get; set; }

[StringLength(5)]
public string Rating { get; set; }
}
Ejecute la aplicacin y otra vez obtendr el siguiente error en tiempo de ejecucin:
El modelo de apoyo en el contexto de la 'MovieDBContext' ha cambiado desde la creacin de
la base de datos. Considere el uso de migraciones primer cdigo para actualizar la base de
datos (http://go.microsoft.com/fwlink/?LinkId=238269).
Nos vamos a migraciones para actualizar el scheam. Construir la solucin y luego abrir la ventana de
la Consola de administrador de paquetes y escriba los siguientes comandos:
add-migration AddDataAnnotationsMig
update-database
Cuando termina de este comando, Visual Studio abre el archivo de clase que define la nueva clase
derivada deDbMIgration con el nombre especificado (AddDataAnnotationsMig), y en el mtodo de Up se
puede ver el cdigo actualiza las restricciones de horario. Los campos Title y Genre son ya no acepta
valores NULL (es decir, debe introducir un valor) y el campo de Rating tiene una longitud mxima de 5.
Los atributos de validacin especifican el comportamiento que desea aplicar en las propiedades del
modelo que se aplican. El atributo Required indica que una propiedad debe tener un valor; en este
ejemplo, una pelcula debe tener valores para el Title, ReleaseDate, Genrey propiedades de Price para ser
vlidas. El atributo de la Rangerestringe un valor dentro de un intervalo especificado. El atributo
de StringLength le permite definir la longitud mxima de una propiedad de cadena y, opcionalmente, su
longitud mnima. Tipos intrnsecos (como decimal, int, float, DateTime) estn obligados por defecto y no
necesita la Required atributo.
Cdigo primero asegura que las reglas de validacin que se especifica en una clase de modelo se aplican
antes de la aplicacin guarda los cambios realizados en la base de datos. Por ejemplo, el cdigo siguiente
generar una excepcin cuando se llama al mtodo SaveChanges , porque varios requiere propiedad
de Movie son valores que faltan y el precio es cero (que est fuera del rango vlido).
MovieDBContext db = new MovieDBContext();

Movie movie = new Movie();


movie.Title = "Gone with the Wind";
movie.Price = 0.0M;

db.Movies.Add(movie);
db.SaveChanges(); // <= Will throw server side validation exception
Tener reglas de validacin aplicadas automticamente por .NET Framework ayuda a que su aplicacin ms
robusta. Tambin asegura que no se olvide validar algo y sin darse cuenta dej malos datos en la base de
datos.
Aqu es un cdigo completo listado para el archivo actualizado de Movie.cs :
using System;
using System.Data.Entity;
using System.ComponentModel.DataAnnotations;

namespace MvcMovie.Models {
public class Movie {
public int ID { get; set; }

[Required]
public string Title { get; set; }

[DataType(DataType.Date)]
public DateTime ReleaseDate { get; set; }

[Required]
public string Genre { get; set; }
[Range(1, 100)]
[DataType(DataType.Currency)]
public decimal Price { get; set; }

[StringLength(5)]
public string Rating { get; set; }
}

public class MovieDBContext : DbContext {


public DbSet<Movie> Movies { get; set; }
}
}

Error de validacin UI en ASP.NET MVC


Vuelva a ejecutar la aplicacin y vaya a la URL /Movies .
Haga clic en el enlace Crear nuevo para agregar una nueva pelcula. Rellene el formulario con algunos
valores no vlidos y haga clic en el botn crear .
Nota para apoyar la validacin de jQuery para no-Ingls locales que usan una coma (",") para un punto
decimal, debe incluir la globalize.js y su archivo
especfico cultures/globalize.cultures.js(de https://github.com/jquery/globalize ) y JavaScript para
utilizar Globalize.parseFloat. El cdigo siguiente muestra las modificaciones en el archivo
Views\Movies\Edit.cshtml para trabajar con la cultura "fr-FR":

@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
<script src="~/Scripts/globalize.js"></script>
<script src="~/Scripts/globalize.culture.fr-FR.js"></script>
<script>
$.validator.methods.number = function (value, element) {
return this.optional(element) ||
!isNaN(Globalize.parseFloat(value));
}
$(document).ready(function () {
Globalize.culture('fr-FR');
});
</script>
<script>
jQuery.extend(jQuery.validator.methods, {
range: function (value, element, param) {
//Use the Globalization plugin to parse the value
var val = $.global.parseFloat(value);
return this.optional(element) || (
val >= param[0] && val <= param[1]);
}
});

</script>
}
Observe cmo el formulario automticamente ha utilizado un color de borde rojo para resaltar los cuadros
de texto que contienen datos no vlidos y ha emitido un mensaje de error de validacin adecuado junto a
cada uno.Los errores se aplican client-side (usando JavaScript y jQuery) y servidor (en caso de que un
usuario tiene JavaScript desactivado).
Un beneficio real es que no necesita cambiar una sola lnea de cdigo en la clase de MoviesController o en
la vista de Create.cshtml con el fin de permitir esta validacin UI. El controlador y vistas que cre
anteriormente en este tutorial recogido automticamente las reglas de validacin especificado mediante
atributos de validacin en las propiedades de la clase de modelo de la Movie .
Usted puede haber notado las propiedades Title y el Genre, el atributo requerido no se cumple hasta
enviar el formulario (golpe el botn crear ), o introduzca texto en el campo de entrada y sacarla. Para un
campo que est inicialmente vaca (como los campos de la visin de crear) y que tiene slo el atributo
requerido y no otros atributos de validacin, puede hacer lo siguiente para activar la validacin:
1. Ficha en el campo.
2. Introduzca algn texto.
3. Ficha hacia fuera.
4. Ficha en el campo.
5. Eliminar el texto.
6. Ficha hacia fuera.
La secuencia activar la validacin necesaria sin golpear el botn "enviar". Simplemente golpear el botn
"enviar" sin entrar en cualquiera de los campos se activar la validacin del lado del cliente. Los datos del
formulario no se envan al servidor hasta que no queden errores de validacin del lado cliente. Puede
comprobarlo poniendo un punto de interrupcin en el mtodo HTTP Post o mediante la herramienta
fiddler o el F12 developer tools de IE 9.
Cmo debe producirse la validacin en el crear ve y crea
el mtodo de accin
Te preguntars cmo se gener la validacin UI sin las actualizaciones al cdigo en el controlador o
vistas. El listado siguiente muestra lo que parecen los mtodos Create en la clase MovieController . Son
igual de cmo se cre anteriormente en este tutorial.
//
// GET: /Movies/Create
public ActionResult Create()
{
return View();
}

//
// POST: /Movies/Create

[HttpPost]
public ActionResult Create(Movie movie)
{
if (ModelState.IsValid)
{
db.Movies.Add(movie);
db.SaveChanges();
return RedirectToAction("Index");
}

return View(movie);
}
El primer mtodo de accin (HTTP GET) Create muestra el formulario inicial de crear. La segunda versin
([HttpPost]) maneja el post de formulario. El segundo mtodo de Create (la versin HttpPost ) llama
aModelState.IsValid para comprobar si la pelcula tiene errores de validacin. Llamar a este mtodo evala
los atributos de validacin que se han aplicado al objeto. Si el objeto tiene errores de validacin, el
mtodo Createre-displays la forma. Si no hay ningn error, el mtodo guarda la nueva pelcula en la base
de datos. En nuestro ejemplo de pelcula que estamos utilizando, la forma no se registra en el
servidor cuando se producen errores de validacin detectados en el cliente; el
segundo Create nunca se llama al mtodo. Si desactiva JavaScript en tu navegador, validacin de
cliente se desactiva y el mtodo HTTP POST Create llama a ModelState.IsValid para comprobar si la
pelcula tiene errores de validacin.
Puede establecer un punto de interrupcin en el mtodo HttpPost Create y verificar nunca se llama al
mtodo, validacin del lado del cliente no presentar los datos del formulario cuando se detectan errores
de validacin. Si desactivar JavaScript en su navegador, y enviar el formulario con errores, se puede
golpear el punto de quiebre.Usted todava obtener validacin completo sin JavaScript. La siguiente imagen
muestra cmo deshabilitar JavaScript en Internet Explorer.
La siguiente imagen muestra cmo deshabilitar JavaScript en el navegador FireFox.

La siguiente imagen muestra cmo deshabilitar JavaScript con el navegador Chrome.


A continuacin es la plantilla de vista de Create.cshtml que usted escalonada anteriormente en el
tutorial. Es utilizado por los mtodos de accin indicados tanto para mostrar la forma inicial y volver en
caso de error.
@model MvcMovie.Models.Movie

@{
ViewBag.Title = "Create";
}

<h2>Create</h2>

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")"></script>

@using (Html.BeginForm()) {
@Html.ValidationSummary(true)

<fieldset>
<legend>Movie</legend>

<div class="editor-label">
@Html.LabelFor(model => model.Title)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Title)
@Html.ValidationMessageFor(model => model.Title)
</div>

<div class="editor-label">
@Html.LabelFor(model => model.ReleaseDate)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.ReleaseDate)
@Html.ValidationMessageFor(model => model.ReleaseDate)
</div>

<div class="editor-label">
@Html.LabelFor(model => model.Genre)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Genre)
@Html.ValidationMessageFor(model => model.Genre)
</div>

<div class="editor-label">
@Html.LabelFor(model => model.Price)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Price)
@Html.ValidationMessageFor(model => model.Price)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Rating)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Rating)
@Html.ValidationMessageFor(model => model.Rating)
</div>
<p>
<input type="submit" value="Create" />
</p>
</fieldset>
}

<div>
@Html.ActionLink("Back to List", "Index")
</div>
Observe cmo el cdigo utiliza un ayudante de Html.EditorFor para el elemento <input> para cada
propiedad de la Movie de salida. Junto a este ayudante es una llamada al mtodo de ayudante
deHtml.ValidationMessageFor . Estos dos mtodos auxiliares de trabajo con el objeto de modelo que se
pasa por el regulador a la vista (en este caso, un objeto de la Movie ). Buscan automticamente atributos
de validacin especificados en los mensajes de error de modelo y de la pantalla segn corresponda.
Lo que es realmente bueno sobre este enfoque es que la plantilla de vista de crear ni el controlador sabe
algo acerca de las reglas de validacin real estn aplicadas o aparece el mensaje de error especfico. Las
reglas de validacin y las cadenas de error se especifican solamente en la clase de Movie . Estas mismas
reglas de validacin se aplican automticamente a la vista Edit y cualquier otras vistas plantillas puede
crear que edicin el modelo.
Si desea cambiar la lgica de validacin ms adelante, puede hacerlo en su lugar exactamente un
aadiendo atributos de validacin para el modelo (en este ejemplo, la clase de movie ). Usted no tendr
que preocuparse por diferentes partes de la aplicacin es incompatible con el cmo se hacen cumplir las
reglas toda lgica de validacin ser definida en un solo lugar y en todas partes. Esto mantiene el
cdigo muy limpio y es fcil de mantener y evolucionar. Y significa que usted estar completamente
honrar el principio seco.
Agregar formato al modelo de la pelcula
Abra el archivo Movie.cs y examinar la clase de Movie . El espacio de
nombresSystem.ComponentModel.DataAnnotations proporciona atributos de formato adems el conjunto
integrado de atributos de validacin. Ya hemos solicitado un valor de enumeracin de DataType a la fecha
de lanzamiento y a los campos de precio. El cdigo siguiente muestra las propiedades de Price con el
atributo de DisplayFormatapropiado y ReleaseDate .
[DataType(DataType.Date)]
public DateTime ReleaseDate { get; set; }

[DataType(DataType.Currency)]
public decimal Price { get; set; }
Los atributos de DataType no son atributos de validacin, que se utilizan para contar el motor ver cmo
hacer el cdigo HTML. En el ejemplo anterior, el atributo DataType.Date muestra las fechas de la pelcula
como fechas solamente, con hora de salida. Por ejemplo, los siguientes atributos de DataType no validar el
formato de los datos:
[DataType(DataType.EmailAddress)]
[DataType(DataType.PhoneNumber)]
[DataType(DataType.Url)]
Los atributos mencionados slo proporcionan sugerencias para el motor de la vista formatear los datos (y
atributos de la fuente como <a> para URL y < a href="mailto:EmailAddress.com" > por correo
electrnico. Puede utilizar el atributo RegularExpression para validar el formato de los datos.
Un enfoque alternativo al uso de los atributos de DataType , puede establecer explcitamente un
valorDataFormatString . El cdigo siguiente muestra la propiedad de la fecha de lanzamiento con una
cadena de formato de fecha (es decir, "d"). Se usara para especificar que no desea tiempo como parte de
la fecha de lanzamiento.
[DisplayFormat(DataFormatString = "{0:d}")]
public DateTime ReleaseDate { get; set; }
El siguiente cdigo asigna la propiedad Price moneda.
[DisplayFormat(DataFormatString = "{0:c}")]
public decimal Price { get; set; }
A continuacin se muestra la clase de Movie completa.
public class Movie {
public int ID { get; set; }

[Required]
public string Title { get; set; }

[DataType(DataType.Date)]
public DateTime ReleaseDate { get; set; }

[Required]
public string Genre { get; set; }

[Range(1, 100)]
[DataType(DataType.Currency)]
public decimal Price { get; set; }

[StringLength(5)]
public string Rating { get; set; }
}
Ejecute la aplicacin y busque el controlador de Movies . La fecha de lanzamiento y el precio son bien
formateados. La imagen de abajo muestra la fecha de lanzamiento y precio utilizando "fr-FR" como la
cultura.
La imagen de abajo muestra los mismos datos que aparecen con la referencia cultural predeterminada
(Ingls US).
En la siguiente parte de la serie, a revisar la aplicacin y hacer algunas mejoras a los mtodos
de Details yDelete generados automticamente.

Examinar los detalles y los mtodos de eliminacin


Tutoriales

Por Rick Anderson|28 De agosto de 2012

En esta parte del tutorial, examinas los mtodos generados automticamente de Details y Delete .

Examinar los detalles y los mtodos de eliminacin


Examining the Details and Delete Methods
Abrir el controlador de la Movie y examinar el mtodo Details .
public ActionResult Details(int id = 0)
{
Movie movie = db.Movies.Find(id);
if (movie == null)
{
return HttpNotFound();
}
return View(movie);
}
Cdigo primero facilita la bsqueda de datos mediante el mtodo Find . Una caracterstica de seguridad
importante construida en el mtodo es que el cdigo comprueba que el mtodo Find ha encontrado una
pelcula antes de que el cdigo trata de hacer cualquier cosa con l. Por ejemplo, un hacker podra
introducir errores en el sitio cambiando la URL creada por los vnculos
de http://localhost:xxxx/Movies/Details/1 a algo comohttp://localhost:xxxx/Movies/Details/12345 (o algn
otro valor que no representa una pelcula real). Si no revisas para una pelcula nula, una pelcula null dara
lugar a un error de base de datos.
Examinar los mtodos de Delete y DeleteConfirmed .
// GET: /Movies/Delete/5

public ActionResult Delete(int id = 0)


{
Movie movie = db.Movies.Find(id);
if (movie == null)
{
return HttpNotFound();
}
return View(movie);
}

//
// POST: /Movies/Delete/5

[HttpPost, ActionName("Delete")]
public ActionResult DeleteConfirmed(int id = 0)
{
Movie movie = db.Movies.Find(id);
if (movie == null)
{
return HttpNotFound();
}
db.Movies.Remove(movie);
db.SaveChanges();
return RedirectToAction("Index");
}
Tenga en cuenta que el mtodo HTTP Get Delete no elimina la pelcula especificada, devuelve una vista de
la pelcula donde puede enviar (HttpPost) la supresin... Realizar una operacin de eliminacin en
respuesta a un GET solicitar (o para ello, realice una operacin de edicin, crear operacin o cualquier otra
operacin que cambia datos) abre un agujero de seguridad. Para obtener ms informacin sobre esto, vea
la entrada de blog de Stephen Walther ASP.NET MVC Tip #46 no utiliza enlaces de eliminar porque crear
agujeros de seguridad.
El mtodo de HttpPost que borra los datos se denomina DeleteConfirmed a una firma nica o el nombre
del mtodo HTTP POST. Las firmas de dos mtodos se muestran a continuacin:
// GET: /Movies/Delete/5
public ActionResult Delete(int id = 0)

//
// POST: /Movies/Delete/5
[HttpPost, ActionName("Delete")]
public ActionResult DeleteConfirmed(int id = 0)
Common language runtime (CLR) requiere mtodos sobrecargados para tener una firma nica (mismo
nombre de mtodo pero diferente lista de parmetros). Sin embargo, aqu necesita dos mtodos de
eliminar--Get--y puesto que ambos tienen la misma firma. (Deben aceptar un nico entero como
parmetro).
Para arreglar esto, puede hacer un par de cosas. Uno es darle a los mtodos diversos nombres. Eso es lo
que hizo el mecanismo de andamios en el anterior ejemplo. Sin embargo, esto presenta un pequeo
problema: ASP.NET asigna segmentos de una URL a mtodos de accin por su nombre, y si cambia el
nombre de un mtodo, enrutamiento normalmente sera capaz de encontrar ese mtodo. La solucin es lo
que se ve en el ejemplo, que consiste en aadir el atributo ActionName("Delete") al
mtodo DeleteConfirmed . Esto efectivamente realiza mapas para el sistema de enrutamiento para que
una direccin URL que incluye /Delete/ para una solicitud POST encontrar el mtodo de DeleteConfirmed .
Otra forma comn para evitar un problema con mtodos que tienen firmas y nombres idnticos es cambiar
artificialmente la firma del mtodo POST para incluir un parmetro sin usar. Por ejemplo, algunos
desarrolladores aadir un tipo de parmetro FormCollection que se pasa al mtodo POST y luego
simplemente no utiliza el parmetro:
public ActionResult Delete(FormCollection fcNotUsed, int id = 0)
{
Movie movie = db.Movies.Find(id);
if (movie == null)
{
return HttpNotFound();
}
db.Movies.Remove(movie);
db.SaveChanges();
return RedirectToAction("Index");
}

Resumen
Ahora tienes una completa aplicacin ASP.NET MVC que almacena los datos en una base de datos local de
DB.Puede crear, leer, actualizar, eliminar y buscar pelculas.
Prximos pasos
Despus de haber construido y probado una aplicacin web, el siguiente paso es ponerlo a disposicin de
otras personas utilizan Internet. Para ello, se debe implementar a un proveedor de hospedaje. Microsoft
ofrece alojamiento web gratis para hasta 10 sitios web en una cuenta de prueba gratis de Windows
Azure. Para obtener informacin sobre cmo implementar un proyecto web de Visual Studio a un sitio Web
de Windows Azure, consulte crear e implementar un sitio web ASP.NET y base de datos SQL con Visual
Studio. Este tutorial tambin muestra cmo utilizar la entidad marco cdigo primera migraciones para
implementar su base de datos de SQL Server en la base de datos de SQL Azure del Windows
(anteriormente SQL Azure). Para obtener ms informacin acerca de implementacin, vea implementacin
de ASP.NET Web contenido mapa.
Ahora me animo a pasar a nuestro nivel intermedio creando un marco de Entity Data Model para una
aplicacin de ASP.NET MVC y MVC Music Store tutoriales, para explorar los artculos ASP.NET en MSDNy
para comprobar hacia fuera los muchos recursos http://asp.net/mvc para aprender ms sobre ASP.NET MVC
y videos! Los foros de ASP.NET MVC son un buen lugar para hacer preguntas.

Você também pode gostar