using System; utilizando System.Collections.Generic; utilizando System.Linq; usando System.Threading.Tasks; utilizando Microsoft.AspNetCore.Builder; utilizando Microsoft.AspNetCore.Hosting; utilizando Microsoft.AspNetCore.Http; utilizando Microsoft.Extensions.DependencyInjection; utilizando Microsoft.Extensions.Logging; namespace FirstAppDemo {public class Startup {// El tiempo de ejecucion llama a este metodo. // Utilice este metodo para agregar servicios al contenedor. // Para mas informacioninstrucciones sobre como configurar su aplicacion, // visite http: //go.microsoft.com/fw/? LinkID "=398940" " " " public void ConfigureServices (servicios IServiceCollection) {} // Este metodo es llamado por el tiempo de ejecucion. Utilice este metodo para configurar // la canalizacion de solicitudes HTTP. Configure public void (aplicacion IApplicationBuilder, entorno IHostingEnvironment, ILoggerFactory loggerFactory) {loggerFactory.AddConsole if (env.IsDevelopment ()) {app.UseDeveloperExceptionPage } app.Run ((context) => {await context.Response.WriteAsync ( "¡Hola mundo ");}); }}}
En la class Startup, hay dos metodos en los que se llevara a cabo la mayor parte de nuestro trabajo. El metodo Configure de la class es donde construyes tu canalizacion de procesamiento HTTP.
En el Explorador de soluciones, haga clic derecho en el nodo de su proyecto y seleccione Agregar → Nuevo elemento .
Tambien podemos decirle a nuestro programa que lea el texto del archivo en lugar de tener la cadena Hello World! en Startup.cs. siguiente codigo en AppSettings.json .
{ "message": "¡Hola, mundo! este mensaje proviene del archivo de configuracion ... "}
Ahora necesitamos acceder a este mensaje desdeluego el archivo Startup.cs. Aqui esta la implementacion del archivo Startup.cs que leera el mensaje anterior del archivo JSON.
usando Microsoft.AspNet.Builder; utilizando Microsoft.AspNet.Hosting; utilizando Microsoft.AspNet.Http; utilizando Microsoft. Extensions.DependencyInjection; utilizando Microsoft.Extensions.Configuration; espacio de nombres FirstAppDemo {inicio de class publica {inicio publico () {var builder = new ConfigurationBuilder () .AddJsonFile ( "AppSettings.json "); Configuracion = constructor.Build } Configuracion de IConfiguration publica {get; set;} // Este metodo es llamado por el tiempo de ejecucion. // Utilice este metodo para agregar servicios al contenedor. // Para obtener mas informacion sobre la configuracion de su aplicacion, // visite http: / /go.microsoft.com/fw/?LinkID=398940 public void ConfigureServices (IServiceCollection services) {} // Este metodo es llamado por el motor de ejecucion. // Utilea este metodo para configurar la canalizacion de solicitudes HTTP. Configure public void (aplicacion IApplicationBuilder) {app.UseIISPlatformHandler app.Run ((context) => {var msg = Configuration [ "message"]; espera context.Response.WriteAsync (msg);}); } // Punto de entrada de la aplicacion. public static void Ma in (string args) = 7gt; WebApplication.Run (args); }}
Ahora iniciemos la aplicacion. Una vez que se ejecuta la aplicacion, producira el siguiente resultado.
En este capitulo, entenderemos como poner configurar middleware. Middleware en ASP.NET Core controla como nuestra aplicacion responde a las solicitudes HTTP. Tambien puede controlar la apariencia de nuestra aplicacion en caso de error, y este es un elemento clave en como autenticamos y autorizamos a un usuario a realizar acciones especificas.
Supongamos ahora que queremos registrar informacion sobre cada consulta en nuestra aplicacion.
Ahora tomemos un ejemplo simple para aprender mas sobre middleware. Configuramos el middleware en ASP.NET usando el metodo Configure de nuestra class de inicio .
usando Microsoft.AspNet.Builder; utilizando Microsoft.AspNet.Hosting; utilizando Microsoft.AspNet.Http; utilizando Microsoft.Extensions.DependencyInjection; utilizando Microsoft.Extensions.Configuration; espacio de nombres FirstAppDemo {inicio de class publica {inicio publico () {var builder = new ConfigurationBuilder () .AddJsonFile ( "AppSettings.json "); Configuracion = constructor.Build } Configuracion de IConfiguration publica {get; juntos; } // Este metodo est llamado por el tiempo de ejecucion. // Utilice este metodo para agregar servicios al contenedor. // Para obtener mas informacion sobre como configurar su aplicacion, // visite http: //go.microsoft.com/fw/? LinkID "=398940" " " " public void ConfigureServices (IServiceCollection services) {} // El tiempo de ejecucion llama a este metodo. // Utilice este metodo para configurar la canalizacion de solicitudes HTTP. Configure public void (aplicacion IApplicationBuilder) {app.UseIISPlatformHandler app.Run ((co ntext) => {var msg = Configuration [ "message"]; espera context.Response.WriteAsync (msg);}); } // Punto de entrada de la aplicacion. public static void Main (string args) => WebApplication.Run (args); }}
Hay dos elementos de middleware en un nuevo proyecto vacio de forma predeterminada:
El middleware con el que registre Run nunca tendra la oportunidad de llamar a otro middleware, todo lo que hace es recibir una solicitud y luego deberia producir algun tipo de respuesta.
Tambien tiene acceso a un objeto Response y una de las cosasLo que puede hacer con un objeto Response es escribir una cadena.
Si desea registrar otro middleware despues de app.Run, nunca se llamara a ese middleware porque, de nuevo, Run es un middleware de terminal. Nunca llamara al proximo middleware.
// El tiempo de ejecucion llama a este metodo. // Utilice este metodo para configurar la canalizacion de solicitudes HTTP. Configure public void (aplicacion IApplicationBuilder) {app.UseIISPlatformHandler app.UseWelcomePage app.Run ((context) => {var msg = Configuration [ "message"]; espera context.Response.WriteAsync (msg);}); }
Esta pantalla de bienvenida puede no ser tan util.
// El tiempo de ejecucion llama a este metodo. // Utilice este metodo para configurar la canalizacion de solicitudes HTTP. Configure public void (aplicacion IApplicationBuilder) {app.UseIISPlatformHandler app.UseRuntimeInfoPage app.Run ((context) => {var msg = Configuration [ "message"]; espera context.Response.WriteAsync (msg);}); }
Ahora vera una respuesta que le brinda informacionons en su entorno de ejecucion, como sistema operativo, version de ejecucion, arquitectura, tipo y cualquier paquete que este utilizando, etc.
usando Microsoft.AspNet.Builder; utilizando Microsoft.AspNet.Hosting; utilizando Microsoft.AspNet.Http; utilizando Microsoft.Extensions.DependencyInjection; utilizando Microsoft.Extensions.Configuration; espacio de nombres FirstAppDemo {inicio de class publica {inicio publico () {var builder = new ConfigurationBuilder () .AddJsonFile ( "AppSettings.json "); Configuracion = constructor.Build } Configuracion de IConfiguration publica {get; juntos; } // Este metodo es llamado por el tiempo de ejecucion. // Utilice este metodo para agregar servicios al contenedor. // Para obtener mas informacion sobre como configurar su aplicacion, // visite http: //go.microsoft.com/fw/? LinkID "=398940" " " " "public void ConfigureServices (IServiceCollection services) {} // El tiempo de ejecucion llama a este metodo. // Utilice este metodo para configurar la canalizacion de solicitudes HTTP. Configure public void (aplicacion IApplicationBuilder) {app.UseIISPlatformHandler app.UseRuntimeInfoPage app.Run ((context) => {lanzar nueva System.Exception ( "Throw Exception "); var msg = Configuracion [ "mensaje "]; esperar context.Response.WriteAsync (msg);}); } // Punto de entrada de la aplicacion. stati publicoc void Main (string args) => WebApplication.Run (args); }}
Simplemente lanzara una excepcion con un mensaje muy generico. Guarde la pagina Startup.cs y ejecute su aplicacion.
Vera que no hemos podido cargar este recurso. Hubo un error HTTP 500, un error interno del servidor y esto no es muy util. Puede resultar util obtener informacion sobre las excepciones.
// El tiempo de ejecucion llama a este metodo. // Utilice este metodo para configurar la canalizacion de solicitudes HTTP. Configure public void (aplicacion IApplicationBuilder) {app.UseIISPlatformHandler app.UseDeveloperExceptionPage app.UseRuntimeInfoPage app.Run ((context) => {lanzar una nueva System.Exception ( "Throw Exception "); var msg = Configuracion [ "message"]; esperar context.Response.WriteAsync (msg);}); }
Ejecutemos la aplicacion nuevamente. Producira una salida como se muestra en la siguiente captura de pantalla.
Ahora vera la informacion que esperaria si hubiera un error de desarrollo. Tambien obtendra un seguimiento de la pila y vera que se ha lanzado una excepcion no controladae en la linea 37 de Startup.cs.
Tambien puede ver los detalles sin procesar de las excepciones y toda esta informacion puede ser muy util para un desarrollador. De hecho, probablemente solo queremos mostrar esta informacion cuando un desarrollador esta ejecutando la aplicacion.
En este capitulo aprenderemos a trabajar con archivos. Una caracteristica importante que casi todas las aplicaciones web necesitan es la capacidad de servir archivos (archivos estaticos) desde el sistema de archivos.
Ahora tomemos un ejemplo simple en el que entenderemos como podemos servir estos archivos en nuestra aplicacion.
Aqui queremos agregar un archivo HTML simple a nuestra aplicacion FirstAppDemo y este archivo HTML debe ir a la carpeta raiz web (wwwroot). Haga clic derecho en la carpeta wwwroot en el Explorador de soluciones y seleccione Agregar → Nuevo elemento .
< DOCTYPE span> < charset = "utf-8" /> Bienvenido a ASP. NET Core ¡Hola, Wolrd! Este mensaje es de nuestro primer archivo HTML estatico.
No hay ningun middleware que busque un archivo en el sistema de archivos para servir. Para resolver este problema, navegue hasta a NuGet Package Manager haciendo clic con el boton derecho en el proyecto en el Explorador de soluciones y seleccionando Administrar paquetes NuGet.
usando Microsoft.AspNet.Builder; usando Microsoft.AspNet.Hosting; usando utileyendo Microsoft.AspNet.Http; utilizando Microsoft.Extensions.DependencyInjection; utilizando Microsoft.Extensions.Configuration; espacio de nombres FirstAppDemo {inicio de class publica {inicio publico () {var builder = new ConfigurationBuilder () .AddJsonFile ( "AppSettings.json "); Configuracion = constructor.Build } Configuracion de IConfiguration publica {get; juntos; } // Este metodo es llamado por el tiempo de ejecucion. // Utilice este metodo para agregar servicios al contenedor. // Para obtener mas informacion sobre como configurar su aplicacion, // visite http: //go.microsoft.com/fw/? LinkID "=398940" " " " public void ConfigureServices (IServiceCollection services) {} // El tiempo de ejecucion llama a este metodo. // Utilice este metodo para configurar la canalizacion de solicitudes HTTP. Configure public void (aplicacion IApplicationBuilder) {app.UseIISPlatformHandler app.UseDeveloperExceptionPage app.UseRuntimeInfoPage app.UseStaticFiles app.Run ((contexto) =>{lanzar nueva System.Exception ( "Lanzar excepcion "); var msg = Configuracion [ "mensaje "]; esperar context.Response.WriteAsync (msg);}); } // Punto de entrada de la aplicacion. public static void Main (string args) => WebApplication.Run (args); }}
A menos que anule las opciones y pase algunos parametros de configuracion diferentes, los archivos estaticos haran que una consulta determinada vea la ruta de la consulta . Esta ruta de consulta luego se compara con el sistema de archivos y lo que hay en el sistema de archivos.
Ahora puedeNo veo el archivo index.html. Todo lo que ponga en cualquier lugar de wwwroot, cualquier archivo JavaScript, CSS o HTML, puede servirlo.
// Este metodo es llamado por el tiempo de ejecucion. // Utilice este metodo para configurarla canalizacion de solicitudes HTTP. Configure public void (aplicacion IApplicationBuilder) {app.UseIISPlatformHandler app.UseDeveloperExceptionPage app.UseRuntimeInfoPage app.UseDefaultFiles app.UseStaticFiles app.Run ((context) => {var msg = Configuration [ "message"]; espera context.Response.WriteAsync (msg);}); }
Ahora puede ver que index.html es su archivo predeterminado. El orden en el que instala el middleware es importante porque si vSi tuviera UseDefaultFiles despues de UseStaticFiles, no obtendria el mismo resultado.
Si va a utilizar UseDefaultFiles y UseStaticFiles, es posible que tambien desee otra pieza de middleware que este en el paquete Microsoft.aspnet.staticfiles, NuGet, y que sea el middleware de FileServer . Esto basicamente incluye los archivos predeterminados y los archivos estaticos en el orden correcto.
// El tiempo de ejecucion llama a este metodo. // Utilice este metodo para configurar la canalizacion de solicitudes HTTP. Configure public void (aplicacion IApplicationBuilder) {app.UseIISPlatformHandler app.UseDeveloperExceptionPage app.UseRuntimeInfoPage aplicacion. UseFileServer app.Run ((context) => {var msg = Configuration [ "message"]; espera context.Response.WriteAsync (msg);}); }
En este capitulo, configuraremos el marco MVC en nuestra aplicacion FirstAppDemo. hacer esto construyendo una aplicacion web sobre ASP.NET Core, y mas especificamente, el marco ASP.NET Core MVC. Tecnicamente podemos construir una aplicacion completa usando solo middleware, pero ASP.NET Core MVC nos brinda la funcionalidad que que podemos usar para crear facilmente paginas HTML y API basadas en HTTP.
Ahora haga clic derecho en la carpeta Controladores y seleccione la opcion de menu Agregar → Clase .
Esta sera nuestra pagina predeterminada.
using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; espacio de nombres FirstAppdemo.Controllers {public class HomeController {cadena publica Index () {return "¡Hola, mundo! este mensaje es de Home Controller ...}}}
Vayamos a la raiz del sitio web y eliminemos index.html. Queremos que el controlador responda en lugar del archivo index.html .
Encontrara un error 500. 'indica que el marco no pudo encontrar los servicios ASP.NET Core MVC requeridos.
El propio ASP.NET Core Framework esta formado por diferentes componentes pequenos que tienen responsabilidades muy especificas.
Por ejemplo, hay un componente que necesita ubicar e instanciar el controlador.
Este componente debe estar en la coleccion de servicios para que ASP.NET Core MVC funcione correctamente.
usando Microsoft.AspNet.Builder; utilizando Microsoft.AspNet.Hosting; utilizando Microsoft.AspNet.Http; utilizando Microsoft.Extensions.DependencyInjection; utilizando Microsoft.Extensions.Configuration; espacio de nombres FirstAppDemo {inicio de class publica {inicio publico () {var builder = new ConfigurationBuilder () .AddJsonFile ( "AppSettings.json "); Configuracion = constructor.Build } Configuracion de IConfiguration publica {get; juntos; } // Este metodo es llamado por el tiempo de ejecucion. // Utilice este metodo para agregar servicios al contenedor. // Para obtener mas informacion sobre como configurar su aplicacion, // visite http: //go.microsoft.com/fw/? LinkID "=398940" " " " "public void ConfigureServices (servicios de IServiceCollection) {services.AddMvc } // Este metodo es llamado por el tiempo de ejecucion. // Utilice este metodo para configurarla canalizacion de solicitudes HTTP. Configure public void (aplicacion IApplicationBuilder) {app.UseIISPlatformHandler app.UseDeveloperExceptionPage app.UseRuntimeInfoPage app.UseFileServer app.UseMvcWithDefaultRoute app.Run ((context) => {var msg = Configuration [ "message"]; espera context.Response.WriteAsync (msg);}); } // Punto de entrada de la aplicacion. public static void Main (string args) => WebApplication.Run (args); }}
El patron de diseno Modelo-Vista-Controlador (MVC) es un patron de diseno que ha existido durante algunas decadas y se ha utilizado en muchas tecnologias diferentes, desde Smalltalk hasta C ++, Java y ahora en C # y .NET como plantilla de diseno para uUtilice esto cuando este creando una interfaz de usuario.
La MVC separa la interfaz de usuario (UI) de una aplicacion en las siguientes tres partes:
Ahora entendamos la idea detras de MVC.
En MVC, el controlador recibe una solicitud HTTP, el controlador debe averiguar como recopilar la informacion para responder a esta solicitud. Tal vez el usuario este dirigiendo el navegador a la URL / libros de la aplicacion. Por lo tanto, el controlador debe recopilar la informacion para mostrar un lista de libros. En este escenario, el controlador creara un modelo.
Estos son los conceptos basicos del patron de diseno MVC y la idea detras de este patron es mantener una separacion de preocupaciones. Por lo tanto, el controlador solo es responsable de tomar una solicitud y crear un modelo. Es el modelo que lleva la logica y los data que necesitamos a la vista. Entonces, la vista solo es responsable de transformar ese modelo en HTML.
En el marco MVC, tenemos tres componentes, cada uno con su propio enfoque en uno que es parte del trabajo. Para que todo esto funcione, necesitamos encontrar una manera de enviar estas solicitudes HTTP al controlador correcto. En ASP.NET Core MVC, este proceso se denomina enrutamiento. El enrutamiento es el proceso de dirigir una solicitud HTTP a un controlador.
Ahora veamos como enrutar solicitudes a diferentes controladores.
routeBuilder.MapRoute ( "Default ", "{controller = Home} / {action = Index} / {id ?} ");
En el ultimo capitulo, creamos un controlador (HomeController) en nuestra aplicacion que es una class C # y que no no necesita derivarse de una class base o implementar una interfaz o tener un atributo especial. Es una class C # simple con un nombre, HomeController, y contiene el metodo Index que devuelve una cadena.
using System; utilizando System.Collections.Generic; uso de System.Linq; uso de System.Threading.Tasks; espacio de nombres FirstAppdemo.Controllers {public class HomeController {public string Index () {return "¡Hola, mundo! Este mensaje es de Home Controller ...}}}
public void Configure (aplicacion IApplicationBuilder) {app.UseIISPlatformHandler app.UseDeveloperExceptionPage app.UseRuntimeInfoPage app.UseFileServer app.UseMvRoute app.Run ((contexto) => {var msg = Configuracion [ "mensaje "]; espera context.Response.WriteAsync (msg);});}
usando Microsof t.AspNet.Builder; utilizando Microsoft.AspNet.Hosting; utilizando Microsoft.AspNet.Http; utilizando Microsoft.Extensions.DependencyInjection; utilizando Microsoft.Extensions.Configuration; utilizando Microsoft.AspNet.Routing; usando el sistema; espacio de nombres FirstAppDemo {inicio de class publica {inicio publico () {var builder = new ConfigurationBuilder () .AddJsonFile ( "AppSettings.json "); Configuracion = constructor.Build } Configuracion de IConfiguration publica {get; juntos; } // Este metodo es llamado por el tiempo de ejecucion. // Utilice este metodo para agregar servicios al contenedor. // Paramas informacion sobre como configurar su aplicacion, // visite http: //go.microsoft.com/fw/? LinkID "=398940" " " " public void ConfigureServices (Servicios de IServiceCollection) {services.AddMvc } // Este metodo es llamado por el tiempo de ejecucion. // Utilice este metodo para configurar la canalizacion de solicitudes HTTP. Configure public void (aplicacion IApplicationBuilder) {app.UseIISPlatformHandler app.UseDeveloperExceptionPage app.UseRuntimeInfoPage app.UseFileServer app.UseMvc (ConfigureRoute); app.Run ((context) => {var msg = Configuration [ "message"]; espera context.Response.WriteAsync (msg);}); } private void ConfigureRoute (IRouteBuilder routeBuilder) {// Inicio / Index routeBuilder.MapRoute ( "Default ", "{controller = Home} / {action = Index} / {id?} "); } // Punto de entrada de la aplicacion. public static void Main (string args) => WebApplication.Run (args); }}
O ejecutamos la aplicacion en el navegador. Una vez que se inicia la aplicacion, vera el siguiente resultado.
Puedes verAparece un mensaje de la aplicacion. Ejecute el middleware, y la razon por la que recibimos este mensaje es que el middleware MVC ha visto esta URL. Esta fue una solicitud a la raiz del sitio web, que no pudo encontrar un nombre de controlador o un nombre de accion en la URL. La raiz del sitio web abandono el procesamiento de esta solicitud y la envio al siguiente middleware, que es el codigo app.Run . El modelo de carretera que especificamos es silencioso a diferencia del modelo predeterminado.
En la plantilla predeterminada, hay valores predeterminados para aplicar si no se encuentran un controlador y un nombre de accion. Si llega una solicitud a la raiz del sitio web, el nombre del controlador predeterminado seria Inicio. Puede reemplazarlo con cualquier otro controlador que desee y el nombre de accion predeterminado puede ser Index. Tambien puede cambiar la accion predeterminada si lo desea, como se muestra en el siguiente programa.
private void ConfigureRoute (IRouteBuilder routeBuilder) {// Inicio / Index routeBuilder.MapRoute ( "Default ", "{controller = Home} / {action = Index} / {id?} "); }
Si llega una solicitud a la raiz del sitio web, MVC no ve un tipo de URL de controlador / accion, pero puede usar estos valores predeterminados.
Guardemos el archivo Startup.cs y actualice el navegador en la raiz del sitio web.
Ahora vera una respuesta de su controlador y tambien puede ir a / home que invocara la accion predeterminada, que es index. Tambien puede vaya a / home / index y ahora MVC extraera el nombre del controlador y el nombre de la accion de la URL.
Creemos otro controlador agregando otra class y llamemoslo AboutController .
Agreguemos algunos Metodos de accion simples que devolveran la cadena como se muestra en el siguiente programa.
usando Syvastago; utilizando System.Collections.Generic; utilizando System.Linq; usando System.Threading.Tasks; espacio de nombres FirstAppDemo.Controllers {public class AboutController {public string Phone () {return "+ 49-333-3333333} public string Country () {return " Germany}}}
En este controlador, puede ver dos metodos de accion: Telefono y Pais, que devolveran un numero de telefono y un nombre de pais respectivamente. Entraremos en HTML sofisticado mas tarde. Guardemos este archivo y especifiquemos / about / phone al final de la URL raiz.
Puedes vea el numero de telefono como en la captura de pantalla anterior. Si especifica / about / country , tambien vera el nombre del pais.
Si navega a / about , volvera al middleware y accedera a su aplicacion. Ejecute el middleware y vera la siguiente pagina.
Aqui ASP.NET Core MVC accede a AboutController, pero no encuentra una accion especificada, por lo que sera porÍndice predeterminado y este controlador no tiene un metodo de indice y luego la solicitud ira al siguiente middleware.
ASP.NET Core - Rutas de atributo
En este capitulo vamos a aprender otro enfoque del enrutamiento y es el enrutamiento basado en atributos. Con el enrutamiento basado en atributos, podemos usar atributos de C # en nuestras classs de controlador y en los metodos internos en esas classs. Estos atributos tienen data que le indican a ASP.NET Core cuando llamar a un controlador especifico.
-
Es una alternativa al enrutamiento basado en convenciones.
-
Las rutas se evaluan en el orden en que aparecen, el orden en el que las guarda, pero es bastante comun mapear multiples rutas, especialmente si desea tener diferentes parametros en la URL o si desea tener diferentes literales en la URL.
Ejemplo
Tomemos un ejemplo sencillo. Abra el proyecto FirstAppDemo y ejecute la aplicacion en el navegador. Cuando especifica / about , producira la siguiente salida:
Lo que queremos aqui es que cuando especificamos / about , la aplicacion debe llamar al telefono que ejecuta AboutController . Aqui podemos aplicar algunas rutas explicitas para este controlador usando un atributo de Ruta. Este atributo se encuentra en el espacio de nombres Microsoft.AspNet.Mvc .
La siguiente es la implementacion de AboutController en la que se agregan rutas de atributos.
usando Microsoft.AspNet.Mvc; usando el sistema; utilizando System.Collections.Generic; utilizando System.Linq; usando System.Threading.Tasks; espacio de nombres FirstAppDemo.Controllers {[Ruta ( "sobre ")] class publica AboutController {[Ruta ( ")] cadena publica Telefono () {return "+ 49-333-3333333} [Ruta (" pais ")] cuerdae public Country () {return "Germany}}}
Aqui queremos que esta ruta se vea aproximadamente y para la accion Phone hemos especificado una cadena vacia, lo que significa que no es necesario especificar la accion para obtener este metodo. El usuario solo tiene que ir a / acerca de. Para la accion Pais, especificamos el "pais" en el atributo de ruta . Permitanos registrar AboutController, actualizar su navegador y navegar hacia / sobre y deberia darle la accion Telefono.
Especifiquemos el / about / country . permitira el acceso a esta accion de pais.
Si desea que un segmento de la URL contenga el nombre de su controlador, lo que puede hacer es use el nombre del controlador explicitamente, puede usar un controlador de token dentro de los corchetes. Esto le dice a ASP.NET MVC que use el nombre de ese controlador en esta posicion, como se muestra en el siguiente programa.
usando Microsoft.AspNet.Mvc; usando el sistema; usando System.Collections.Generic; usando System.Linq; usando System.Threading.Tasks; espacio de nombres FirstAppDemo.Controllers {[Route (" [controlador] " )] public class AboutController {[Route ( ")] public string Phone () {return "+ 49-333-3333333} [Route (" [action] ")] public string Country () {return "Alemania}}}
De esa manera, si alguna vez cambia el nombre del controlador, no tiene que acordarse de cambiar la ruta. Lo mismo ocurre con una accion e implicitamente hay tiene una barra inclinada (/) entre el controlador y la accion. Esta es una relacion jerarquica entre el controlador y la accion, tal como aparece en la URL. Guardemos de nuevo este controlador. Lo mas probable es que vea los mismos resultados.
Vamos a especificar el / about / pais. Esto le permitira acceder a esta accion de pais.
ASP.NET Core - Resultados de la accion
En este capitulo discutiremost los resultados de la accion. En los capitulos anteriores, usamos classs de C # simples y directas como controladores. Estas classs no se derivan de una class base y puede utilizar este enfoque con MVC, pero es mas comun derivar un controlador de una class base de controlador proporcionada en el espacio de nombres. Microsoft.AspNet.Mvc.
-
Esta class base nos da acceso a mucha informacion contextual sobre una consulta, asi como a metodos que nos ayudan a generar resultados para ser devuelto al cliente.
-
Puede devolver cadenas individuales y numeros enteros en una respuesta. Tambien puede devolver objetos complejos como un objeto para representar a un estudiante o una universidad o un restaurante, etc. y todos los data asociados con ese objeto.
-
Estos resultados generalmente se encapsulan en un objeto que implementa la interfaz IActionResult.
-
Hay muchos tipos de resultados diferentes que implementan esta interfaz: tipos de resultados que pueden contener plantillas o el contenido de un archivo para su propia carga.
-
Estos diferentes tipos de resultados pueden permitirnos devolver JSON a un cliente o XML o una vista que construya HTML.
Las acciones esencialmente devuelven diferentes tipos de resultados de accion. La class ActionResult es la base para todos los resultados de las acciones. Aqui hay una lista de diferentes tipos de resultados de acciones y su comportamiento.
Nombre | Behavior |
ContentResult | Devuelve una cadena |
FileContentResult | Devuelve el contenido del archivo |
FilePathResult | Devuelve el contenido del archivo |
FileStreamResult | Devuelve el contenido de la fidar un vuelco. |
EmptyResult | No devuelve nada |
JavaScriptResult | Devuelvelo para ejecucion |
JsonResult | Devuelve data en formato JSON |
RedirectToResult | Redirige a la URL especificada |
HttpUnauthorizedResult | Devuelve el codigo de estado HTTP 403 |
RedirectToRouteResult | Redirigir a accion diferente / accion de controlador diferente |
ViewResult | Recibido como respuesta para motor de visualizacion |
PartialViewR esult | Recibido en respuesta al motor de visualizacion |
Ejemplo 1
Tomemos un ejemplo simple abriendo HomeController y derivelo de la class basada en controlador. Esta class base se encuentra en el espacio de nombres Microsoft.AspNet.Mvc . Aqui esta la implementacion de la class HomeController.
usando Microsoft.AspNet.Mvc; usando el sistema; usando System.Collections.Generic; usando System.Linq; usando System.Threading.Tasks; espacio de nombres FirstAppdemo.Controllers {public class HomeController: Controller {public ContentResult Index () {return Content ( "¡Hola, mundo! Este mensaje proviene del controlador de inicio utilizando el resultado de la accion ");}}}
Ahora puede ver que el El metodo index devuelve ContentResult, que es uno de los tipos de resultados, y todos estos tipos de resultados finalmente implementan una interfaz, que es ActionResult .
En el Metodo Index, pasamos una cadena al metodo Content. Este metodo Content produce un ContentResult; esto significa que el metodo Index ahora devolvera ContentResult .
Guardemos la class HomeController y ejecute la aplicacion en el navegador. Producira la siguiente pagina.
Ahora puede ver una respuesta qui no suena diferente a la respuesta que teniamos antes. Siempre sera una respuesta de texto sin formato.
-
Es posible que se pregunte cual es el beneficio de usar algo que produce un ActionResult .
-
La ventaja tipica es que este es solo un medio formal de encapsular la decision del controlador.
-
El controlador decide que hacer a continuacion, devolver una cadena o HTML, o devolver un objeto de plantilla que podria serializarse como JSON, etc.
-
Todo lo que el controlador tiene que hacer es tomar esa decision, y el controlador no tiene que escribir los resultados de su decision directamente en la respuesta.
-
Solo necesita devolver la decision, luego es el marco el que tomara un resultado y descubrira como convertir ese resultado en algo que se pueda devolver a traves de HTTP.
Ejemplo 2
Tomemos otro ejemplo. Creadoz una nueva carpeta en el proyecto y asignele el nombre Plantillas . En la carpeta Modelos, queremos agregar una class que pueda representar a un empleado.
Introduzca Employee.cs en el campo Nombre como en la captura de pantalla anterior. Aqui, la implementacion de la class Empleado contiene dos propiedades.
usando System; usando System.Collections.Generic; usando System.Linq; usando System.Threading.Tasks; espacio de nombres FirstAppDemo.Models {public class Employee {public int ID {get; set; } public string Name {get; set}}}
En el metodo de accion Index de HomeController , queremos devolver un objeto Employee. Aqui esta la implementacion de HomeController .
usando FirstAppDemo.Models; usando Microsoft.AspNet.Mvc; usando system; usando System.Collections.Generic; usando System.Linq; usando System.Threading .Tasks; espacio de nombres FirstAppdemo.Controllers {public class HomeController: Controller {Public ObjectResult Index () {var employee = new Employee {ID = 1, Name = "Mark Upston "}; devuelve un nuevo ObjectResult (empleado); }}}
Ahora, en lugar de devolver el contenido, devolveremos un tipo diferente de resultado que se conoce como ObjectResult . Si queremos un ObjectResult, necesitamos crear o instanciar un ObjectResult y pasarle un objeto modelo .
-
Un ObjectResult es especial en el marco MVC porque cuando devolvemos un ObjectResult, el marco MVC mira ese objeto. Este objeto debe estar representado en la respuesta HTTP.
-
Este objeto debe serializarse como XML o JSON o algun otro formato y, en ultima instancia, la decision se tomara en funcion de la informacion de configuracion que proporcione al MVC al inicio. Si no configura nada, solo obtiene algunos valores predeterminados, y el valor predeterminado es una respuesta JSON.
GrabadoTransmita todos sus archivos y actualice el navegador. Vera la siguiente salida.
ASP.NET Core - Vistas
En una aplicacion ASP.NET Core MVC, no existe una pagina y tampoco incluye nada que coincida con una pagina directamente cuando especifica una ruta en la URL. Lo mas parecido a una pagina en una aplicacion ASP.NET Core MVC se llama vista.
-
Como sabe en la aplicacion ASP.NET MVC, todas las solicitudes entrantes del navegador son manejadas por el controlador y estas solicitudes se asignan las acciones del controlador.
-
Una accion de controlador puede devolver una vista o realizar algun otro tipo de accion, como redirigir a otra accion de controlador.
-
Con el marco MVC, la forma mas popular de crear HTML es usar el motor de vista Razor de ASP.NET MVC.
-
Para utilizar este motor de visualizacion, una accion de controleur produce un objeto ViewResult , y un ViewResult puede tener el nombre de la vista Razor que queremos usar.
-
La vista sera un archivo en el sistema de archivos y ViewResult tambien puede llevar un objeto modelo a la vista y la vista puede usar ese objeto modelo cuando crea el HTML.
-
Cuando el marco MVC ve que la accion de su controlador produce un ViewResult, el marco encontrara la vista en el archivo del sistema, ejecutara la vista, que produce HTML, y este es el HTML que el framework envia al cliente.
Ejemplo
Ahora tomemos un ejemplo simple para entender como funciona en nuestra aplicacion modificando la implementacion del metodo HomeController Index como se muestra en el proximo programa.
usando FirstAppDemo.Models; utilizando Microsoft.AspNet.Mvc; usando el sistema; utilizando System.Collections.Generico; utilizando System.Linq; usando System.Threading.Tasks; espacio de nombres FirstAppdemo.Controllers {Public Class HomeController: Controller {Public ViewResult Index () {var employee = new Employee {ID = 1, Name = "Mark Upston "}; volver Ver }}}
En HomeController , en lugar de producir un ObjectResult , devolvamos lo que View () devuelve. El metodo View no devuelve ObjectResult. Crea un nuevo ViewResult, por lo que tambien cambiaremos el tipo de retorno del metodo Index a ViewResult. El metodo View acepta aqui algunos parametros. Invocaremos este metodo sin ningun otro parametro. Permitanos guardar su archivo y actualizar su navegador.
Esto se debe a que el marco MVC necesita salir y encontrar esta vista, pero no hay ninguna vista en este momento.
-
Las vistas predeterminadas en un proyecto C # ASP.NET son archivos que tienen una extension * .cshtml y las vistas siguenun acuerdo especifico. De forma predeterminada, todas las vistas se encuentran en una carpeta Vistas del proyecto.
-
La ubicacion de la vista y el nombre del archivo de la vista seran derivados por ASP.NET MVC si no le da informacion adicional.
-
Si necesitamos renderizar una vista desde la accion Index del HomeController, el primer lugar donde el framework MVC buscara esta vista es dentro del Carpeta de vistas.
-
Ira a una carpeta de inicio, luego buscara un archivo llamado Index.cshtml; el nombre del archivo comienza con Index porque estamos en la accion Index.
-
El framework MVC tambien buscara en una carpeta compartida y las vistas que coloques en la carpeta compartida, puedes usarlas en cualquier lugar de la aplicacion.
Para que la salida de nuestra vista funcione correctamente, creemos este archivo Index.cshtml en la ubicacion correcta. Entonces en nuestro proyecto tenemos quePrimero agregue una carpeta que contendra todas nuestras vistas y llamela Vistas. En la carpeta Vistas, agregaremos otra carpeta para las vistas asociadas con nuestro HomeController y llamaremos a esta carpeta Inicio. Haga clic derecho en la carpeta Inicio y seleccione Agregar → Nuevo elemento .
En el panel izquierdo, seleccione la pagina de visualizacion de MVC e ingrese index.cshtml en el campo de nombre y haga clic en el boton Agregar.
Agreguemos el siguiente codigo al archivo index.cshtml.
Inicio ¡Bienvenido!
Este mensaje es de la vista ...
Ahora puede ver un * .cshtml . Puede contener marcado HTML y cualquier marcado que tengamos en ese archivo se enviara directamente al cliente. Guarde este archivo y actualice su navegador.
Ahora el controlador de inicio a traves de un ViewResult ha presentado esta vista al clientent y todo el marcado que esta en ese archivo index.cshtml, esto es lo que se envio al cliente.
Regresemos al HomeController y al metodo View. Este metodo de vista tiene algunas sobrecargas diferentes y pasa el modelo de empleado como parametro.
usando FirstAppDemo.Models; utilizando Microsoft.AspNet.Mvc; usando el sistema; utilizando System.Collections.Generic; utilizando System.Linq; usando System.Threading.Tasks; espacio de nombres FirstAppdemo.Controllers {Public Class HomeController: Controller {Public ViewResult Index () {var employee = new Employee {ID = 1, Name = "Mark Upston "}; Vista posterior (empleado); }}}
El metodo View que solo toma un objeto modelo y que usara la vista predeterminada, que es Index. Aqui solo queremos pasar la informacion de esta plantilla y usar esta plantilla en Index.cshtml como se muestra en el siguiente programa.
Inicio ¡Bienvenido!
@ Model.Name
Cuando usamos el signo @ en un Vista de Razor , el motor de vista de Razor tratara todo lo que escriba como una expresion de C #. La vista Razor tiene miembros integrados a los que podemos acceder en expresiones de C #. Uno de los miembros mas importantes es el modelo. Cuando diga @Model, obtendra el objeto modelo que paso a la vista desde el controlador. Entonces, aqui @ Model.Name mostrara el nombre del empleado en la vista.
Ahora hagamos una copia de seguridad de todos los archivos. Despues de eso, actualice su navegador para ver el siguiente resultado.
Ahora puede ver el nombre empleado como en la captura de pantalla anterior.
ASP.NET Core - Configurar Entity Framework
En este capitulo instalaremos y configuraremos nuestra aplicacion para guardar y leer data de una base de data de SQL Server.
Para trabajar con un bComo data, usaremos Entity Framework, que se reescribio recientemente para trabajar con el nuevo .NET Framework. Si ha trabajado con EF en el pasado, vera muchas cosas familiares.
-
En esta aplicacion usaremos SQL Server LocalDB. Si no se siente comodo con SQL Server, puede utilizar cualquier base de data que desee, como una base de data local o una base de data remota, siempre que tiene permiso para crear una nueva base de data en la instancia.
-
LocalDB es una edicion especial de SQL Server optimizada para desarrolladores.
-
Visual Studio 2015 e incluso su edicion Community instalaran LocalDB por defecto.
Para verificar LocalDB, vaya a la opcion de menu Ver → Explorador de objetos de SQL Server en Visual Studio.
Esta es una gran herramienta si necesita trabajar con SQL Server porque le permite explorar bases de data y buscar data e incluso crear data en una base de data. Cuando lo abra por primera vez, puede tardar un poco, pero deberia conectarse automaticamente a LocalDB.
Instalar Entity Framework
El primer paso para usar Entity Framework es instalar el paquete NuGet Entity Framework desde NuGet Package Manager o editando el project.json directamente.
Ahora editemos el archivo project.json directamente agregando los siguientes dos paquetes.
El paquete EntityFramework.Commands nos ayuda a realizar tareas con Entity Framework como el creando un esquema de base de data basado en nuestras classs de entidad C # y estas tareas estan disponibles desde una herramienta de linea de comandos donde la logica esta en el paquete EntityFramework.Commands.
Para usar esta herramienta de lineacomando, necesitamos hacer una entrada adicional en la seccion de comandos de project.json como se muestra en la siguiente captura de pantalla.
Lo llamamos "ef " y coincidira con este paquete EntityFramework.Commands. Podemos usar este "ef" para acceder a parte de la logica disponible en EntityFramework.Commands.
La siguiente es la implementacion del archivo project.json.
{ "version ": "1.0.0 - * ", "compilationOptions ": { "emitEntryPoint ": true}, "dependencias ": { "Microsoft .AspNet.Mvc ": "6.0.0-rc1-final ", "Microsoft.AspNet .Diagnosticos ": " 1.0.0-rc1-final ", " Microsoft.AspNet.IISPlatformHandler ": " 1.0.0-rc1-final ", " Microsoft.AspNet.Server.Kestrel " : "1.0.0-rc1-final ", "Microsoft.AspNet.StaticFiles ": "1.0 .0-rc1-final ", "EntityFramework.MicrosoftSqlServer ": "7.0.0-rc1 -final ", " EntityFramework.Commands ": " 7.0.0-rc1-final "} " ccomandos ": {" web ": " Microsoft.AspNet.Server.Kestrel "}, " frameworks ": {" dnx451 ": {}, " dnxcore50 ": {}}, "excluir ": [ "wwwroot ", "node_m odules "], "publishExclude ": [ "**. usuario ", " **. vspscc "]}
ASP.NET Core - DBContext
Entity Framework le permite consultar, insertar, actualizar y eliminar data en el Usando objetos Common Language Runtime (CLR) llamados entidades. Entity Framework mapea entidades y relaciones definidas en su modelo a una base de data. Para -
-
Materialice los data devueltos por la base de data como objetos de entidad.
-
Realice un seguimiento de los cambios que se han realizado en los objetos.
-
Administre la simultaneidad.
-
Propague los cambios de objetos a la base de data.
-
Vincular objetos a controles.
La class principal que es responsable de intla eliminacion con data como objetos es DbContext. La forma recomendada de trabajar con el contexto es definir una class que se derive de DbContext y exponga las propiedades de DbSet que representan las colecciones de las entidades especificadas en el contexto.
Logicamente, un DBContext se asigna a una base de data especifica que tiene un esquema que el DBContext comprende. Y en esta class DBContext, puede crear propiedades de tipo DbSet . El parametro de tipo generico T sera un tipo de entidad como Employee una entidad en la aplicacion FirstAppDemo.
Ejemplo
Tomemos un ejemplo simple, en el que vamos a crear una class DbContext. Aqui necesitamos agregar una nueva class en la carpeta Modelos y llamarlo FirstAppDempDbContext . Aunque esta class no es una plantilla en si, recopila todas nuestras plantillas para que podamos usarlas con la base de data.
Hereda tu class de contexto de la class DbContext qui se encuentra en el espacio de nombres Miscrosoft.Data.Entity. Ahora implemente un DbSet of Employee en esta class.
Eac h DbSet coincidira con una tabla en la base de data. Si tiene una propiedad Employee DbSet y el nombre de esa propiedad es Empleados, Entity Framework buscara una tabla Empleados en su base de data de forma predeterminada.
usando FirstAppDemo. Templates; utilizando Microsoft.Data.Entity; usando el sistema; utilizando System.Collections.Generic; utilizando System.Linq; usando System.Threading.Tasks; espacio de nombres OdeToFood.Models {FirstAppDemoDbContext de class publica: DbContext {DbSet publico Empleados {get; juntos; }}}
La implementacion es muy facil porque solo tenemos un modelo con el que trabajar. Solo necesitamos una propiedad, el DbSet de Employee y podemos nombrar esta propiedad Empleados .
Ahora insertemos esto classe directamente en los controladores, y los controladores podrian usar FirstAppDemoDbContext para consultar la base de data. Simplificaremos todo esto agregando una nueva class a la class HomeController en la que implementamos metodos para agregar un empleado y obtener un empleado como se muestra en el siguiente programa.
usando Microsoft. AspNet.Mvc; utilizando FirstAppDemo.ViewModels; utilizando FirstAppDemo.Services; utilizando FirstAppDemo.Entities; utilizando FirstAppDemo.Models; utilizando System.Collections.Generic; utilizando System.Linq; espacio de nombres FirstAppDemo.Controllers {HomeController de class publica: Controlador {Índice ViewResult publico () {modelo var = nuevo HomePageViewModel usando (var context = new FirstAppDemoDbContext ()) {SQLEmployeeData sqlData = new SQLEmployeeData (contexto); model.Employees = sqlData.GetAll } return View (modelo); }} class publica SQLEmployeeData {private FirstAppDemoDbContext _context {get; juntos; } public SQLEmployeeData (contexto FirstAppDemoDbContext) {_context = contexto; } public void Add (Empleado emp) {_context.Add (emp); _context.SaveChanges } Public Employee Get (ID int) {return _context.Employees.FirstOrDefault (e => e.Id == ID); } public IEnumerable GetAll () {return _con text.Employees.ToList }} Public class HomePageViewModel {publico IEnumerable Empleados {get; juntos; }}}
En la class SQLEmployeeData anterior, puede ver que hemos definido el metodo Add que agregara un nuevo objeto de empleado al contexto y luego guardara los cambios. En el metodo Get, devolvera un empleado segun su ID. Mientras que, en el metodo GetAll, devolvera la lista de todos los empleados en la base de data.
Configuracion de los servicios de Entity Framework
Para tener un Entity Framework DBContext utilizable, necesitamos cambiar la configuracion del'solicitud. Necesitaremos agregar una cadena de conexion para que nuestro DBContext sepa a que servidor ir y que base de data consultar.
-
Pondremos la cadena de conexion en un archivo de configuracion JSON.
-
Tambien necesitamos agregar algunos servicios adicionales durante el metodo ConfigureServices de la class Startup.
-
Entity Framework, al igual que ASP.NET y MVC, Entity Framework se basa en la inyeccion de dependencias y, para que la inyeccion funcione, El tiempo de ejecucion debe conocer los diferentes servicios que utiliza Entity Framework.
-
Existe una API de configuracion simple que agregara todos los servicios predeterminados que necesitamos.
Vayamos al archivo AppSettings.json y agreguemos la cadena de conexion como se muestra en el siguiente programa.
{ "mensaje ": "¡Hola, mundo! cEl mensaje proviene del archivo de configuracion ... ", " database ": {" conexion ": " Data Source = (localdb) mssqllocaldb; Initial Catalog = F irstAppDemo "}}
Ahora pasemos a la class de inicio donde necesitamos agregar algunos servicios adicionales para que Entity Framework funcione correctamente. Especificamente, hay tres cosas que debemos hacer, que son relacionado con Entity Framework:
-
Necesitamos agregar los servicios basicos de Entity Framework.
-
Tambien necesitamos agregar el servidor SQL de los servicios de Entity Framework relacionados.
-
Necesitamos informar a Entity Framework sobre nuestro DBContext.
Todo esto se puede hacer mediante metodos que estan disponibles como metodos de extension en IServiceCollection como se muestra en el siguiente programa.
public void ConfigureServices (servicios IServiceCollection) {servicios. AddMvc services.AddEntityFramework () .AddSqlServer () .AddDbContext (opcion => opcion.UseSqlServer (Configuracion [ "base de data: conexion "])); }
-
El primer metodo es AddEntityFramework . Esto agregara los servicios basicos de Entity Framework, los servicios predeterminados.
-
Pero dado que Entity Framework ahora esta disenado para trabajar con diferentes tipos de bases de data, incluidas bases de data no relacionales, debemos hacer una segunda llamada para informar Entity Framework para agregar sus servicios predeterminados relacionados con SQL Server.
-
Luego, tambien debemos informar a Entity Framework sobre mi DBContext para que podamos construir instancias de esta class de manera apropiada y podemos hacerlo a traves de un tercer metodo, el metodo AddDbContext .
-
Esto tomamos un parametro de tipo generico donde especificamos el tipo de claveAsse derivado de DBContext, el FirstAppDemoDbContext.
-
En el AddDbContext, necesitamos describir las opciones para nuestro DBContext.
-
Esto se puede hacer mediante una expresion lambda ; es una accion en la que recibimos un parametro de opcion y Entity Framework puede admitir diferentes bases de data. Todo lo que tenemos que hacer es decirle a Entity Framework que este DBContext en particular va a UseSqlServer.
-
Este metodo requiere un parametro que es connectionString para usar.
La siguiente es la implementacion completa del archivo Startup.cs .
usando Microsoft.AspNet.Mvc; utilizando FirstAppDemo.ViewModels; utilizando los servicios de Fi rstAppDemo.Services; utilizando FirstAppDemo.Entities; utilizando FirstAppDemo.Models; utilizando System.Collections.Generic; utilizando System.Linq; espacio de nombres FirstAppDemo.Controllers {class publique HomeController: Controller {Public ViewResult Index () {var employee = new Employee {Id = 1, Name = "Mark Upston1 "}; usando (var context = new FirstAppDemoDbContext ()) {SQLEmployeeData sqlData = new SQLEmployeeData (contexto); sqlData.Add (empleado); } // var empleado = nuevo empleado {ID = 1, Nombre = "Mark Upston "}; Vista posterior (empleado); }} class publica SQLEmployeeData {FirstAppDemoDbContext privado _context {get; juntos; } public SQLEmployeeData (contexto FirstAppDemoDbContext) {_context = contexto; } public void Add (Empleado emp) {_context.Add (emp); _context.SaveChanges } Public Employee Get (ID int) {return _context.Employees.FirstOrDefault (e => e.Id == ID); } public IEnumerable GetAll () {return _context.Employees.ToList }}}
Ahora necesitamos configurar la base de data. Una forma de configurar una base de data es usar Entity Framework para crear la base de data y es un proceso de dos pasos-
El primer paso
Esto implica lo siguiente -
-
Agregar el codigo de migracion a nuestro proyecto.
-
El codigo de migracion es el codigo C # . Esto se puede hacer para crear una base de data en un esquema de base de data.
-
Entity Framework puede generar este codigo de migracion para nosotros.
-
Entity Framework examina la base de data y nuestros modelos y determina los cambios de esquema necesarios para que la aplicacion funcione.
-
Entonces, cuando agregamos modelos adicionales o hacemos cambios a modelos existentes, como la class Empleado, podemos seguir agregando migraciones a nuestro proyecto y mantener nuestro esquema. base de data sincronizada.
El segundo paso
Esto implica lo siguiente:
-
Aqui tenemos que aplicar explicitamente estas migraciones para actualizaractualizar una base de data.
-
Ambas tareas se pueden realizar usando unos simples comandos desde una ventana de consola.
-
Hemos creado project.json.
-
Es por esto que creamos project.json para agregar un comando donde "ef" corresponde a EntityFramework.Commands.
Vamos a abrir el simbolo del sistema del desarrollador para Visual Studio para ejecutar los comandos que necesitamos para agregar las migraciones y aplicar las migraciones. La forma mas sencilla de hacer esto es ir al directorio raiz de la aplicacion.
Si estas en la carpeta que contiene el archivo project.json, estas en la carpeta correcta. Aqui necesitamos ejecutar un comando llamado dnvm. Es el administrador de versiones de .NET el que le dira al sistema que tiempo de ejecucion queremos usar.
Ahora usemos el siguiente comando.
lista dnvm
Ustedvera la siguiente salida cuando presione enter.
Tenemos que decirle al dnvm que queremos usar los entornos de ejecucion especificos. Esto nos dara acceso al comando dotnet o al comando dnx que queremos ejecutar.
Ejecute el siguiente comando.
dnvm use1.0.0 -rc1-update1 -p
Presione Entrar.
dnvm configurara nuestra ruta y las variables de entorno para incluir un directorio bin que nos dara acceso a esta utilidad dnx. Ejecutemos el comando dnx ef .
Esto es NET, usando dnx podemos invocar los comandos que enumeramos en nuestro archivo project.json. La ejecucion de estos comandos es generalmente muy sencilla. Cuando escribe dnx ef, aparece una pantalla de ayuda. No es necesario que recuerde todas las opciones. Puede ver los comandos disponibles en los comandos de Entity Framework y hay algunosa las tres.
Primero, debemos agregar la migracion para ejecutar el siguiente comando.
dnx ef migrations add v1
Presione Enter.
Entity Framework encontrara este contexto y examinara los modelos que estan alli. Sabra que no hay una migracion previa y por lo tanto, generara la primera migracion. Aqui, la v1 es la version 1 de la base de data. Creara una nueva carpeta en el Explorador de soluciones y generara codigo.
Una migracion es esencialmente codigo C # usado para generar comandos SQL para modificar el esquema en una base de data. Datos SQL.
usando System; usando System.Collections.Generic; usando Microsoft.Data.Entity.Migrations; usando Microsoft.Data.Entity.Metadata; espacio de nombres FirstAppDemo .Migrations {public parcial class v1: Migration {anulacion protegida anulacion arriba (MigrationBuilder migrationBuilder) {migrationBuilder.CreateTable (nombre: "Empleadoe ", columnas: table => new {Id = table.Column (nullable: false) .Annotation (" SqlServer: ValueGenerationStrategy ", SqlServerValueGenerationStrategy.IdentityColumn), Name = table.Column (nullable : true)}, restricciones: table => {table.PrimaryKey ( "PK_Employee ", x => x.Id);});} anulacion protegida void Down (MigrationBuilder migrationBuilder) {migrationBuilder.DropTable ( "Empleado ");}}}
Puede ver que esto creara una tabla llamada Empleados.
-
Esta tabla debe tener dos columnas - una ID, y una columna de Nombre.
-
Por convencion, cuando Entity Framewor k ve que tiene una propiedad llamada Id, hara esa propiedad o, mejor dicho , hara de esta columna una clave principal en la base de data.
-
Aqui usaremos SQL Server. Por defecto, Entity Framework lo convertira en una IdentityColumn, lo que significa que el servidor SQL generara los ID por nosotros.
AplicarColoca estos ID en una base de data escribiendo el comando " actualizacion de la base de data dnx ef ".
Puede ver que el comando aplico la migracion.
Ahora vayamos al Explorador de objetos de SQL Server y actualice la base de data, ahora puede ver que tenemos una base de data FirstAppDemo.
Tambien puede ver nuestra tabla Empleados e incluso podemos mirar las columnas de esta tabla donde la columna de ID es la clave principal.
Haga clic derecho en la tabla dbo.Employee y seleccione Mostrar data.
Antes inicie la aplicacion, agreguemos algunos data. Cuando lanzamos la aplicacion, deberiamos ver algunos data de la base de data.
Agreguemos algunas lineas de data aqui.
Ahora actualice el archivo index.cshtml. Muestra todos los data como una tabla.
@model FirstAppDemo.Controllers.HomePageViewModel Inicio ¡Bienvenido!
@foreach (empleado var en Model.Employees) { @ Html.ActionLink (employee.Id.ToString (), "Detalles ", nuevo {id = employee.Id}) | @ employee.Name |
}
Una vez que se ejecuta la aplicacion, deberia producir el siguiente resultado.
ASP.NET Core - Vistas de diseno de Razor
En este capitulo vamos a entender las vistas de diseno de Razor. La mayoria de los sitios web y aplicaciones web querran crear paginas con algunos elementos comunes.
-
Por lo general, tiene un area superior en cada pagina donde muestra un logotipo y un menu de navegacion.
-
Tambien podria tener una barra lateral con enlaces e informacion adicionales y probablemente un pie de pagina en la parte inferior de la pagina con contenido.
-
Cada pagina de la aplicacion querra tener estos factores comunes. Aqui usamos la vista Diseno.en la pagina para evitar la duplicacion de factores en cada pagina que escribimos.
Vista de diseno
Ahora veamos que es una vista de diseno.
-
Una vista de diseno es una vista de Razor con una extension * .cshtml . Tiene la opcion de nombrar una vista de diseno como desee. En este capitulo usaremos una vista de diseno con el nombre _Layout.cshtml.
-
Este es un nombre comun para una vista de diseno. en la pagina, y no se requiere el guion bajo inicial. Esta es simplemente una convencion que siguen muchos desarrolladores para identificar una vista que no es una vista; renderiza esto como resultado de la vista de una accion del controlador.
-
Este es un tipo especial de vista, pero una vez que tenemos una vista de diseno, podemos configurar nuestras vistas de controlador como la vista de indice del pagina de inicio.
-
Nosotrospuede configurar esta vista para que se muestre en la vista Diseno en una ubicacion especifica.
-
Este enfoque de la vista Diseno significa que el Index.cshtml no necesita saber nada sobre el logotipo o la navegacion de nivel superior.
-
La vista de indice solo debe hacer que el contenido sea especifico para el modelo que la accion del controlador le da a esa vista y la vista de diseno se encarga de todo. descanso.
Ejemplo
Tomemos un ejemplo simple.
Si tiene varias vistas, vera que todas las vistas contendran una cierta cantidad de marcado duplicado. Todos tendran una etiqueta HTML de apertura, una etiqueta de encabezado y una etiqueta de cuerpo .
Aunque no tenemos un menu de navegacion en esta aplicacion, existe una buena posibilidad de que en una aplicacion real tambien este disponible y no queremos duplicar este marcado en todos losver.
Creemos una vista de diseno y agreguemos la vista de diseno a una nueva carpeta denominada Compartida en la carpeta Vistas . Esta es una carpeta convencional conocida por el marco MVC. Sabe que las vistas internas pueden ser utilizadas por varios controladores en la aplicacion. Haga clic derecho en la carpeta compartida y seleccione Agregar → Nuevo elemento.
En el panel central, seleccione la pagina de Presentacion de la vista MVC. El nombre predeterminado aqui es _Layout.cshtml. Elija la vista Diseno que desea usar cuando el tiempo de ejecucion se basa en el usuario. Ahora haga clic en el boton Agregar. Esto es lo que obtendra de forma predeterminada para su nueva vista Diseno.
Queremos que la vista Layout se encargue de gestionar la cabeza y el cuerpo. Ahora, dado que esta vista esta en una vista Razor, podemos usar expresiones C #. Siempre podemos agregar texto literal. Tenemos muchoagregando un
< DOCTYPE span> < name = "viewport " content = "width = device width " /> @ ViewBag.Title @ DateTime.Now @RenderBody ()
En el codigo anterior, vera expresiones como RenderBody y ViewBag.Title . Cuando una accion del controlador MVC representa la vista de indice, y con ella se involucra una pagina de diseno; luego, la vista de indice y el HTML que produce se colocaran en la vista de indice.
Aqui es donde existe la llamada al metodo RenderBody. Podemos esperar que todas las vistas de contenido de nuestra aplicacion aparezcan dentro del
La otra expresion dentro de este archivo es ViewBag.Title. ViewBag es una estructura de data que se puede agregar a cualquier propiedad y cualquier dato que deseeez en ViewBag. Podemos agregar un ViewBag.Title, ViewBag.CurrentDate o cualquier propiedad que queramos en el ViewBag.
Ahora vayamos al archivo index.cshtml.
@model FirstAppDemo.Controllers.HomePageViewModel Inicio ¡Bienvenido!
@foreach (empleado var en Model.Employees) { @ Html.ActionLink (employee.Id.ToString () , "Detalles ", nuevo {id = employee.Id}) | @ employee.Name |
}
Quitar marcado que ya no necesitamos en la vista de indice. Por lo tanto, podemos eliminar cosas como la etiqueta HTML y la etiqueta head. Tampoco necesitamos el elemento de cuerpo de apertura. o cerrando etiquetas como se muestra en el siguiente programa.
@model FirstAppDemo.Controllers.HomePageViewModel @ {ViewBag.Title = "Iniciol Layout = "~ / Views / Shared / _Layout.cshtml}
¡Bienvenido!
@foreach (empleado var en Model.Employees) { @ Html.ActionLink (empleado .Id.ToString (), "Detalles ", nuevo {id = employee.Id}) | @ employee.Name |
}
Todavia tenemos que hacer dos cosas:
-
Primero, debemos decirle al marco MVC que queremos usar la vista Diseno. pagina desde esta vista.
-
En segundo lugar, debemos establecer el titulo apropiado agregando informacion en el ViewBag como se muestra en el codigo anterior.
Guardemos todos los archivos y ejecutemos la aplicacion. Una vez iniciada la aplicacion, vera la siguiente pagina de bienvenida.
ASP.NET Core - Iniciando Razor View
En este capitulo hemos iniciado Razor View. Razor View Engine en MVC tiene una convencion donde buscara cualquier archivo con el nombre _ViewStart.cshtml y ejecutara el codigo dentro de ese archivo. antes de ejecutar el codigo en una vista individual.
-
El codigo dentro del archivo ViewStart no se puede mostrar en la salida HTML de una pagina, pero se puede usar para eliminar codigo duplicado de bloques de codigo para dentro de las vistas individuales.
-
En nuestro ejemplo, si queremos que cada vista use la vista Diseno que creamos en el ultimo capitulo, podriamos poner el codigo para definir la vista Diseno en un ViewStart en lugar de tener el codigo en cada vista.
Ejemplo
Tomemos un ejemplo es sencillo ver como funciona. En nuestra aplicacion, no queremos que cada vista especifique que su vista de diseno es _Layout.cshtml . Asi que haga clic derecho en la carpeta Vistas y seleccione Agregar → Nuevo elemento .
Hay una plantilla especifica en ASP.NET MVC para una pagina ViewStart, luego seleccione MVC View Start Page en el panel central. La parte mas importante aqui es que este archivo se llama _ViewStart.cshtml . Ahora haga clic en el boton Agregar.
El uso principal de un archivo ViewStart es definir la vista Layout.
Ahora pasemos a dex.cshtml y corte la linea de diseno, luego agreguela al archivo ViewStart como se muestra en el siguiente programa.
@ {Layout = "~ / Views / Shared /_Layout.cshtml}
-
Cuando el marco MVC va a renderizar una vista, vera si hay un archivo ViewStart en algun lugar de la jerarquia de carpetas.
-
Hemos colocado _ViewStart directamente en nuestra carpeta Vistas. Esto afectara a todas las vistas de todas las carpetas que se encuentran en la carpeta Vistas, asi como a las vistas en la carpeta Inicio, asi como a la carpeta Compartida, asi como a todas las demasossiers controladores que podemos agregar en el futuro.
-
Si tomamos ViewStart y lo colocamos solo en la carpeta Inicio, este pequeno codigo solo se ejecutara cuando rendericemos una de esas vistas en la carpeta Inicio .
-
Incluso podemos tener varios archivos ViewStart, por lo que podriamos tener un ViewStart.cshtml aqui en la carpeta Vistas que define la vista Diseno para todas las vistas.
-
Pero si quisieramos cambiar este valor predeterminado para todas las vistas solo en la carpeta Inicio, podriamos tener otro ViewStart en la carpeta Inicio que establezca el diseno en otra cosa .
Hagamos una copia de seguridad de todos los archivos y ejecutemos la aplicacion.
Vera que su pagina de inicio se ve exactamente como antes, y todavia tenemos la vista Diseno en efecto.
ASP.NET Core - Importacion de la vista Razor
En este capitulo tenemos la vista Razor'importar. Ademas del archivo ViewStart, tambien hay un archivo ViewImports que el marco MVC buscara al representar una vista.
Al igual que el archivo ViewStart, podemos eliminar ViewImports.cshtml en una carpeta, y el archivo ViewImports puede influir en todas las vistas en la jerarquia de carpetas
-
Esta vista es nueva para esta version de MVC, en la version anterior de MVC podriamos usar una Archivo de configuracion XML para configurar ciertos aspectos del motor de vista de Razor.
-
Estos archivos XML ya no estan y estamos usando codigo en su lugar.
-
El archivo ViewImports es un lugar donde podemos escribir codigo y colocar directivas comunes para extraer los espacios de nombres que necesitan nuestras vistas.
-
Si hay espacios de nombres que usamos comunmente en nuestras vistas, es posible que aparezcan directivas de uso una vez ennuestro archivo ViewImports en lugar de tener directivas de uso en cada vista o escriba en el espacio de nombres completo de una class.
Ejemplo
Tomemos un ejemplo simple para ver como mover nuestras directivas using a ViewImports . En la vista de indice, tenemos una directiva using para introducir el espacio de nombres FirstAppDemo.Controllers como se muestra en el siguiente programa.
@using FirstAppDemo.Controllers @model HomePageViewModel @ {ViewBag.Title = "Home}
¡Bienvenido!
@foreach (employee var en Model.Employees) { @ Html.ActionLink (employee.Id.ToString (), "Detalles ", nuevo {id = employee.Id}) | @employee. Nombre |
}
El uso de directivas permitira que el codigo generado desde la vista de Razor se compile correctamente. use directivas , el compilador de C # no puedeNo podremos encontrar este tipo de empleado. Para ver el tipo de empleado, eliminemos la directiva using del archivo Index.cshtml .
@model HomePageViewModel @ {ViewBag.Title = "Home}
¡Bienvenido!
@foreach (empleado var en Model.Employees) { @ Html.ActionLink (employee.Id.ToString (), "Detalles ", nuevo {id = employee.Id}) | @ employee.Name |
}
Ahora ejecute la aplicacion.
Vera uno de los errores que indica que el tipo o espacio de nombres HomePageViewModel no se pudo encontrar. Esto puede deberse a que varias de sus vistas requieren la misma directiva using . Por lo tanto, en lugar de ponerla en cada vista, creemos una importacion de vista en la carpeta Las vistas agregaran declaraciones de uso a cada vista con solo hacer clic con el boton derecho en la carpeta Vistas y seleccionar Agregar → Nuevo elemento.
< origen de data-srcset="https://www.hebergementwebs.com/image/55/55c5c254a6d1ac79ee6bb5f98bf8bcc2.webp/aspid-net-core-guia-rapidaaspid-net-core-guia-rapida-388.webp"type = "image/webp"media = " (min-width : 800px) ">
En el panel central, seleccione la pagina MVC View Imports.el nombre predeterminado es _ViewImports.cshtml. Al igual que ViewStart, no podemos usar este archivo para renderizar HTML, asi que hagamos clic en el boton Agregar.
Ahora agregue la directiva using en t sound en el archivo _ViewImports.cshtml como se muestra a continuacion.
@ usando FirstAppDemo.Controllers
Ahora todas las vistas que aparecen en esta carpeta o cualquier subcarpeta podran usar tipos de FirstAppDemo.Controllers sin especificar esa instruccion using exacta. Ejecutemos en nueva su aplicacion y vera que la vista esta funcionando ahora.
ASP.NET Core - Asistentes de etiquetas de Razor
Los asistentes de etiquetas permitir que el codigo del lado del servidor participe en la creacion y representacion de elementos HTML en Razor Files. Los asistentes de etiquetas son una nueva caracteristica similar a los asistentes de HTML, que nos ayudan a representar HTML.
-
Hay muchos asistentes de etiquetas integradosres para tareas comunes, como crear formularios, enlaces, cargar elementos, etc. Los asistentes de etiquetas se crean en C # y apuntan a elementos HTML segun el nombre del elemento, el nombre del atributo o la etiqueta principal.
-
Por ejemplo, el LabelTagHelper integrado puede apuntar al elemento HTML
-
Si esta familiarizado con HTML Helpers, Tag Helpers reducen las transiciones explicitas entre HTML y C # en las vistas de Razor.
Para usar Tag Helpers, necesitamos instalar una biblioteca NuGet y tambien agregar una directiva addTagHelper a las vistas que usan estos tag helpers. Haga clic derecho en su proyecto en el Explorador de soluciones y seleccione Administrar paquetes NuGet ....
Busque Microsoft.AspNet.Mvc.TagHelpers y haga clic en el boton Instalar.
Recibira el siguiente cuadro de dialogo Vista previa.
Haga clic en el boton Aceptar.
Haga clic en el boton Acepto . Una vez que Microsoft.AspNet.Mvc.TagHelpers este instalado, navegue hasta el archivo project.json.
{ "version ": "1.0.0 - * ", "compilationOptions ": { "emitEntryPoint ": true}, "dependencias ": {" Microsoft.AspNet.Mvc ": " 6.0.0-rc1-final ", " Microsoft .AspNet.Diagnostics ": " 1.0.0-rc1-final ", " Microsoft.AspNet.IISPlatformHandler ": " 1.0.0-rc1-final ", " Microsoft.AspNet.Server.Kestrel ": " 1.0.0-rc1-final ", " Microsoft.AspNet. StaticFiles ": " 1.0.0-rc1-final ", " EntityFramework.MicrosoftSqlServer ": " 7.0.0 -rc1-final ", " EntityFramework.Commands ": " 7.0.0- rc1-final ", " Microsoft.AspNet.Mvc.TagHelpers ": " 6.0.0-rc1-final "}, " comandos ": {" web ": " Microsoft.AspNet. Server.Kestrel ", " ef ": " EntityFramework.Commands "}, " frameworks ": {" dnx451 ": {}, " dnxcore50 ": {}}, " excluir ": [" www root ", " node_modules "], " publishExclude ": [" **. usuario ", " **. vspscc "]}
En la seccion de dependencias, vera que " Microsoft.AspNet.Mvc.TagHelpers ": " 6.0.0-rc1-final " se agrega.
-
Ahora cualquiera puede crear un asistente de etiquetas, asi que si estas pensando en un asistente de etiquetas, tienes necesita, puede escribir su propio asistente de etiquetas.
-
Puede colocarlo directamente en el proyecto de su aplicacion, pero debe informar al motor de vista de Razor. asistente de etiquetas.
-
De forma predeterminada, el cliente no los renderiza simplemente, aunque estos asistentes de etiquetas parecen combinarse con el HTML.
-
Razor llamara al codigo para procesar una etiqueta auxiliar; puede eliminarse de HTML y tambien puede agregar HTML adicional.
-
hay muchas cosas maravillosas que puedes hacer con un asasistente de etiquetas, pero debe registrar sus asistentes de etiquetas con Razor, incluso los asistentes de etiquetas de Microsoft, para que Razor detecte estas etiquetas en el marcado y pueda llamar al codigo que procesa el asistente de etiquetas .
-
La directiva para hacer esto es addTagHelper, y puede ponerlo en una vista individual, o si planea usar ayudantes de etiquetas en toda la aplicacion , puede usar addTagHelper en el archivo ViewImports como se muestra a continuacion.
@using FirstAppDemo.Controllers @addTagHelper "*, Microsoft.AspNet.Mvc.TagHelpers
La sintaxis para registrar todos los asistentes de etiquetas que estan en un ensamblado es usar una coma asterisco (*,) y luego el nombre del ensamblado, Microsoft.AspNet.Mvc.TagHelpers . Debido a que el primer elemento aqui es un nombre de tipo, aqui es donde podriamos enumerar un culoHay una etiqueta especifica si solo desea usar una.
Pero si solo quisiera tomar todos los ayudantes de etiquetas que estan en eso, puede usar el asterisco (*) . Hay muchos asistentes de etiquetas disponibles en la biblioteca de ayuda de etiquetas. Echemos un vistazo a la vista de indice.
@model HomePageViewModel @ {ViewBag.Title = "Home}
¡Bienvenido!
@foreach (empleado var en Model.Employees) { @ Html.ActionLink (employee.Id.ToString (), "Detalles ", nuevo {id = employee.Id}) | @ employee.Name |
}
Ya tenemos un ayudante HTML que usa ActionLink para generar una etiqueta de anclaje que apuntara a una URL que nos permita 'Acceda a los detalles del empleado.
Primero agreguemos la accion Detalles en el controlador domestico como se muestra en el siguiente programa.
public IActionResult Details (int id) {var context = new FirstAppDemoDbContext SQLEmployeeData sqlData = new SQLEmployeeData (context); var model = sqlData.Get (id); if (model == null) {return RedirectToAction ( "Index ");} return View (model);}
Ahora necesitamos agregar una vista para la accion de Detalles. Creemos una nueva vista en la carpeta Vistas → Inicio y llamemosla Detalles .cshtml y agregue el siguiente codigo.
@model FirstAppDemo.Models.Employee @ Model.Name @ Model.Name
Id: @ Model.Id @ Html.ActionLink ( "Inicio ", "Índice " )
Ahora iniciemos la aplicacion.
Cuando haga clic en la identificacion de un empleado, lo llevara a la vista de detalles.
Hagamos clic en la primera identificacion de empleado.
Ahora, para usar la etiqueta auxiliar para esto, agreguemos la siguiente linea al archivo index.cshtml y eliminemos el ayudante HTML.
Detalles
asp-action = "Detalles es el nombre de la accion a la que queremos llegar. Si hay un parametro que desea pasar, puede usar el asistente de etiquetas asp-route y aqui queremos incluir el ID como parametro para que podamos usar el asistente de etiquetas asp-route-Id.
Aqui esta la implementacion completa del archivo index.cshtml.
@model HomePageViewModel @ {ViewBag.Title = "Home}
¡Bienvenido!
@foreach (empleado var en Model.Employees) { Detalles | @ employee.Name |
}
Permitanos ejecutar su aplicacion nuevamente. Despues de ejecutar la aplicacion, vera la siguiente pagina.
Anteriormente mostramos la ID como el texto del enlace, pero ahora mostramosel texto de Detalles. Ahora hacemos clic en los detalles y creamos la URL correcta usando ayudantes de etiquetas en lugar de ayudantes de HTML.
Ya sea que elija utilizar ayudantes HTML o ayudantes de etiquetas , es realmente una cuestion de preferencia personal. Muchos desarrolladores encuentran que los ayudantes Las etiquetas son mas faciles de crear y mantener.
ASP.NET Core - Formulario de edicion de Razor
En este capitulo, continuaremos discutiendo los asistentes de etiquetas. Tambien agregaremos una nueva caracteristica en nuestra aplicacion y le dara la capacidad de editar los detalles de un empleado existente. Comenzaremos agregando un enlace en el costado de cada empleado que ira a una accion de Editar en el HomeController.
@model HomePageViewModel @ {ViewBag.Title = "Home}
¡Bienvenido!
@foreach (empleado var en Model.Employees) { @ empleado.Nombre | Detalles Editar |
}
Aun no tenemos la accion Editar, pero necesitaremos una identificacion de empleado que podamos editar. Comencemos por crear una nueva vista haciendo clic derecho en la carpeta Vistas → Inicio y seleccionando Agregar → Nuevos elementos .
En el panel central, seleccione la pagina de vista MVC; llame Pagina Edit.cshtml. Ahora haga clic en el boton Agregar.
Agregue el siguiente codigo al archivo Edit.cshtml .
@model Employee @ {ViewBag.Title = $ " Editar {Model.Name}}
Editar @ Model.Name
Para el titulo de esta pagina, podemos decir quedesea editar y luego proporcione el nombre del empleado.
-
El signo de dolar delante de Modificar permitira que el tiempo de ejecucion reemplace Model.Name con un valor que este en esta propiedad como el nombre del empleado.
-
Dentro de la etiqueta de formulario, podemos usar la etiqueta de ayuda como asp-action y asp-controller. para que cuando el usuario envie este formulario, vaya directamente a una accion especifica del controlador.
-
En este caso, queremos ir a la accion Editar en el mismo controlador y queremos decir explicitamente que para el metodo en este formulario debe usar un HttpPost .
-
El metodo predeterminado para un formulario es GET, y no queremos editar a un empleado mediante una operacion GET.
-
En la etiqueta de etiqueta, usamos el asistente de etiqueta asp-for que indica que esta es una etiqueta para la propiedadTee Nombre del modelo. Este asistente de etiquetas puede configurar el atributo Html.For para que tenga el valor correcto y establecer el texto interno de esta etiqueta para mostrar realmente lo que queremos, como el nombre de la etiqueta. empleado.
Vayamos a la class HomeController y agreguemos la accion Editar que devuelve la vista que le da al usuario un formulario para editar un empleado, entonces necesitaremos una segunda accion de edicion que respondera a un HttpPost como se muestra a continuacion.
[HttpGet] Public IActionResult Edit (int id) {var context = new FirstAppDemoDbContext SQLEmployeeData sqlData = new SQLEmployeeData (contexto); var modelo = sqlData.Get (id); if (modelo == null) {return RedirectToAction ( "Index "); } return View (modelo); }
Primero, necesitamos una accion de edicion que responda a una solicitud GET. Necesitara una identificacion de empleado. El codigo aqui sera similar acodigo que tenemos en la accion Detalles. Primero extraeremos los data del empleado que el usuario quiere modificar. Tambien debemos asegurarnos de que el empleado realmente exista. Si no existe, redirigiremos al usuario a la vista de indice. Pero cuando existe un empleado, renderizaremos la vista Editar.
Tambien debemos responder al HttpPost que enviara el formulario.
Agreguemos una nueva class en HomeController .cs como se muestra en el siguiente programa.
public class EmployeeEditViewModel {[Required, MaxLength (80)] public string Name {get; juntos; }}
En la accion de edicion que respondera al HttpPost se tomara un EmployeeEditViewModel, pero no un empleado en si, ya que solo queremos capturar los elementos que tienen forma en el archivo de edicion. cshtml.
La siguiente es la implementacion de la accion Editar.
[HttpPost]public IActionResult Edit (int id, entrada EmployeeEditViewModel) {var context = new FirstAppDemoDbContext SQLEmployeeData sqlData = new SQLEmployeeData (contexto); empleado var = sqlData.Get (id); if (employee! = null && ModelState.IsValid) {employee.Name = input.Name; context.SaveChanges devuelve RedirectToAction ( "D etails ", new {id = employee.Id});} return View (employee);}
El formulario de edicion siempre debe entregarse desde una URL que tiene un identificador en la URL de acuerdo con nuestras reglas de enrutamiento, algo asi como / home / edit / 1 .
-
El formulario siempre se enviara a esta misma URL, /home/edit/1.
El marco MVC puede extraer este identificador de la URL y pasarlo como parametro.
-
Siempre debemos verificar si ModelState es valido y tambien asegurarnos de que este empleado este en la base de data y que no sea nulo antes de ir '' realizar una operacionactualizar en la base de data.
-
Si nada de esto es cierto, devolveremos una vista y permitiremos que el usuario vuelva a intentarlo. Aunque en una aplicacion real con usuarios concurrentes, si el empleado es nulo, alguien podria eliminar los detalles del empleado.
-
Si este empleado no existe, digale al usuario que el empleado no existe.
-
De lo contrario, compruebe que ModelSt se ha comido. Si ModelState no es valido, devuelve una vista. Esto corrige el cambio y hace que ModelState sea valido.
-
Copie el nombre de la plantilla de la vista de entrada al empleado extraido de la base de data y guarde los cambios. El metodo SaveChagnes () volcara todas estas modificaciones en la base de data.
La siguiente es la implementacion completa de HomeController.
usando Microsoft.AspNet.Mvc; utilizandot FirstAppDemo.ViewModels; utilizando FirstAppDemo.Services; utilizando FirstAppDemo.Entities; utilizando FirstAppDemo.Models; utilizando System.Collections.Generic; utilizando System.Linq; utilizando System.ComponentModel.DataAnnotations; espacio de nombres FirstAppDemo.Controllers {HomeController de class publica: Controlador {Índice ViewResult publico () {modelo var = nuevo HomePageViewModel usando (var context = new FirstAppDemoDbContext ()) {SQLEmployeeData sqlData = new SQLEmployeeData (contexto); model.Employees = sqlData.GetAll } return View (modelo); } detalles publi c IActionResult (int id) {var context = new FirstAppDemoDbContext SQLEmployeeData sqlData = new SQLEmployeeData (contexto); var model = sqlData.Get (id) if (model == null) {return RedirectToAction ( "Index "); } return View (modelo); } [HttpGet] edicion publica de IActionResult (int id) {var context = new FirstAppDemoDbContext SQLEmployeeData sqlData = new SQLEmployeeData (contexto); var modelo = sqlData.Get (id); si (modelo== null) {return RedirectToAction ( "Index "); } return View (modelo); } [HttpPost] Public IActionResult Edit (int id, entrada EmployeeEditViewModel) {var context = new FirstAppDemoDbContext SQLEmployeeData sqlData = new SQLEmployeeData (contexto); empleado var = sqlData.Get (id); if (employee! = null && ModelState.IsValid) {employee.Name = input.Name; context.SaveChanges return RedirectToAction ( "Detalles ", nuevo {id = employee.Id}); } return View (empleado); }} class publica SQLEmployeeData {FirstAppDemoDbContext privado _context {get; juntos; } public SQLEmployeeData (contexto FirstAppDemoDbContext) {_context = contexto; } public void Add (Empleado emp) {_context.Add (emp); _context.SaveChanges } Public Employee Get (ID int) {return _context.Employees.FirstOrDefault (e => e.Id == ID); } public IEnumerable GetAll () {return _context.Employees.ToList }} Public class HomePageViewModel {publico IEnumerable Empleados {get; juntos; }} public class EmployeeEditViewModel {[Requerido, MaxLength (80)] cadena publica Name {get; juntos; }}}
Compilemos el programa y ejecutemos la aplicacion.
Ahora tenemos un enlace de edicion disponible; Editemos los detalles de Josh haciendo clic en el enlace Editar.
Cambiemos el nombre a Josh Groban.
Haga clic en el boton Guardar.
Puedes ver que el nombre ha sido cambiado a Josh Groban como en la captura de pantalla anterior. Ahora hagamos clic en el enlace Inicio.
En la pagina de inicio, ahora vera el nombre actualizado.
ASP.NET Core - Descripcion general de la identidad
En este capitulo, tenemos brevemente el marco de identidad de ASP.NET Core. El marco de identidad de ASP.NET Core se utiliza para implementar la autenticacion mediante Hay muchas opciones para identificar a sus usuarios, incluida la autenticacion de Windows y todos los proveedores de identidad de terceros como Google, Microsoft, Facebook y GitHub, etc.
-
El marco de identidad es otra dependencia que agregaremos a nuestra aplicacion en el archivo project.js.
-
Este marco que permite agregar funcionalidad donde los usuarios pueden registrarse e iniciar sesion con una contrasena local.
-
El marco tambien admite la autenticacion en dos factores, proveedores de identidad de terceros y otras caracteristicas.
-
Nos centraremos en los escenarios en los que un usuario puede registrarse, iniciar sesion y cerrar sesion.
Para hacer esto, necesitamos crear una entidad de Usuario y esta class heredara de una class base en el marco de Identidad y la class base que dar a nuestras propiedades de usuario estandar como nombre de usuario y direccion de correo electronico.
-
Podemos incluir tantas propiedades adicionales como queramos en esta class para almacenar informacion sobre nuestrousuarios.
-
Necesitamos tomar esta class User y conectarla a una class UserStore proporcionada por Identity framework.
-
UserStore es la class con la que nuestro codigo hablara para crear usuarios y validar sus contrasenas.
-
En ultima instancia, un UserStore hablara con una base de data. El marco de identidad admite Entity Framework y todas las bases de data que pueden funcionar con Entity Framework.
-
Pero puede implementar su propia UserStore para trabajar con cualquier source de data.
-
Para trabajar correctamente con Entity Framework, nuestra class User tambien se conectara a una class IdentityDb.
-
Este es uno que usa un DBContext Entity Framework para hacer el trabajo real de la base de data.
-
Necesitaremos incluir este IdentityDb en nuestra aplicacion heredandode nuestra class DataContext existente de IdentityDb en lugar del DBContext de Entity Framework.
-
Estos son IdentityDb y UserStore que trabajan juntos para almacenar informacion del usuario y validar las contrasenas de los usuarios, contrasenas hash que se encuentran en la base de data.
Hay dos elementos de ASP.NET Core Identity Framework que necesitamos conocer
SignInManager
Es uno de los dos elementos del marco de identidad -
-
Como sugiere el nombre, SignInManager puede iniciar sesion como usuario una vez que hayamos validado la contrasena.
-
Tambien podemos use este administrador para desconectar a un usuario.
-
Con la autenticacion de formularios, la conexion y desconexion se realiza administrando una cookie.
-
Cuando le decimos al SignInManager que conecte a un usuario, el administrador emite un cookie al navegador del usuario, y el navegador enviara esta cookie en cada solicitud posterior. Esto nos ayuda a identificar a este usuario.
Identity Middleware
Este es el segundo elemento del marco -
-
Leer la cookie enviada por SignInManager e identificar al usuario, e Esto ocurre en el ultimo elemento del framework, el middleware de identidad.
-
Necesitaremos configurar este middleware en nuestra canalizacion de aplicaciones para procesar la cookie establecida por SignInManager. Tambien veremos otras caracteristicas de este middleware en los proximos capitulos.
ASP.NET Core - Atributo de autorizacion
En este capitulo, discutiremos el atributo de autorizacion. Hasta ahora, en nuestra aplicacion, hemos permitido que los usuarios anonimos hagan cualquier cosa. Pueden editar los detalles de los empleados y ver los detalles, pero no tenemos ningunotener la funcionalidad para crear un nuevo empleado. Primero agreguemos la funcionalidad de autoria, y luego restringiremos el acceso de los usuarios usando el atributo Authorize.
Necesitamos comenzar creando una nueva pagina de Vista MVC en la carpeta Vistas → Inicio y llamarla Create.cshtml y luego agregar el siguiente codigo.
@model Employee @ {ViewBag.Title = "Create}
Create
@using (Html.BeginForm ()) {@ Html.LabelFor (m => m.Name) @ Html.EditorFor (m => m.Name) @ Html.ValidationMessageFor (m => m.Name)} Ahora agregaremos el metodo d 'action en HomeController para POST y GET, como se muestra en el siguiente programa.
[HttpGet] public ViewResult Create () {return View } [HttpPost] public IActionResult Create (EmployeeEditViewModel model) {if (ModelState.IsValid) {var employee = new Employee employee.Name = model.Name; var context = new FirstAppDemoDbContext SQLEmployeeData sqlData = new SQLEmployeeData (contexto); sqlData.Add (empleado); return RedirectToAction ( "Detalles ", nuevo {id = employee.Id}); } return View }
Agreguemos un enlace a Crear vista en el archivo Index.cshtml como se muestra en el siguiente programa.
@model HomePageViewModel @ {ViewBag.Title = "Home}
¡Bienvenido!
@foreach (empleado var en Model.E empleados ) { @ employee.Name | Detalles Editar |
}
Create Ejecute la aplicacion; vera la siguiente pagina.
En el pagina de inicio, vera el enlace Crear. Cuando haga clic en el enlace Crear, lo llevara a la vista Crear.
Ingresa un nombre en el campo Nombre y haz clic enUtilice el boton Guardar.
Ahora vera la vista detallada del empleado recien agregado. Hagamos clic en el enlace Inicio.
En esta aplicacion, cada usuario puede crear, modificar un empleado y todos pueden ver la vista detallada. Queremos cambiar este comportamiento para que en el futuro, los usuarios anonimos solo puedan ver la lista de empleados en la pagina de inicio, pero cualquier otra accion requiere que el usuario se identifique e inicie sesion. Podemos hacer esto con Permitir atributo .
Usted puede colocar el atributo Authorize en un controlador o en acciones individuales dentro del controlador.
[Authorize] public class HomeController: Controller {//. ...}
-
Cuando colocamos el atributo Authorize en el controlador mismo, el atributo Authorize se aplica a todos acciones dentro.
-
El marco MVC nono permitira que una solicitud llegue a una accion protegida por este atributo a menos que el usuario pase una verificacion de autorizacion.
-
De forma predeterminada, si no utiliza ningun otro parametro, la unica verificacion que realizara el atributo Authorize es una verificacion para asegurarse de que el usuario esta conectado para que sepamos su identidad.
-
Pero puede utilizar parametros para especificar cualquier politica de permisos personalizada que desee.
-
Tambien hay un atributo AllowAnonymous . Este atributo es util cuando desea utilizar el atributo Permitir en un controlador para proteger todas las acciones internas, pero existe una accion unica o una o dos acciones que desea desproteger y permitir que los usuarios anonimos 'lograr esta accion especifica.
[AllowAnonymous] public ViewResult Index () {var model = new HomePageViewModel usando (var context = new FirstAppDemoDbContext ()) {SQLEmployeeData sqlData = new SQLEmployeeData (contexto); model.Employees = sqlData.GetAll } return View (modelo); }
Probemos estos atributos en nuestra aplicacion. En la aplicacion en ejecucion, un usuario anonimo puede editar a un empleado.
Queremos cambiar eso y obligar a los usuarios a iniciar sesion e iniciar sesion antes de que podamos editar un empleado. Ahora pasemos al HomeController. Aqui limitaremos el acceso a una o dos acciones. Siempre podemos establecer el atributo Authorize en las acciones especificas que queremos proteger. Tambien podemos establecer el atributo Authorize en el controlador en si mismo, y este atributo Authorize esta en el espacio de nombres Microsoft.AspNet.Authorization.
Ahora usaremos el atributo Authorize y obligaremos a los usuarios a iniciar sesion para ingresar este controlador a excepcion dela pagina de inicio como se muestra en el siguiente programa.
[Authorize] public class HomeController: Controller {[AllowAnonymous] public ViewResult Index () {var model = new HomeP ageViewModel usando (var context = new FirstAppDemoDbContext ()) {SQLEmployeeData sqlData = new SQLEmployeeData (contexto); model.Employees = sqlData.GetAll } return View (modelo); } Detalles publicos IActionResult (int id) {var context = new FirstAppDemoDbContext SQLEmployeeData sqlData = new SQLEmployeeData (contexto); var modelo = sqlData.Get (id); if (modelo == null) {return RedirectToAction ( "Index "); } return View (modelo); } [HttpGet] edicion publica de IActionResult (int id) {var context = new FirstAppDemoDbContext SQLEmployeeData sqlData = new SQLEmployeeData (contexto); var modelo = sqlData.Get (id); if (modelo == null) {return RedirectToAction ( "Index "); } return View (modelo); } [HttpPost] public IActionResult Edit (int id, entrada de EmployeeEditViewModel) {var context = new FirstAppDemoDbContext SQLEmployeeData sqlData = new SQLEmployeeData (contexto); empleado var = sqlData.Get (id); if (employee! = null && ModelState.IsValid) {employee.Name = input.Name; context.SaveChanges return RedirectToAction ( "Detalles ", nuevo {id = employee.Id}); } return View (empleado); } [HttpGet] Public ViewResult Create () {return View } [HttpPost] crear IActionResult publico (modelo EmployeeEditViewModel) {if (ModelState.IsValid) {var employee = new Employee empleado.Nombre = modelo.Nombre; var context = new FirstAppDemoDbContext SQLEmployeeData sqlData = new SQLEmployeeData (contexto); sqlData.Add (empleado); return RedirectToAction ( "Detalles ", nuevo {id = employee.Id}); } return View }}
La pagina de inicio o el archivo Index.cshtml que muestra la lista de empleados tiene el atributo AllowAnonymous . Ahora iniciemos su aplicacion.
Presione la tecla F12 que abrira las herramientasdesarrollo . Ahora vaya a la pestana Red .
Hay algunas cosas que queremos ver en las herramientas de desarrollo, para que podamos ver como funcionan las cosas . Cuando haga clic en el enlace Editar, vera una pagina en blanco.
Si mire las herramientas para desarrolladores, vera que el codigo de estado HTTP devuelto por el servidor era un codigo de estado 401 .
El codigo de estado 401 le dice al navegador que la solicitud no fue permitida porque no tenia credenciales validas. Esto nos dice que el atributo Authorize esta funcionando .
De manera similar, cuando haga clic en el enlace Crear en la pagina de inicio, vera el mismo error que se muestra en la siguiente captura de pantalla.
-
Aqui el problema es que el El usuario se queda en una pagina en blanco y, a menos que tenga abiertas las herramientas de desarrollo, es posible que no sepan que fueun problema de autenticacion.
-
Aqui es donde el marco de identidad puede intervenir y ayudar.
-
El marco de identidad puede detectar cuando un elemento de la aplicacion quiere devolver el codigo de estado 401 porque el usuario no esta autorizado para acceder a el, y el El marco de identidad puede convertir esto en una pagina de inicio de sesion y permitir que el usuario supere este problema.
-
Veremos como funciona eso una vez que hayamos instalado y configurado el marco de identidad.
-
Pero por ahora, podemos ver que el atributo Autorizar esta funcionando.
ASP.NET Core - Configuracion de identidad
En este capitulo instalaremos y configuraremos el marco de identidad, este que solo requiere un poco de trabajo. Si va a Visual Studio y crea una nueva aplicacion ASP.NET Core, y elige la plantilla de aplicacion web completa con autenticaciondefinido en cuentas de usuario individuales, este nuevo proyecto incluira todos los elementos del marco de identidad configurado para usted.
Empezamos con un proyecto vacio, ahora vamos a configurar el marco de identidad desde cero, que es una buena forma de conocer todas las partes del modelo de aplicacion completa, ya que puede resultar confuso si no ha revisado todos los codigos en detalle.
Para comenzar, necesitaremos instalar la dependencia, que es Microsoft.AspNet.Identity . Haremos esto instalando Microsoft.AspNet.Identity.EntityFramework , luego implementando el marco de identidad que funciona con Entity Framework.
-
Si tomamos una dependencia en Identity.EntityFramework, el paquete incluye el paquete Identity.
-
Si crea sus propios almacenes de data, solo puede trabajar con el Paquete de identidad.
-
Una vez que nuestro ddependencias instaladas, podemos crear una class de usuario cliente con toda la informacion que queremos almacenar sobre un usuario.
-
Para esta aplicacion, vamos a heredar de una class proporcionada por el marco de identidad y esta class nos dara todos los elementos esenciales como la propiedad de nombre de usuario y un lugar para almacenar el contrasenas hash.
-
Tambien necesitaremos modificar nuestra class FirstAppDemoDbContext para heredar f de la class IdentityDb de Identity Framework.
-
IdentityDb nos brinda todo lo que necesitamos para almacenar como informacion de usuario con Entity Framework. Una vez que hemos configurado una class de Usuario y un DBContext , necesitaremos configurar los servicios de identidad en la aplicacion con el Metodo ConfigureServices de la class Startup.
-
Al igual que cuando tuvimos que agregarservicios Para admitir el marco MVC, el marco de identidad necesita servicios agregados a la aplicacion para funcionar.
-
Estos servicios incluyen servicios como el servicio UserStore y el SignInManager .
-
Inyectaremos estos servicios en nuestro controlador para crear usuarios y emitir cookies en el momento apropiado.
-
Finalmente, durante el metodo de configuracion de inicio, necesitaremos agregar el middleware de identidad.
-
Este middleware no solo ayudara a convertir las cookies en una identidad de usuario, sino que tambien garantizara que el usuario no le haga ver una pagina. vacio con una respuesta 401.
Ahora sigamos los pasos a continuacion.
Paso 1 : necesitamos continuar agregando una dependencia en el marco de identidad. Agreguemos la dependencia Microsoft.AspNet.Identity.EntityFramework en el archivo project.json. Esto incluira anosotros los otros paquetes de identidad necesarios que necesitamos.
{ "version ": "1.0.0 - * ", "compilationOptions ": { "emitEntryPoint ": true}, " dependencias ": {" Microsoft.AspNet.Mvc ": " 6.0.0-rc1-final ", " Microsoft.AspNet.Diagnostics ": " 1.0.0-rc1-final ", "Microsoft.AspNet.IISPlatformHandler ": "1.0.0-rc1-final ", "Microsoft.AspNet.Server.Kestrel ": "1.0 .0-rc1-final ", "Microsoft.AspNet .StaticFiles ": " 1.0.0-rc1-final ", " EntityFramework.MicrosoftSqlServer ": " 7.0.0-rc1-final ", " EntityFramework.Commands ": " 7.0.0 -rc1-final ", " Microsoft.AspNet.Mvc.TagHelpers ": " 6.0.0-rc1-final ", " Microsoft.AspNet .Identity.EntityFramework ": " 3.0.0-rc1 -final "}, " comandos ": {" web ": " Microsoft.AspNet.Server.Kestrel ", " ef ": " EntityFramework.Commands "}, " frameworks ": {" dnx451 ": {}, " dnxcore50 ": {}}, " excluir ": [" wwwroot ", "node_modules "], " publishExclude ": [" **. usuario ", " **. vspscc "]}
Paso 2 - Guarde este archivo. Visual Studio restaura los paquetes y ahora podemos agregar nuestra class de usuario. Agreguemos la class de usuario haciendo clic con el boton directamente en la carpeta Modelos y seleccionando Agregar → Clase.
Llame a esta class de usuario y haga clic en el boton Agregar como en la captura de pantalla anterior En esta class puede agregar propiedades para contener toda la informacion que desee. desea almacenar en un usuario.
Paso 3 : Derivemos la class User de una class proporcionada por Identity Framework. Esta es la class IdentityUser que esta en el espacio de nombres Identity.EntityFramework.
usando Microsoft.AspNet.Identity.EntityFramework; usando system; usando System.Collections.Generic ; usando System.Linq; usando System.Threading.Tasks; espacio de nombres FirstAppDemo.Models {Public class User: IdentityUser {}}
Paso 4 : ahora vayamos a IdentityUser, pase el cursor sobre este simbolo y presione F12 para ver la vista de data de Visual Studio.
#region Assembly Microsoft.AspNet.Identity.EntityFramework, Version = 3.0.0.0, namespace Microsoft.AspNet.Identity.EntityFramework {public class IdentityUser: IdentityUser { public IdentityUser public IdentityUser (cadena de nombre de usuario); }}
Paso 5 : puede ver que IdentityUser se deriva de IdentityUser a partir de la cadena. Puede cambiar el tipo de clave principal derivando de IdentityUser y especificando nuestro parametro de tipo generico. Tambien puede almacenar cosas con una clave principal que idealmente es un valor entero.
Paso 6 - Ahora coloquemos el cursor en IdentityUser de la cadena y presionemos F12 nuevamente para ir a la vista de data.
Puedentaining ver toda la informacion relativa a un usuario por defecto. La informacion incluye lo siguiente:
-
Campos que no usaremos en esta aplicacion, pero que estan disponibles.
-
El marco de identidad puede rastrear el numero de intentos fallidos de inicio de sesion para un usuario en particular y puede bloquear esa cuenta durante un periodo de tiempo.
-
Campos para almacenar PasswordHash, PhoneNumber. Los dos campos importantes que usaremos son PasswordHash y UserName.
-
Tambien usaremos implicitamente la clave principal y la propiedad de ID de un usuario. Tambien puede utilizar esta propiedad si necesita buscar un usuario especifico.
Paso 7 : ahora debemos asegurarnos de que el usuario este incluido en nuestro DBContext. Entonces, abramos el FirstAppDemoDBContext quelo tenemos en nuestra aplicacion, y en lugar de derivarlo directamente de DBContext, que es la class base incorporada de Entity Framework, ahora necesitamos derivarlo de IdentityDbContext.
usando Microsoft.AspNet.Identity.EntityFramework; utilizando Microsoft.Data.Entity; espacio de nombres FirstAppDemo.Models {class publica FirstAppDemoDbContext: IdentityDbContext {publico DbSet Empleados {get; juntos; } override void OnConfiguring (DbContextOptionsBuilder optionsBuilder) {optionsBuilder.UseSqlServer ( "Data Source = (localdb) MSSQLLocalDB; Initial Catalog = FirstAppDemo; Integrated Security = True; Connect Timeout = 30; Encrypt = False; TrueServer; ApplicationFailnetWrite protegido = Falso ");}}}
Paso8:laclassIdentityDbContexttambienestaenelespaciodenombresMicrosoft.AspNet.Identity.EntityFrameworkypodemosespecificareltipodeusuarioque'elladebeTienda.Deestamanera,cualquiercampoadicionalqueagreguemosalaclassUsuarioingresaraalabasededata.
El IdentityDbContext proporciona DbSets adicionales, no solo para almacenar un usuario, sino tambien informacion sobre roles y reclamos de usuario.
Nuestra class de usuario ya esta lista. Nuestra class FirstAppDemoDbContext esta configurada para trabajar con el marco de identidad.
Ahora podemos ir a Configure y ConfigureServices para configurar el marco de identidad.
paso 9 : ahora comencemos con ConfigureServices . Ademas de nuestros servicios MVC y nuestros servicios de Entity Framework, necesitamos agregar nuestros servicios de identidad. Esto agregara todos los servicios en los que se basa el marco de identidad para hacer su trabajo.
public void ConfigureServices (IServiceCollection services) {services.AddMvc services.AddEntityFramework () .AddSqlServer () .AddDbContext (opcion => opcion.UseSqlServer (Configuracion [ "base de data: conexion "])); services.AddIdentity () .AddEntityFrameworkStores }
-
El metodo AddIdentity toma dos parametros de tipo generico: el tipo de entidad de usuario y el tipo de entidad de rol.
-
Los dos parametros de tipo generico son los tipos de nuestro usuario: la class de usuario que acabamos de crear y la class de rol con la que queremos trabajar. Ahora usaremos el IdentityRole incorporado. Esta class se encuentra en el espacio de nombres EntityFramework.
-
Cuando usamos Entity Framework con Identity, tambien necesitamos invocar un segundo metodo: AddEntityFrameworkStores.
-
El metodo AddEntityFrameworkStores confiadministrara servicios como UserStore, el servicio utilizado para crear usuarios y validar sus contrasenas.
Paso 10 - Las siguientes dos lineas son todo lo que necesitamos para configurar los servicios de la aplicacion.
services.AddIdentity () .AddEntityFrameworkStores
Paso 11 : tambien necesitamos agregar el middleware. La ubicacion donde insertamos el middleware es importante porque si insertamos el middleware demasiado tarde en la pip eline, nunca tendra la oportunidad de procesar una solicitud.
Y si necesitamos verificaciones de autorizacion en nuestros controladores MVC, necesitamos tener el middleware Identity insertado antes del marco MVC para asegurarnos de que las cookies y tambien los errores 401 se manejen con exito.
public void Configure (aplicacion IApplicationBuilder) {app.UseIISPlatformHandler app.UseDeveloperExceptionPage app.UseRuntimeInfoPage app.UseFileServer app.UseIdentity app.UseMvc (ConfigureRoute); app.Run ((context) => {var msg = Configuration [ "message"]; espera context.Response.WriteAsync (msg);}); }
Paso 12 : el lugar donde insertamos el middleware es donde agregaremos el middleware de identidad. La siguiente es la implementacion completa del archivo Startup.cs.
usando Microsoft.AspNet.Builder; utilizando Microsoft.AspNet.Hosting; utilizando Microsoft.AspNet.Http; utilizando Microsoft.Extensions.DependencyInjection; utilizando Microsoft.Extensions.Configuration; utilizando FirstAppDemo.Services; utilizando Microsoft.AspNet.Routing; usando el sistema; utilizando FirstAppDemo.Entities; utilizando Microsoft.Data.Entity; utilizando FirstAppDemo.Models; utilizando Microsoft.AspNet.Identity.EntityFramework; espacio de nombres FirstAppDemo {public cLass Startup {Public Startup () {var builder = new ConfigurationBuilder () .AddJsonFile ( "AppSettings.json "); Configuracion = constructor.Build } Configuracion de IConfiguration publica {get; juntos; } // Este metodo es llamado por el tiempo de ejecucion. // Utilice este metodo para agregar servicios al contenedor. // Para obtener mas informacion sobre la configuracion de su aplicacion, // visite http: //go.microsoft.com/fw/? LinkID "=398940public void ConfigureServices (IServiceCollection services) {services.AddMvc services.AddEntityFramework () .AddSqlServer () .AddDbContext (option => option.UseSqlServer (Configuration [ "database: connection "])); services.AddIdentity () .AddEntityFra meworkStores } // El tiempo de ejecucion llama a este metodo. // Utilice este metodo para configurar la canalizacion de solicitudes HTTP public void Configure (aplicacion IApplicationBuilder) {app.UseIISPlatformHandler app.UseDeveloperExceptionPage app.UseRuntimeInfoPage app.UseFileServer app.UseIdentity app.UseMvc (ConfigureRoute); app.Run ((context) => {var msg = Configuration [ "message"]; espera context.Response.WriteAsync (msg);}); } private void ConfigureRoute (IRouteBuilder routeBuilder) {// Inicio / Index routeBuilder.MapRoute ( "Default ", "{controller = Home} / {action = Index} / {id?} "); } // Punto de entrada de la aplicacion. public static void Main (string args) => WebApplication.Run (args); }}
Paso 13 : ahora avancemos construyendo la aplicacion. En el siguiente capitulo, necesitamos agregar otra migracion de Entity Framework para asegurarnos de que tenemos el esquema de identidad en nuestra base de data de SQL Server.
ASP.NET Core - Migraciones de identidad
En este capitulo, analizaremos la migracion de identidad. En ASP.NET Core MVC, la autenticacion y 'La identidad se configura en el archivo Startup.cs.
public void ConfigureServices (servicios IServiceCollection) {services.AddMvc services.AddEntityFramework () .AddSqlServer () .AddDbContext opcion. UseSqlServer (Configuracion [ "base de data: conexion "])); services.AddIdentity () .AddEntityFrameworkStores }
Siempre que realice un cambio en cualquiera de sus classs de entidad o realice un cambio en su class derivada de DBContext, es probable que deba crear una nueva migracion para aplicar a la base de data y sincronice el esquema con lo que esta en su codigo.
Este es el caso en nuestra aplicacion, ya que ahora derivamos nuestra class FirstAppDemoDbContext de la class IdentityDbContext, y contiene sus propios DbSets, y tambien creara un esquema para almacenar todosinformacion sobre las entidades que gestiona.
usando Microsoft.AspNet.Identity.EntityFramework; utilizando Microsoft.Data.Entity; espacio de nombres FirstAppDemo.Models {FirstAppDemoDbContext class publica: IdentityDbContext {DbSet publico Empleados {get; juntos; } override void OnConfiguring (DbContextOptionsBuilder optionsBuilder) {optionsBuilder.UseSqlServer ( "Data Source = (localdb) MSSQLLocalDB; Initial Catalog = FirstAppDemo; Integrated Security = True; Connect Timeout = 30; Encrypt = False; TrueServer; ApplicationFailnetWrite protegido = Falso ");}}}
Ahoraabramoselsimbolodelsistemayverifiquemosqueestamosenlaubicaciondondeestaelarchivoproject.jsonparanuestroproyecto.
Tambien podemos obtener comandos de Entity Framework escribiendo dnx ef .
Nuestro archivo project.json tiene una seccion que asigna esta palabra clave "ef" a los comandos EntityFramework.Commands.
"orders ": { "web ": "Microsoft.AspNet.Server.Kestrel ", "ef ": "EntityFramework. Comandos "}
Podemos agregar una migracion desde aqui. Tambien necesitamos darle un nombre a la migracion. Usemos v2 para la version 2 y presione enter.
Una vez que se complete la migracion, tendra un archivo v2 en su carpeta de migraciones.
Ahora queremos aplicar esta migracion a nuestra base de data ejecutando el comando "dnx ef database update.
Entity Framework vera que es necesario aplicar una migracion y ejecutara esta migracion.
Si ingresa al Explorador de objetos de SQL Server, vera la tabla de empleados que creamos anteriormente. Tambien vera tablas adicionales que necesitan almacenar usuarios, reclamaciones, roles y tablas de mapeo que corresponden a los usuarios con roles especificos.
Todas estas tablas estan vinculadas aentidades proporcionadas por el marco de identidad.
Echemos un vistazo a la tabla de usuarios .
Ahora puede ver que las columnas de la tabla AspNetUsers incluyen columnas para almacenar todas las propiedades que vimos en el usuario de identidad que heredamos, y sus campos como Nombre de usuario y PasswordHash. Entonces, uso algunos de los servicios de 'Identidad incorporada, ya que tambien contienen la capacidad de crear un usuario y validar la contrasena de un usuario.
ASP.NET Core - Registro de usuario
En En este capitulo discutiremos el registro de usuarios. Ahora tenemos una base de data en funcionamiento y es hora de comenzar a agregar algunas funcionalidades a la aplicacion. Tambien hemos configurado nuestra aplicacion y tenemos un esquema basico Ahora volvamos a la pagina de inicio de la aplicacion.
OuvAbra las herramientas de desarrollo presionando F12 y luego haga clic en el enlace Modificar. Anteriormente, cuando haciamos clic en el enlace Editar, el marco MVC detectaba la presencia del atributo Autorizar y devolvia un codigo de estado 401 porque el usuario no habia iniciado sesion.
Ahora vera que recibimos un mensaje en la pantalla del archivo de configuracion.
Ahora vayamos a las herramientas de desarrollo.
-
Vera que el navegador ha solicitado la pagina de edicion y el marco MVC ha decidido que el usuario no puede ver este recurso.
-
Entonces, en algun lugar del marco MVC, se genero un codigo de estado 401.
-
Ahora tenemos el middleware de Identity instalado, que examina este codigo de estado 401 que se enviara al usuario y lo reemplaza con un codigo de estado 302, que es un codigo de estado. estado de redireccionamiento.
-
El marco de identidad sabe que el usuariosateur tendra que intentar iniciar sesion antes de poder acceder a este recurso.
-
El marco de identidad nos dirigio a esta URL, como podemos ver en la barra de direcciones - / Cuenta / Iniciar sesion.
-
Este es un punto final configurable con el marco de identidad, dentro del inicio cuando registra estos servicios y middleware. Hay diferentes opciones que puede configurar y una de las opciones es cambiar la URL de inicio de sesion.
-
De forma predeterminada, la URL sera / Cuenta / Iniciar sesion. Actualmente no tenemos un controlador de cuenta, por lo que al final del dia queremos crear un controlador de cuenta y permitir que un usuario inicie sesion.
-
Pero antes de que los usuarios puedan iniciar sesion, deberan registrarse en el sitio y registrar sus nombres de usuario y contrasenas.
-
Las funciones de inicio de sesion y registro pueden hacerparte de un controlador de cuenta.
Ahora sigamos y agreguemos una nueva class en la carpeta Controllers, y llamemosla AccountController. Derivaremos esto de la class Controller base del marco MVC.
usando Microsoft.AspNet.Mvc; usando el sistema; utilizando System.Collections.Generic; using System.ComponentMo del.DataAnnotations; utilizando System.Linq; usando System.Threading.Tasks; espacio de nombres FirstAppDemo.Controllers {public class AccountController: Controller {}}
-
Ahora vamos a tener que configurar una funcion que permita a un usuario s ' registrarse en este sitio.
-
Se parecera mucho a un formulario de edicion.
-
Cuando el usuario quiera registrarse, primero le mostraremos un formulario que le permitira completar la informacion requerida. Luego pueden descargar este formulario sen el sitio.
-
Esta informacion se guarda en la base de data.
Ahora vamos a crear la accion que devolvera una vista cuando vayamos a /account/register.
Public Class AccountController: Controller {[HttpGet] Public ViewResult Register () {return View }}
No necesitamos buscar nada, el usuario proporcionara toda la informacion que necesitemos. Antes de crear el ViewModel para esta vista, debemos decidir que informacion mostrara la vista. Tambien debemos decidir que informacion necesitaremos recibir del usuario.
Creemos un modelo de vista para este escenario agregando una nueva class en el archivo AccountController.cs y llamandolo RegisterViewModel.
Creemos algunas propiedades que contendran el nombre de usuario, la contrasena y tambien el usuario ConfirmPassword en el tescribiendo dos veces y asegurandose de que las dos contrasenas coincidan como se muestra en el siguiente programa.
public class RegisterViewModel {[Requerido, MaxLength (256)] cadena publica Username {get; juntos; } [Requerido, DataType (DataType.Password)] cadena publica Contrasena {get; juntos; } [DataType (DataType.Password), Compare (nombre de (Contrasena))] cadena publica ConfirmPassword {get; juntos; }} En la class anterior, puede ver algunas anotaciones que pueden ayudarnos a validar este modelo. Aqui se requiere el nombre de usuario y, si observa el esquema de la base de data, la columna que debe contener un nombre de usuario tiene 256 caracteres.
Tambien aplicaremos un atributo MaxLength aqui.
Se requerira una contrasena y cuando hacemos una entrada para esta contrasena, queremos que el tipo de entrada sea Escriba contrasena afen que los personajes no aparecen en la pantalla.
La Confirmar contrasena tambien sera la contrasena de tipo de data, luego habra un atributo de comparacion adicional. Compararemos el campo ConfirmPassword con esta otra propiedad que podemos especificar, que es el campo Password.
Ahora creemos la vista que necesitamos. Necesitaremos agregar una nueva carpeta a las vistas y llamarla Cuenta, por lo que todas las vistas vinculadas al AccountController se agregaran a esta carpeta.
Ahora haga clic derecho en la carpeta Cuenta y seleccione Agregar → Nuevo elemento.
En el panel central, seleccione la pagina de visualizacion MVC y asignele el nombre Registrar .cshtml, luego haga clic en el boton Agregar.
Elimine todos los codigos existentes del archivo Register.cshtml y agregue el siguiente codigo.
@model RegisterViewModel @ {ViewBag.Title = "Registrarse}
Registrarse
-
Ahora puede ver que hemos especificado el modelo como el RegisterViewModel que acabamos de crear.
-
Tambien vamos a establecer el titulo de esta pagina usando ViewBag y queremos que el titulo sea Registro.
-
Tambien necesitamos crear un formulario que contenga los campos Nombre de usuario, Contrasena y Confirmar contrasena.
-
Tambien hemos incluido un
-
Podemos mostrar todos los errores en el area de resumen, o podemosdigamos ValidationSummary.ModelOnly y los unicos errores que apareceran al validar el modelo dentro del resumen seran los errores de validacion asociados con el modelo y no una propiedad especifica de ese modelo.
-
En otras palabras, si los usuarios no ingresan su nombre de usuario, pero el nombre de usuario es obligatorio, habra un error. validacion para esa propiedad especifica.
-
Pero tambien puede generar errores de modelo que no estan asociados con una propiedad especifica y que apareceran en este ValidationSummary.
-
En una etiqueta tenemos etiquetas y entradas para todos los diferentes campos que tenemos en nuestro ViewModel.
-
Necesitamos una etiqueta para el nombre de usuario, una entrada para el nombre de usuario y tambien mensajes de validacion para el nombre de usuario. 'usuario.
-
Los otros dos son profesionalesLos valores que debemos ingresar por parte del usuario son los mismos y tendran una etiqueta y una entrada y un alcance para la contrasena y una etiqueta y una entrada y un alcance para ConfirmPassword.
-
No necesitamos especificar los tipos de entrada para la contrasena y la contrasena de confirmacion, porque asp para el asistente de etiquetas se asegurara de establecer este tipo de entrada como contrasena para nosotros.
-
Al final debemos tener el boton que dice Registrarse . Cuando el usuario haga clic en este boton, reenviaremos el formulario al controlador.
En AccountController, tambien necesitamos implementar un metodo de accion HttpPost Register. Regresemos al AccountController y agreguemos la siguiente accion de registro de la siguiente manera:
[HttpPost] public IActionResult Register (modelo RegisterViewModel) {}
Este metodo la accion devolvera un IActionResult. Esto recibira un RegisterViewModel. Ahora tenemos que interactuar con el marco de identidad para asegurarnos de que el usuario es valido, decirle al marco de identidad que cree este usuario y luego, como acaban de crear la cuenta, inicie sesion. Veremos la implementacion de todos estos pasos en el proximo capitulo.
ASP.NET Core - Crear usuario
En este capitulo discutiremos como crear un usuario. Para continuar, necesitamos interactuar con el marco de identidad para asegurarnos de que el usuario sea valido, luego crear este usuario, luego continuar e iniciar sesion.
-
Hay dos servicios basicos del marco de identidad, uno es el UserManager y el otro es el SignInManager.
-
Necesitamos inyectar estos dos servicios en nuestro controlador. Con esto podemos llamar a las API apropiadas cuando necesitemos crear un usuario.ro iniciar sesion como usuario.
-
Agreguemos variables privadas para SignInManager y UserManager, luego agreguemos un constructor en su AccountController, que tomara dos parametros de UserManager de tipo User y un SignInManager de tipo User.
private SignInManager _signManager; UserManager privado _userManager; AccountController public (UserManager userManager, SignInManager signManager) {_userManager = userManager; _signManager = signManager; }
-
Vamos a continuar con el metodo de accion POST de AccountController y una de las primeras comprobaciones que siempre debemos hacer dentro del La accion posterior es verificar si nuestro ModelState es valido.
-
Si ModelState es valido, entonces sabemos que el usuario nos dio un nombre de usuario y contrasena y confirmo la contrasena; si no, tenemos que pedirles que foComplete la informacion correcta.
-
Aqui esta la implementacion de la accion Guardar.
[HttpPost] Public Task Registro (modelo RegisterViewModel) {if (ModelState.IsValid) {var user = new User { Nombre de usuario = modelo.Nombre de usuario}; var resultado = esperar _userManager.CreateAsync (usuario, modelo.Password); if (result.Succeeded) {espera _signManager.SignInAsync (usuario, falso); return RedirectToAction ( "Índice ", "Inicio "); } else {foreach (var error en result.Errors) {ModelState.AddModelError ( ", error.Deion); }}} return View }
-
Si nuestro ModelState es valido, necesitamos hablar con el marco de identidad. Tambien necesitamos crear una nueva instancia de nuestra entidad Usuario y copiar nuestra entrada model.Username en la propiedad UserName de la entidad User.
-
Pero no vamos a copiar la contrasena porque no hay lugar para almacenarVerifique la contrasena en texto sin formato en la entidad Usuario. En su lugar, pasaremos la contrasena directamente al marco de identidad, que hara un hash de la contrasena.
-
Asi que tenemos un userManager. Cree un metodo Async en el que necesitemos pasar el nombre de usuario, para que podamos guardar la contrasena de ese usuario.
-
Este metodo Async devuelve un resultado que nos dice si la instancia tuvo exito o fallo y si fallo, esto nos dara algunas de las posibles razones de su falla.
-
Si el resultado es exitoso, podemos conectar al usuario que acaba de crear una cuenta y luego pedirle al SignInManager que firme a este usuario. Ahora redirija al usuario a la pagina de inicio y ahora estara autenticado.
-
Si el resultado no fue exitoso, deberiamos intentar decirle al usuario por que, y el resultado que viene de UserManager tiene unaLa coleccion de errores que podemos iterar y agregar estos errores en ModelState. Estos errores estaran disponibles en la vista para los asistentes de etiquetas, como los asistentes de etiquetas de validacion, para mostrar informacion sobre la pagina.
-
En ModelState.AddModelError, podemos proporcionar una clave para asociar un error con un campo especifico. Tambien usaremos una cadena vacia y agregaremos la deion del error que se proporciono.
Hagamos una copia de seguridad de todos los archivos, ejecutemos la aplicacion y vayamos a / account / registry .
Ingresemos un nombre de usuario y contrasena de 5 caracteres muy simples.
Ahora haga clic en el boton Guardar.
Predeterminado , el marco de identidad intenta hacer cumplir ciertas reglas en torno a las contrasenas.
Las contrasenas deben tener al menos 6 caracteres, un caracter debe estar en minusculas, el otro en mayusculas y debe ser un caracter no numerico.
La rLa razon por la que estos errores aparecen aqui es porque tenemos una suma de confirmacion de Mary en la pagina que detecta los errores que regresan del resultado de userManager.CreateAsync .
Ahora que sabemos un poco mas sobre las reglas de las contrasenas, intentemos crear una contrasena lo suficientemente compleja y haga clic en registrarse.
Ahora vera la pagina de inicio. Esto significa que la operacion funciono . Ahora pasemos al Explorador de objetos de SQL Server.
Haga clic con el boton derecho en la tabla dbo.AspNetUsers y seleccione Mostrar data .
Ahora puede ver que el usuario se creo correctamente y tambien puede ver un nuevo registro en la tabla Usuarios. Tambien puede ver un valor de contrasena con hash asi como un nombre de usuario y este es el nombre de usuario que registramos con mark.upston .
ASP.NET Core: inicio de sesion y diciembreonnexion
En este capitulo, tenemos la funcionalidad de conexion y desconexion. La desconexion es bastante sencilla de implementar en comparacion con la conexion. Continuemos con la vista Diseno porque queremos crear una interfaz de usuario con enlaces. Esto permitira que un usuario que haya iniciado sesion cierre la sesion y muestre tambien el nombre de usuario.
< DOCTYPE span> < name = "viewport " content = "width = device-width " /> @ ViewBag.Title @ DateTime.Now @RenderBody ()
-
Para un usuario anonimo, mostraremos un enlace de inicio de sesion.
-
Toda la informacion que necesita para crear esta interfaz de usuario esta disponible en el contexto de la vista Razor.
-
Primero, agreguemos el espacio de nombres System .Security.Claims en su vista de diseno.
@usando System.Security.Claims < DOCTYPE span> < name = "viewport " content = "width = device-width " /> @ ViewBag.Title @if (User.IsSignedIn ()) {@ User.GetUserName ()} el { Iniciar sesion Registrarse } @ DateTime.Now @RenderBody ()
-
Hay una propiedad de usuario que esta disponible en cada vista de Razor y queremos crear una interfaz de usuario que mostrara el nombre del usuario que inicio sesion. Un metodo de extension IsSignedIn tambien esta disponible aqui.
-
Podemos invocar este metodo y si devuelve verdadero, aqui es donde podemos colocar el marcado, mostrar el nombre de usuario, mostrar un boton de cierre de sesion.
-
Ahora, si el usuario ha iniciado sesion, podemos mostrar el nombre de usuario del usuario utilizando el metodo auxiliar GetUserName .
-
Necesitaremos crear un boton de cierre de sesion en un formulario, que se publicara en el servidor web. Esto debe hacerse ya que creara algunas condiciones desagradables, si permite un simple GET REQUEST para permitir que un usuario salga.
-
Forzaremos que esto sea un mensaje, y cuando el usuario envie este formulario, todo lo que tenemos que hacer es presionar la accion de cierre de sesion. , que implementaremos a traves del AccountController, y para desconectar al usuario.
-
Si el usuario no ha iniciado sesion y tenemos un usuario anonimo, entonces debemos mostrar un enlace que ira al AccountController, en particular a la accion de inicio de sesion, y puede mostrar el texto Iniciar sesion.
-
Tambien necesitamos agregar un enlace para que los nuevos usuarios se registren y vayan directamente a la pagina de registro.
Ahora vayamos a AccountController y primero implemente la accion de cierre de sesion como en el siguiente programa.
[HttpPost] Tarea publica Logout () {await _signManager.SignOutAsync return RedirectToAction ( "Índice ", "Inicio "); }
-
Esta accion solo responde a HttpPost. Es una accion maravillosa. Tendremos que llamar a otro metodo hrone en el marco de identidad.
-
Podemos devolver una tarea desde IActionResult y la accion se llama Logout.
-
Todo lo que tenemos que hacer para cerrar la sesion es esperar el metodo SignOutAsync de SignInManager .
-
El contexto del usuario ha cambiado ahora; ahora tenemos un usuario anonimo. La vista sera redirigida a la pagina de inicio y regresaremos a la lista de empleados.
Ahora continuemos y construyamos nuestra funcion de inicio de sesion. Aqui necesitaremos un par dections, uno que responde a una solicitud HttpGet y muestra el formulario que podemos usar para iniciar sesion, y uno que responde a una solicitud HttpPost.
Para empezar, necesitaremos un nuevo ViewModel para extraer los data de conexion porque la conexion es muy diferente a la grabacion. Entonces, agreguemos una nueva class y llamemosla LoginViewModel .
class publica LoginViewModel {cadena publica Nombre de usuario {get; juntos; } [DataType (DataType.Password)] cadena publica Contrasena {get; juntos; } [Display (Name = "Recordarme ")] public bool RememberMe {get; juntos; } cadena publica ReturnUrl {get; juntos; }}
-
Cuando los usuarios inician sesion, deben proporcionar informacion como nombre de usuario, contrasena.
-
La tercera pieza de informacion debe ser la interfaz de usuario de inicio de sesion. Estos van acompanados de unLa pequena casilla de verificacion que dice "Quieres recordarme". Esta es la eleccion entre si queremos una cookie de sesion o queremos una cookie mas permanente.
-
Para habilitar esta funcionalidad, agregamos una propiedad booleana RememberMe y usamos una anotacion de visualizacion. Ahora, cuando creamos una etiqueta, el texto Recordarme se muestra con un espacio.
-
La ultima informacion que realmente queremos como parte de este ViewModel es tener una propiedad que almacene ReturnUrl.
Ahora agreguemos la accion de inicio de sesion que respondera a la solicitud Get como se muestra en el siguiente programa.
[HttpGet] Inicio de sesion de IActionResult publico (string returnUrl = ") {var model = new LoginViewModel {ReturnUrl = returnUrl}; Vista posterior (modelo); }
Ahora tendremos una nueva vista agregando una nueva pagina de vista MVC en la carpeta Vistas → Cuenta .
En el panel central, seleccione la pagina de visualizacion MVC y asignele el nombre Login.cshtml, luego haga clic en el boton Agregar. Agreguemos el siguiente codigo al archivo Login.cshtml.
@model LoginViewModel @ {ViewBag.Title = " Iniciar sesion}
Iniciar sesion
-
En este vista de inicio de sesion, establecemos el titulo de la pagina en Iniciar sesion, luego tenemos un formulario que podravinculado a la accion AccountLogin .
-
Necesitamos usar un asistente de etiquetas, asp-route-returnurl , para asegurarnos de que ReturnUrl este en la URL donde devoluciones de formulario.
-
Necesitamos enviar esta ReturnUrl al servidor para que, si el usuario se conecta correctamente, podamos enviarla a donde estaba intentando ir. .
-
Todo lo que agregue despues de asp-route-, id o returnurl, lo que sea que tenga alli, ira en algun lugar de la solicitud, ya sea en la ruta de 'URL, o como parametro de cadena de consulta.
-
Tenemos nuestro ValidationSummary y las entradas para Nombre de usuario, Contrasena y Recuerdame, luego tenemos un boton Enviar.
` AccountController , e implemente la accion Publicar. Esta accion que responde a HttpPost. Sera un metodo Async porque necesitaremos llamar al marco de identidad y devolver une tarea o IActionResult.
[HttpPost] public Task Iniciar sesion (modelo LoginViewModel) {if (ModelState.IsValid) {var result = wait _signManager.PasswordSignInAsync (model.Username, model. Contrasena, modelo.RememberMe, falso); if (result.Succeeded) {if (! string.IsNullOrEmpty (model.ReturnUrl) && Url.IsLocalUrl (model.ReturnUrl)) {return Redirect (model.ReturnUrl); } else {return RedirectToAction ( "Índice ", "Inicio "); }}} ModelState.AddModelError ( ", "Intento de conexion no valido "); Vista posterior (modelo); }
-
Llamamos a este inicio de sesion, y ahora esperamos recibir un LoginViewModel.
-
Necesitamos comprobar si ModelState es valido. Si es valido, conectese al usuario llamando a una API en SignInManager.
-
El metodo PasswordSignInAsync devolvera un resultado y si el resultado es exitoso, sabemos que el usuario ha iniciado sesion.con exito.
-
Tambien tenemos una URL de retorno. Si esta es una URL local valida, se nos redirigira a la URL de retorno.
-
Si el usuario acaba de iniciar sesion y no tiene un lugar especifico al que ir, redirigiremos al usuario a la accion Índice de HomeController.
-
Podriamos estar en una situacion en la que el usuario proporcione una contrasena o un nombre de usuario no validos. Tambien necesitamos agregar un error de plantilla que pregunte si hay un intento de inicio de sesion no valido. Ayuda al usuario a saber si algo anda mal.
Ahora guardemos todo y ejecutemos la aplicacion.
Ahora tenemos enlaces de conexion e inion. Hagamos clic en el enlace de conexion.
Conectemos con el 'usuario que creamos en el capitulo anterior especificando el Nombre de usuario y la Contrasena y marque la casilla Recuerdame .
Cuando hace clic en el boton Conectar, el navegador le pregunta si desea guardar su contrasena para el host local. Hagamos clic en el boton Si.
Ahora cerramos la sesion haciendo clic en el boton Cerrar sesion.
Como 'usuario anonimo, intentemos editar los detalles del empleado.
Ahora puede ver que hemos sido redirigidos a la vista de inicio de sesion .
Permitanos iniciar sesion con su nombre de usuario y contrasena y marque la casilla de verificacion Recordarme.
Ahora , haga clic en el boton Conexion.
Ahora puede ver que estamos dirigidos a la URL que queremos cambiar. De hecho, hemos manejado la URL de retorno de manera apropiada .