You are on page 1of 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 est abierto en el IDE.

soluciones que crea un nuevo archivo ha sido nombrado HelloWorldController.cs. El archivo

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-MvcMovie2012213181139;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"> <legend>Movie</legend> <fieldset>

<input data-val="true" data-val-number="The field ID must be a number." data-valrequired="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-valmsgreplace="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-valmsgreplace="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-valmsgreplace="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-valmsgreplace="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. 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. Utilice migraciones primer cdigo para actualizar el esquema de base de datos.

2.

3.

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. 3. 4. 5. 6. Introduzca algn texto. Ficha hacia fuera. Ficha en el campo. Eliminar el texto. 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.

You might also like