Vous êtes sur la page 1sur 91

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.

Vous aimerez peut-être aussi