Desarrollo web básico con ASP. Núcleo neto | Trevoir Williams | Skillshare

Velocidad de reproducción


1.0x


  • 0.5x
  • 0.75x
  • 1x (Normal)
  • 1.25x
  • 1.5x
  • 1.75x
  • 2x

Desarrollo web básico con ASP. Núcleo neto

teacher avatar Trevoir Williams, Jamaican Software Engineer

Ve esta clase y miles más

Obtenga acceso ilimitado a todas las clases
Clases enseñadas por líderes de la industria y profesionales activos
Los temas incluyen ilustración, diseño, fotografía y más

Ve esta clase y miles más

Obtenga acceso ilimitado a todas las clases
Clases enseñadas por líderes de la industria y profesionales activos
Los temas incluyen ilustración, diseño, fotografía y más

Lecciones en esta clase

    • 1.

      Introducción

      1:01

    • 2.

      Cómo configurar un proyecto básico

      3:35

    • 3.

      Proyecto de un recorrido de páginas de afeitar

      18:57

    • 4.

      Cómo entender la sintaxis

      12:19

    • 5.

      Mensaje desde ajustes

      7:51

    • 6.

      Cómo agregar un marco de entidades

      12:03

    • 7.

      Cómo agregar bases de datos

      14:32

    • 8.

      Clases de base de andamios

      13:05

    • 9.

      Cómo agregar un proyecto

      9:24

    • 10.

      Añade una página de afeitar

      21:40

    • 11.

      Agregar página de afeitar de actualización

      23:53

    • 12.

      Añadir detalles

      5:30

    • 13.

      Añadir la página de afeitar

      22:30

    • 14.

      Cómo usar vistas parciales y mejoras de la interfaz

      33:11

    • 15.

      Cómo agregar cambios

      1:26

    • 16.

      Cómo administrar cambios en bases de datos

      22:15

    • 17.

      Mejoras de formas - Parte 1

      24:20

    • 18.

      Mejoras de formas - Parte 2

      12:19

    • 19.

      Cómo mejorar los formularios y las validaciones de datos

      26:35

    • 20.

      Cómo mejorar los formularios y las validaciones de datos

      18:47

    • 21.

      Añade listas desplegables en casos con JQuery

      24:03

    • 22.

      Añade listas desplegables en casos con JQuery

      16:33

    • 23.

      Displays de etiquetas de datos

      6:42

    • 24.

      Cómo limpiar la interfaz de usuario

      31:15

    • 25.

      Cómo configurar repositorios

      25:57

    • 26.

      Añade un código de repositorio

      16:46

    • 27.

      Páginas de refactorización

      14:20

    • 28.

      Repositorios completos

      21:24

    • 29.

      Conclusión de la sección de repositorios

      9:46

    • 30.

      Configuración de autenticación de usuarios

      10:54

    • 31.

      Ampliar tabla de usuarios

      4:53

    • 32.

      Página de registro

      20:25

    • 33.

      Página de inicio de sesión

      9:45

    • 34.

      Autorización de instalación

      9:34

    • 35.

      Añade autorización

      3:09

  • --
  • Nivel principiante
  • Nivel intermedio
  • Nivel avanzado
  • Todos los niveles

Generado por la comunidad

El nivel se determina según la opinión de la mayoría de los estudiantes que han dejado reseñas en esta clase. La recomendación del profesor o de la profesora se muestra hasta que se recopilen al menos 5 reseñas de estudiantes.

93

Estudiantes

--

Proyecto

Acerca de esta clase

En este curso aprenderás a desarrollar una aplicación con ASP.NET Core 5.

Este curso se construirá sobre tus bases de programación HTML, CSS, JavaScript y C#.

Al final de este curso sabrás cómo hacerlo:

  • Cómo crear una aplicación web con ASP.NET Core
  • Asegure una aplicación web con inicio de sesión y registro
  • Aprende conceptos avanzados como inyección de dependencia y principios SOLID
  • Cómo conectar tu aplicación web a una base de datos SQL Server
  • Usa Bootstrap para embellecer tu sitio web.
  • Usa JavaScript y jQuery de forma efectiva.
  • Aprende a usar GitHub para administrar un control de fuentes

Ven conmigo en este viaje y aprende a crear una aplicación web dinámica, basada en datos y SOLID.

Conoce a tu profesor(a)

Teacher Profile Image

Trevoir Williams

Jamaican Software Engineer

Profesor(a)

Habilidades relacionadas

Desarrollo Desarrollo web
Level: All Levels

Valoración de la clase

¿Se cumplieron las expectativas?
    ¡Superadas!
  • 0%
  • 0%
  • Un poco
  • 0%
  • No realmente
  • 0%

¿Por qué unirse a Skillshare?

Mira las galardonadas Skillshare Originals

Cada clase tiene lecciones cortas y proyectos prácticos

Tu membresía apoya a los profesores de Skillshare

Aprende desde cualquier lugar

Ve clases sobre la marcha con la aplicación de Skillshare. Progresa en línea o descarga las clases para verlas en el avión, el metro o donde sea que aprendas mejor.

Transcripciones

1. Introducción: Hola y bienvenidos a este curso, desarrollo web básico con ASP.Net Core F5. Soy tu instructor para VOR Williams y soy ingeniero de software y conferenciante en este curso, vamos a estar aprendiendo sobre ASP.Net Core, que es un framework web libre y de código abierto. Y también es el sucesor de ASP.Net, que es desarrollado por Microsoft. En este curso, también vamos a estar buscando conectar nuestra aplicación ASP.Net Core a una base de datos de Microsoft SQL Server. Para ello, vamos a estar mirando Entity Framework, que es una biblioteca que está especialmente diseñada para este tipo de interacción. También vamos a estar mirando el control de fuentes, que es una práctica de camiones y manejo de cambios cumplir con la escuela fuente estará utilizando GitHub como la herramienta para facilitar esta práctica. Este curso asume que tienes conocimientos fundamentales en HTML, CSS y C-sharp. Si no, entonces te animo a que consultes mis otros cursos sobre esos temas. Con todo eso dicho y hecho, empecemos y no puedo esperar a verte en el curso. 2. Configura un proyecto básico de ASP.NET: Bienvenidos de vuelta chicos. En esta lección, solo vamos a estar sentando nuestro entorno de desarrollo para nuestra aplicación ASP.Net Core. Y lo que me gustaría que hicieras es simplemente golpear Start y escribir en Visual Studio Installer. Ya tienes instalado Visual Studio. Lo que tenemos que hacer es instalar algunas más cargas de trabajo para que podamos llegar a azotar el desarrollo. No lo hagas, una vez que subas a ese instalador, deberías ver una ventana mirando algo parecido a esto. Y lo que puedes hacer es hacer clic en Modificar. Y al pulsar Modificar, vas a ver una lista de cargas de trabajo potenciales que puedes instalar. Por lo que ya tienes el para el desarrollo de escritorios. Lo que necesitarías es el para ASP.Net y desarrollo web. Entonces si ya no lo tienes marcado, entonces él puede seguir adelante y tomarlo y luego seguir adelante e instalar. Por lo que se puede ver que ya tengo la mía partió para hacer eso y se pueden instalar otras cargas de trabajo. Pero para este curso en particular o las próximas lecciones, definitivamente queríamos tener ASP.Net y desarrollo web ticked e instalado. Ahora una vez que haya completado esa instalación, puede seguir adelante y lanzar su Visual Studio. Y a partir de ahí vamos a crear un nuevo proyecto. Para que puedas seguir adelante y crear nuevo proyecto. Y estamos buscando una aplicación web ASP.Net Core. solo puedas escribir en la búsqueda ASP.Net Core Web App. Por lo que verás bastantes de ellos. Y notarías que tienes la aplicación web que utiliza páginas de Razor. También tienes la aplicación web core que utiliza el controlador de vista modal. Y luego tienes API web y tienes un montón de otras plantillas. A medida que obtienes más experiencia, puedes experimentar con las diferentes plantillas. Pero para esto, por supuesto, vamos a estar mirando aplicación web ASP.Net Core usando páginas de Razor. Podemos seguir adelante y golpear eso. Adelante y pega Siguiente. Y vamos a estar llamando este proyecto auto arrancando. La idea general detrás los proyectos será que estemos construyendo una app que permita a la gente reservar o rentar un auto de una empresa según sea necesario. Lo siento, es agradable y simple habilidad será lo suficientemente complicada maravillosamente como para que pongamos los fundamentos debajo de nuestros cinturones. Por lo que sólo podemos seguir adelante y golpear Siguiente. Y vamos a estar usando dotnet F5. Y luego podrás habilitar la compilación de tiempo de ejecución de la maquinilla de afeitar, que nos ayudará con nuestra depuración y pruebas. No vamos a sentarnos a la autenticación ahora mismo. Lo vamos a hacer manualmente más adelante para que podamos ver todos los componentes que encajan con esos ajustes en su lugar. Puedes seguir adelante y golpear Crear. Ahora que tenemos nuestro proyecto en marcha, lo que vamos a hacer es simplemente echar un vistazo rápido a lo que sacamos de la caja. Obtenemos esta estructura del proyecto. Y cuando golpees Start, notarás que obtenemos aplicación web ya hecha. Tenemos la app web, tenemos nuestra barra de navegación en la parte superior, el área de contenido. Entonces es muy similar a lo que habríamos visto cuando estamos mirando los fundamentos del desarrollo HTML, HTML. En este punto, no hemos escrito ningún código, pero aún así tenemos una página web arriba con al menos dos páginas para nuestro placer visual. Vamos a estar perforando hacia abajo en básico de lo que sacamos de la caja. Si bien todo esto se genera donde encontramos lo que se pega y hace cuando lleguemos, estaremos explorando la estructura de carpetas que obtuvimos con esta aplicación web y lo que todo de estos archivos significan y representan. 3. El proyecto de la visita de Razor: Muy bien, así que estamos de vuelta. Vamos a estar discutiendo la dinámica o al menos una estructura de carpetas y los diferentes archivos que obtenemos en nuestra aplicación ASP.Net Core. Ya has pasado y mirado HTML y CSS, y JavaScript y cómo se combinan todos esos factores para darte un sitio web y la red de fondos. Pones un nuevo proyecto en una carpeta 12, tendes a poner los diferentes tipos de activos, las imágenes en su propia carpeta, archivos CSS en su propia carpeta, etcétera Bueno, esto solo se basa en esos principios. También habrías visto que durante los ejercicios de codificación de C Sharp donde cada vez que estabas creando un proyecto, tienes una carpeta completamente nueva donde habrían estado todos esos archivos para el proyecto. Es el mismo principio o solución está en una carpeta por sí misma, el proyecto es suficiente todo por sí mismo. Y luego hay diferentes archivos y carpetas en lugar de esa otra carpeta. Empecemos con mirar propiedades. Propiedades nos da este archivo dependencias uno tiene que ver con bibliotecas y frameworks. Verás más de eso a medida que avanzamos. No voy a aburrirme, ya sabes, o abrumador con eso. Pero si miras propiedades, verás que tienes un archivo JSON que tiene alguna configuración de lanzamiento, por lo que generalmente no tienes que modificar este archivo en esto, estás haciendo algo muy explícito, que no estamos haciendo en este momento y probablemente no lo hagamos dentro del ámbito de este rumbo. Pero es bueno apreciar lo que hay aquí. Verás que tienes la aplicación URL Canadá definida aquí, donde dice que tienes la URL en una dirección HTTP y luego tienes el puerto SSL, lo que significa que cuando pulsamos Start, estamos va a poder acceder a la aplicación ya sea escribiendo en esta URL o HTTPS barra de dos puntos slash host local con el número de puerto de los puertos SSL, generalmente no tiene que cambiar nunca esto. Entonces es bueno entenderlo una vez más. Siguiente carpeta mayor es nuestra carpeta raíz www. Por lo que realmente no se ve como una carpeta basada en la retención. Las otras carpetas realmente miraban en esta estructura de proyecto, pero lo que te darías cuenta es que tiene subcarpetas en ella. Entonces esta es una carpeta que almacena los archivos estáticos para el sitio web. Entonces cuando decimos archivos estáticos, como se puede ver, es él la carpeta CSS, la carpeta JS, y otra llamada salto. Todos esos activos y los archivos CSS, archivos JavaScript, o bibliotecas de terceros que podrían ser una combinación de archivos CSS y JavaScript o jQuery. Te gustaría almacenar todos ellos dentro de la raíz www porque la propia aplicación tipo de mapea esta ubicación y hace que sea muy fácil acceder a esa ubicación cuando quieras acceder al CSS, el JavaScript, o cualquiera de los demás archivos activos. Para que puedas ver viene incorporado ya hecho con bootstrap, jQuery, validación jQuery, y otra biblioteca para la validación de jQuery. Entonces todas esas bibliotecas tipo de salen de la caja. Si queremos sumar otras bibliotecas, que vamos a hacer más adelante, siempre podemos hacer clic derecho y podemos ir a Agregar. Y luego hay una característica para simplemente instalar la biblioteca del lado del cliente. Cuando llegamos a ese punto, en realidad podemos simplemente usar esto y buscar nuestra biblioteca. Y nos mostraría todos los resultados, cómo podemos simplemente instalarlo en la aplicación sin consultar manualmente y pescar. Así que recuerda cuando estábamos haciendo nuestra inclusión jQuery y así sucesivamente wet para realmente ir al sitio web, obtener el archivo y copiar localmente, o usar un CDN. Mientras se utiliza este gestor de biblioteca. Podemos hacer todo eso aquí en tan solo unos clics. Y en realidad solo lo descargaría a nuestro sistema o a nuestras carpetas de proyectos para nosotros. Muy bien, entonces ahí es donde realmente se mantienen todos nuestros archivos estáticos. Sepa si alguna vez has visto una aplicación MVC, estarás acostumbrado a ver las carpetas modelo, ver y controlador fuera de la caja. Si no, eso está bien. Pero la diferencia entre la plantilla MVC o controlador de vista de modelo y la plantilla de páginas Razor es una grasa que la forma en que se estructuran las páginas y sus activos es diferente. Con el MVC, tienes el modelo que es un archivo de clase por demasiado. Tiene la vista, que es el archivo HTML. Y luego tienes un controlador que era la inteligencia. En páginas de Razor. Lo que han hecho es que dan una carpeta llamada páginas, y luego cada página viene con el CSS HTML o el archivo HTML, así como archivo de código R, que duplica tanto como la inteligencia como el modelo. Echemos un vistazo a la página de índice. La página de índice. Recuerda de HTML Basics, siempre nombra tu índice de primera página. Bueno, aquí está Microsoft a la altura de ese principio muy simple. Entonces cuando hago clic en la página de índice, el archivo CSS HTML, entonces verás que esto es realmente sólo un archivo HTML. Sí, tiene algunos adornos, pero una vez que superes eso, que discutiremos más adelante, notarás que son las mismas etiquetas que habríamos aprendido de HTML Basics. La etiqueta div, la etiqueta de imagen, la etiqueta P, y cualquier otro objetivo que usted sabría, todos son utilizables dentro de este archivo, el punto CSS, el archivo CSS de punto HTML. Parece el código C-Sharp que acabamos de ver. Muy bien, entonces tenemos la clase pública llamada índice modelo colon. A esto se le llama herencia. El modelo de índice está heredando del modelo de página, que es una clase base que viene incorporada. Pero el hecho del asunto es que a esto se le llama modelo de índice. Y si echas un vistazo hacia atrás a la clase de índice, notarías que en la parte superior dice uno, soy una página, y luego dos, le dice al modelo. Se nota una declaración de que mi modelo es modelo de índice. Eso significa cualquier cosa que yo cualquier cosa que se defina en lugar de modelo de índice se puede acceder desde la página web a medida que construimos sobre ella. Eso lo apreciarás un poco más. La mayoría, la mayoría de las veces cuando ves las IRA son la página más, si no todas las veces, entonces las vas a ver en parejas. Vas a ver que es dot CSS HTML. Yo soy el que es dot CSS HTML. En función de tu Visual Studio, es posible que los tengas en realidad algo anidados por defecto, pero en realidad puedes cambiar ese anidamiento. Sé que está deshabilitado para mí, puedo habilitarlo. Tiendo a pensar que esto es un poco más ordenado porque cuando está anidado, solo puedo hacer clic y luego veo el archivo resultante directamente debajo de ese. A veces se vuelve confuso cuando todos ellos están listados así, pero eso depende de ti. Sólo te estoy mostrando que puedes enumerar, puedes anidar y deshabilitar eso a voluntad. Entonces como dije, cada vez que creas una página, o al menos una página de resultados estándar, vas a terminar con ambos archivos conociendo la carpeta compartida. Aquí es donde los archivos que van a ser utilizados o accedidos por todos los demás archivos, todas las demás páginas, Ahí es donde se almacenan estos. Echemos un vistazo al diseño. No, habrías notado que con nuestra página de índice, déjame simplemente saltar buffer con índice rápidamente. Habrías notado que la página de índice no tiene esa estructura de esqueleto HTML que habíamos discutido desde lo básico. Recuerda que siempre empezamos con cinta adhesiva y luego las etiquetas HTML y luego golpeamos y cuerpo y luego ponemos el contenido, esto va directamente al contenido. Lo que sucede es que están utilizando lo que llamamos un layout. O de vuelta en el día lo llamamos plantilla o una obra maestra, donde trazan la temporal una vez en lugar de repetir, repetir, repetir esta plantilla cada PDF, 20 páginas, hay que repetir esta plantilla? Sí, en un sitio web básico, es absolutamente necesario. Pero lo que hicieron fue una especie de resúmenes que trabajo ocupado. Recuerda una vez más, los frameworks están configurados para reducir la cantidad de repetición o reducir la probabilidad de que tengas que repetir ciertas cosas. Porque saben que tienes que ver con esta plantilla HTML cada vez. Cuando desarrollaron un.the.net Core Framework, lo que hicieron fue crearon al mismo tiempo y luego te permitieron renderizar los diferentes pH del interior de esta área llamada render body. Lo que realmente sucede es que cada página siempre va a tener la etiqueta HTML, la etiqueta head. Esto se establece globalmente COC, siempre está vinculando a las hojas de estilo para que no tenga que hacer eso en cada página. Tienes la etiqueta corporal que va a tener la oreja de cabecera con el nervio, por lo que no tienes que crear lo suficiente en cada página. Y entonces siempre vas a tener esa clase div con container. Recuerda que miramos eso, esa clase div es igual a container. Y luego sí, vas a ver algunas etiquetas nuevas. Puedes usarlos, es posible que nunca los uses en este punto. Realmente no tienes que hacerlo. Me preocupa , pero el punto es que cualquiera que sea la razón por la que PG crea con automáticamente obtener renderizado dentro de esta área, están dentro de esta plantilla general. Para leerte aquí cambiará el local, los Layouts, lo siento, fuera de todas las páginas a nivel mundial. Esa es una forma más fácil de mantener tu sitio web porque ahora no tienes que hacerlo a través de todas las páginas como habríamos visto cuando estamos haciendo el HTML básico y CSS. Todo eso es una especie de presentado aquí. Se ven las inclusiones de scripting en la parte inferior de la página y se puede modificar todo. Entonces veamos, por ejemplo, que lo que se generó automáticamente para nosotros sería el título View Data de la página. Si volvemos a nuestra página de índice, veríamos que ver el tipo de datos es igual a homepage. Eso es lo que se renderizaría en lugar de su título de datos. Entonces eso es como una variable y un marcador para lo que esté poniendo en cualquier pH que tengamos. Una vez más, el título es lo que se muestra en el navegador en la tina. Quería cambiar esto de ser un poco de texto a solicitud de reserva de autos. Un poco más legible por humanos. Pero ese es el título en la barra de navegación, lo siento, en la tina del navegador, entonces el navbar también tiene carb mirando arriba escrito aquí mismo. Entonces lo que voy a hacer es control y F5 y esa férula para correr sin depurar. Y cuando surja esta app, lo primero que quiero que tomen nota es el hecho de que esto está diciendo homepage. Entonces eso es cargar la página de índice. En caso de que no creas que ahí está. Indice dice homepage, ¿verdad? Por lo que está cargando la página de inicio o la página de índice aplicación de reserva de autos dash. Eso son textos estáticos que ponemos en el título. Muy bien, ¿y si quisiera actualizar este bit de texto aquí? Yo tampoco quiero decir carb enganchado ahí arriba. Entonces. Puedo ir y encontrar ese poco de código que está aquí mismo. Y lo voy a cambiar a solicitud de reserva de autos. Voy a salvar algo de humor. Siempre ahorre. Desafortunadamente, no los he visto implementar ningún AutoCAD en Visual Studio. Eso hubiera sido muy guay, pero supongo que no lo hicieron, no lo han hecho por una buena razón. Pero después de hacer ese cambio, solo voy a Control, refrescar mi navegador. Y he aquí, vemos el cambio que se está haciendo y ese cambio una vez más, estos globales. Entonces si voy en privacidad para Go on home, cada una de estas páginas es solo heredando del diseño general. Por lo que sólo voy a actualizarlo también en el pie de página. Sólo puedo repasar, cambiarlo en el pie de página. En todo caso, quería hacer trampa y cizallar. Quiero decir, esto es decir 2021 si necesitaba actualizarlo a 2022 o no mostrar solo privacidad, poniendo todo lo que necesito poner, todo eso se está actualizando globalmente. Entonces después de hacer ese cambio, sólo voy a refrescar una vez más. Y ves que el cambio no se refleja. Eso es lo fácil que es realmente modificar globalmente ¿verdad? Ahora si quisieras modificar las páginas, bueno, es sólo un montón de HTML. Entonces esto es lo que he ido a hacer. Voy a ejecutar antiguo el HTML de nuestra clase básica que teníamos en nuestra página de índice. Y sólo voy a darle una bofetada a esta nueva página de índice y vamos a ver qué pasa. Entonces aquí está nuestro HTML desde lo básico. Lo que pasa una vez más es que no necesitamos todas estas etiquetas. Necesitará esto, el cuerpo HTML todo lo que realmente quiero. Ni siquiera necesito el contenedor. Recuerdo que tuvimos que repetir Kantian o tenemos que repetir la novela por todas partes. Y luego agregamos un div para el contenido. Bueno, lo que hay en el contenido es lo que realmente necesitamos, que es lo que se muestra en la página. Tampoco necesitamos un pie de página porque tenemos nuestro pie de página. Sólo voy a tomar todo este contenido. Realmente no estoy preocupado por el funcionamiento del botón aún no están. Bueno, lo que voy a hacer es simplemente reemplazar el contenido predeterminado que vino con intento con contenido REA de nuestro curso. Fui a salvar eso y luego hacer una mirada refrescante a eso. En ninguna parte viendo que sólo podemos modificar las páginas de la misma manera. Lo único es que no tenemos que repetir nuestro esqueleto cada vez que se hace por nosotros. Sólo necesitamos el contenido. Y observa que todas las clases siguen funcionando para las pantallas de los botones y para los perros y la fuente. ¿ Por qué? Porque el archivo CSS para Bootstrap ya está incluido fuera de la caja. Ya nos están dando ese archivo bootstrap. Ahora, una cosa es que hemos conseguido a las cinco. Esto podría cambiar en el futuro, Pero el nodo correcto que es la biblioteca bootstrap, puedo perforar todo el camino hacia abajo y ver la grasa física. Entonces cuando lo dije, te facilitan el acceso. Todo lo que realmente necesitas es esta slash tilde. Y entonces comenzará a darte todas las carpetas en la jerarquía de carpetas de dub, dub, dub root. Si quisiera llegar al archivo CSS que está en mi sitio CSS, o quería llegar a la carpeta CSS y lo diré hoy, luego barra, y luego comienza a enumerar todas las carpetas para mí. Quería llegar al archivo CSS. Muy bien, entonces por eso dije que todos tus archivos estáticos a los que necesitas acceder pueden ir a acceder pueden ir a carpeta dub, dub, dub root, y eso lo hará muy fácil. Pero yo estaba haciendo el punto de que podemos perforar todo el camino hasta el archivo bootstrap. Y la versión Bootstrap que sacamos de la caja es 4.3.1. En lo básico miramos usando cinco, pero luego con esta plantilla solo nos hacemos bootstrap, bosques bootstrap, perdón, lo cual no es gran cosa porque las diferencias entre los dos no son tan grandes de un trato. Y la documentación siempre está ahí en caso estés usando algo de uno que no esté disponible en el otro, como no me ves tratando de usar Bootstrap para clases que no están en Bootstrap F5, siempre se puede volver a verificar eso. Muy bien, entonces ahora que tenemos una mejor comprensión de cómo funcionan el diseño y los archivos en general. Y ahí hay otros archivos, led view importaciones y vista de inicio. Si comienzas básicamente dice que solo usa ese archivo de diseño. Entonces si tenemos varios diseños, en realidad podemos crear otro layout. Si quisieras que un tipo de usuario viera un layout y otro tipo de usuario para ver otro layout o tener diferentes diseños por página, sea cual sea, en realidad puedes dictar cuál se deben utilizar. Todas esas cosas vendrán a su debido tiempo. Por lo que sólo voy a continuar el recorrido por los archivos y carpetas. Y pasemos a la aplicación settings.js. En la aplicación settings.js, Zen es como un archivo de configuración donde básicamente estipulamos cosas como cadenas de conexión. Ya sabes, dónde buscar la base de datos en configuraciones estáticas que necesitamos tener en su lugar para asegurarnos que ciertas características se desarrollen de manera particular. Todas esas cosas se pueden definir en ese archivo de configuración de la aplicación. Tenemos el program.cs, que es muy similar a lo que habríamos visto en nuestro C-Sharp en diverso, donde cada vez que creamos un nuevo proyecto, teníamos un archivo llamado program.cs que empató método up llamado media. Es lo mismo, program.cs, Y aquí está nuestro método principal. Entonces todo lo que sucede es que cuando golpeas IS Express nuestro inicio de calor, básicamente simplemente llamando al programa, llamando al método medio. Y el método principal dice construir y ejecutar la aplicación. Entonces, ¿dónde sabe qué configuraciones poner en marcha? Utiliza el archivo de inicio y el inicio aquí representa la startup sobre el archivo CS, que es otro lugar donde viven las configuraciones. Aquí en el constructor de startup, ves que están haciendo lo que llamamos inyección. Entonces más tarde te pones en un estándar, pero están inyectando un objeto de configuración de IA que representa OER hasta el archivo JSON settings.js. Para que si cualquiera que sea la configuración estática que pongamos ahí, podamos acceder a ellos y luego vía código hasta que use esta configuración cuando esté inicializando esta característica. Entonces el archivo de inicio es básicamente donde ocurre toda la inicialización de la característica. Porque ves aquí, estamos viendo servicios dot dirección o páginas más adelante cuando estamos agregando autenticación y otras cosas al proyecto, verás que tenemos que venir aquí y hacérselo saber. De acuerdo, por favor use este módulo, por favor use este middleware, por favor utilice esta función que vamos a agregar a este archivo a medida que la aplicación crezca. El punto de inicio css realmente acaba de encargarse de dictar lo que debería estar en su lugar para el momento en que se inicie la aplicación. Entonces si estropeo algo en este expediente o ciertas cosas en este expediente, si iba a entrar a esta línea ya que no creo que esa línea parezca útil. Y luego traté de correr, entonces va a estar recibiendo este error diciendo que hay algún desajuste entre lo quiero hacer y qué características están disponibles para mí sin tratar de leer esta flecha palabra-para -palabra. Es básicamente que he visto que estás tratando ejecutar inicializar la compilación en tiempo de ejecución, pero no vi dónde me dijiste que puedo usar el conjunto de funciones para la compilación en tiempo de ejecución. Esa línea que comenté es integral a las características que hay que llamar en otra parte de la aplicación. Para que a medida que avanzas y entiendes Who.NET Core funciona, entenderás qué bibliotecas deben ir a dónde. Una vez más, esto no es algo que necesites memorizar. Solo necesitas tener una buena idea de cómo funciona esta cosa para que cuando quieras una nueva característica, puedas ir e investigar adecuadamente para averiguar qué exactamente necesitas incluir para ponerlo en marcha . Eso es realmente todo para el recorrido por la estructura de carpetas. Cuando volvamos, empezaremos a trabajar un poco más en nuestra interfaz y a explorar cómo todo está conectado. 4. Comprender la sintaxis de Razor: Bienvenidos de vuelta chicos. En esta lección, vamos a estar mirando cómo podemos experimentar con nuestras matrices de melocotones. Ignoro el modificador de PHS o suficiente barra, e incluso miro cómo probablemente podemos inyectar nuestra molestia en diferentes lugares, similar a cómo vimos que se inyecta en la startup. Así que empecemos analizando lo que queríamos. Entonces voy a crear una página muy sencilla. Sólo estoy cerrando todas las instrucciones descripto. Y luego en las páginas voy a crear una nueva carpeta. Entonces esto siempre es una buena idea porque cuando se tienen las diferentes áreas, lo que pasa es que tienes tres operaciones principales. Crear, leer, actualizar, eliminar. Por lo que la mayoría de las veces quieres crear una carpeta. Y luego dentro de esa carpeta tendrías las diferentes páginas para soportar las diferentes características. Ya que estamos haciendo reservas de autos, lo primero que necesitaríamos probablemente tener serían los autos. Muy bien, así que voy a tener una carpeta llamada autos. Y dentro de esta carpeta para los autos, tendría un fichero de índice que representaría la primera página en la que aterrizas cuando votas por mirar autos, que normalmente sería como la lista de autos. Tienes la edición, tienes el delete y tienes que leer, lo que significa que estoy mirando a unos autos particulares detalles. No estamos listos para meternos en todas esas complicaciones. Solo estoy explicando por qué tenemos esa estructura de carpetas que verás que como un tema común a lo largo este curso y en la mayoría de las aplicaciones web, independientemente de la tecnología o el stock sea usado dentro de autos, vamos a crear un archivo de índice. Así que sólo voy a seguir adelante y hacer clic derecho y golpear Añadir ir a la página de la maquinilla de afeitar. Y lo que estamos haciendo aquí es usar las herramientas de andamios. Las herramientas de andamios nos permiten tipo de generar archivos. Supongo que Microsoft ha visto que conocemos el tipo de archivos que queríamos, nuestro framework. Y estas son cosas que tendrías que repetir manualmente h veces. Entonces aquí está la herramienta de andamios. Usa esto y haremos la mayor parte del trabajo pesado, poniendo en todo el B6, asegurándote de que no olvides nada y puedes continuar desde ahí. Entonces supongo que por eso nos dieron esta bonita herramienta. Sólo vamos a crear un pH de resultado vacío para no, fui a golpear Agregar y lo voy a llamar index.html, CSS HTML, y ya está ahí para mí. Así que voy a seguir adelante y pegaré Agregar. Por lo que ahora tengo este nuevo archivo de índice. Entonces si volvemos a mirar, vemos páginas slash cars slash index que solo te estoy dando una idea de la URL porque index siempre será el primer archivo. Entonces cuando vayamos a recortar autos, automáticamente buscará el archivo de índice para cargar eso primero. Muy bien, entonces lo que queremos hacer aquí, voy a decir Ver datos. Vamos a estar escribiendo estas cosas manualmente nosotros mismos. Fuimos a decir título. Recuerde que se ve, el tipo de datos es un marcador de posición que se alimenta en el diseño. Y sólo voy a ver lista de autos. ¿ Está bien? Lo que quiero hacer es simplemente decir H1, lista de autos, algunas cosas simples. No estamos listos para complicarnos demasiado o simplemente sudar o apetitos y entender qué, y si miras esta página de índice, verás que se ve muy similar a la otra página de índice. El motivo por el que las páginas de índice no se tocan es que las subcarpetas en las que están son diferentes. Este índice está en las páginas generales, por lo que esta es toda la página de toda la aplicación. No obstante, cuando entramos en los autos de barra, los autos smash tendrán su propia primera página y archivo de índice está haciendo para ser diferente, pero verá que tienen los mismos 2s directos. Esta es una página, Aquí hay un modelo y usando el espacio de nombres allí para este modelo versus el espacio de nombres para el otro. Una vez más, obtenemos nuestro código detrás archivo para nuestro modelo de índice. Si quisiera navegar a esta nueva página, lo que necesitaría hacer es modificar mis alelos y dejar que la barra navbar tenga el nuevo enlace. Entonces sólo voy a copiar uno que existe ahí está. Simplemente copiaré el enlace de la página de inicio existente y lo cambiaré todo para verlo para que no tengamos un área. Tenemos la página ASP. ¿ Dónde se paga la ASP? Entonces las páginas ASP ya no recortan el índice. Es el índice de slash cars slash. Aviso que no necesariamente necesitamos la extensión donde no necesitamos la extensión. Entonces es aquí donde tipo de obstruyeron algunas de las cosas a las que estamos acostumbrados con ba, HTML básico. Porque si lo miras con cuidado, aquí no hay etiqueta de deriva H. No decir que no podemos usar una naturaleza si pudiéramos. Podríamos decir que h es igual a tope adentro. Si vamos a ver hf es igual a construir la URL exacta para llegar de aplicación a página es que los autos van a ser un poco difíciles porque no podemos sólo ver el nombre del archivo lo haría extensión como si no pudiéramos CSS básico y HTML. Entonces lo que nos han dado se llaman ayudantes de etiquetas, donde dirán solo 0 me basado en el camino de la estructura de carpetas. Y voy a generar ese H ref para ti. Entonces la página ASP es igual a, y sé que tengo que ir a recortar autos. Entonces la primera slash significa la raíz de la aplicación. Entonces tengo que ir a la carpeta de autos. No tuve que ir al archivo de índice. Ahí es donde debe conducir este enlace. Generará el riff H en tiempo de ejecución. Lo veremos en unos pocos. Por lo que quiero que esto diga autos. Muy bien, así que ahora tenemos una nueva URL con una nueva página. Y voy a seguir adelante y correr como, oh, sólo estamos haciendo cosas de interfaz de usuario. Podemos simplemente hacer Control F5. No tenemos que depurar cada vez porque de esta manera es un poco más rápido. Ahora estamos cargando nuestra página de aplicación. Recuerda que esta es nuestra página de inicio que migramos desde nuestros archivos estáticos. Y si quisieras migrar a los otros, y probablemente también seré una buena práctica para ti. Pero ahora mismo estamos empezando con esto. Y luego cuando hago clic en autos, antes de que incluso haga clic en autos, es inspeccionar elemento. Inspeccionar elemento nos va a mostrar el H ref por cómo llegamos ahí. Si miras el miedo de las aurículas, dice barra de EHR, eso significa ir a casa. Slash cars significa meta de la URL base, que es lo que vemos en el navegador, localhost con ese número de puerto slash cars. Si nos fijamos en éste, verás localhost slash privacidad. Cuando voy adelante y golpeé los autos. Entonces veo que estoy aterrizando en mi nueva página, que es lista de cartas. Ves que ni siquiera tenía que decir especialmente index.html. Porque por defecto, en todas partes navegador irá primero a la página de índice. Entonces eso es realmente todo lo que se necesita para construir un nuevo enlace y conseguir que las páginas se vean. Muy bien, ahora veamos en espera el archivo de código y el archivo HTML puede interactuar con él. En este momento estoy mostrando esa lista de autos texto directamente en la página. Tal vez no siempre sea el caso como vimos cuando estábamos haciendo la codificación C Sharp. En ocasiones los datos que necesitan ser mostrados o interactuados con estos dinámicos a partir de la entrada del usuario. Necesita estar en una variable de alguna manera, pero aún necesitamos mostrarla. Entonces, ¿qué pasa si quisiera poner este bit de texto en una variable en el archivo de código y luego tenerlo mostrado. Así que sólo voy a cortarlo en el archivo de código. Lo que voy a hacer dentro de nuestra clase es darle una nueva propiedad. Así que sólo voy a decir prop, presione Tab dos veces y luego digo cadena. Y esto va a estar golpeando entonces en get one, la página carga este método llamado get es el primer método que se llama. Cada vez que navegues a una página, vas a golpear eso en, conseguir lo que quieras preparar para esa página. Si tienes que cargar datos, si tienes que sentarte en un mensaje como si estuviéramos a punto de hacer no, tienes que asegurarte de hacerlo en Git, entonces todo eso estará listo para cuando el pH se cargue al usuario. En este caso, quiero ver rumbo es igual a los tics que acabo de empatar, que es lista de autos. No, estoy preparando esta variable. Me estoy asegurando de que el valor esté disponible ante el paciente o es como hago que el valor se muestre en la página? Bueno, en la propia página, donde quiera que la quiera, que estaría entre estas etiquetas H1. Y entonces esto es lo que llamamos las vistas de la navaja borrador o levantamos una sintaxis. Más bien, la sintaxis de la razón nos permite entretejer o un código C-Sharp con nuestro código HTML. ¿ Está bien? Así que en cualquier momento ves un anuncio diciendo que te está preparando para escribir código C-sharp, porque este es el código C-Sharp que es un espacio de nombres de C-sharp. Sin embargo vemos HTML en el pH. Muy bien, así que déjame mostrarte si quería imprimir algo desde el lado C-agudo en lugar del HTML, todo lo que necesito es al firmar. Básicamente desde esa directiva que estás a punto de escribir C-sharp, ningún modelo es como una variable estática o una variable global que representa un objeto del modelo, que es el código todo lo que sea público en el código detrás archivo como este encabezado ya está disponible para mí por mí viendo modelo dot. Entonces obtengo todas las propiedades del modelo incluyendo mis personalizadas. Verás algunos que no pusiste. No hay problema, no te desanimes, no te vuelvas flusterizado ni nada. Pero si miras de cerca, ves golpear. Esa es la que acabo de crear. Sólo puedo decir encabezado model.py. Y luego si guardo eso y luego refresco la página y lo que puedes hacer mientras estás en este punto, siempre puedes simplemente hacer una compilación usando Control Shift y B. Y luego puedes simplemente refrescar la página. Probablemente aún tengas abierto desde cuando estabas depurando. Pero entonces usted ve aquí que todavía estamos viendo una lista de autos. Y si inspecciona elemento, no hay indicios de que sea C-Sharp o HTML. En lo que respecta a Brasil, solo está viendo el HTML. Entonces esa es una oferta polar es una sintaxis. Podemos poner dinámicamente cualquier cosa allí. Si quisiera cambiar el encabezamiento en lugar de mantener toda la página. Y si tuviera que mostrar que toma múltiples lugares en lugar de tener la estática toma múltiples bases, lo puse en una variable. Aquí. Lo cambio de variable solo para que sepamos que está funcionando. Y fui a hacer una construcción. Ahora una vez que se haga esa construcción, voy a hacer una actualización. Y luego C, Ahí vamos. Esta cosa autos de variable. Eso hace que sea mucho más fácil hacer una página dinámica donde podríamos tener que cambiar el texto sobre la marcha. Lo cambiamos una vez. Y entonces solo podemos conocer referencia a ella tantas veces en nuestro código como queramos. A diferencia de cuando estábamos haciendo nuestras páginas estáticas y si sumamos lo duro toma múltiples lugares, tenemos que ir manualmente y cambiar. Está en todas partes. Podemos hacer eso aquí, sólo agradable y fácil. Entonces si replico todas esas páginas son cruzadas o todas esas etiquetas, ahí está. Si lo cambio una vez, se cambia tantas veces. Muy bien, entonces esa es una forma agradable y fácil de entender cómo funciona la sintaxis. Cómo podemos poner algo en el archivo de código y acceder a él dentro de la página Razor. A continuación te voy a mostrar nuestro primer pedacito de lo que llamamos inyección de dependencia. Entonces lo que vamos a hacer es mover este texto de encabezado de la variable C-sharp aquí. Y lo vamos a poner en la configuración de la aplicación y luego vamos a mostrar un todo, solo se puede inyectar un absceso. Estas configuraciones, comen con bastante facilidad y las muestran en la página de la misma manera. 5. Mensaje desde ajustes: Por lo que ahora vamos a estar mirando cómo podemos inyectar dependencias en nuestro pH y acceder a los datos una manera muy lo que llamamos desacoplada. Entonces esa es una de las cuatro características más y marquesinas consulta de enlace descendente hace lo que llamamos inyección de dependencia, que es un principio muy importante en el desarrollo sólido. El D en la palabra sólido en realidad significa inyección de dependencia. Tan sólido es un montón de principios que nos ayudarían a practicar prácticas de codificación limpias y buenas. Y la inyección de dependencia es muy importante. Y.NET Core mezcla dependencia inyección, muy, muy fácil para nosotros. Lo que vamos a hacer es en la configuración de app dot archivo JSON, voy a poner en una nueva configuración. Y una vez más, esto es sólo para fines demo solo para que podamos entender cómo fluye todo tipo de y todo. Entonces vamos a sentarnos a una coma. Y luego fui a crear una nueva sección o un nuevo nodo para decir que esto es mensaje. Por lo que estoy llamando a este mensaje. Entonces básicamente lo que tenemos es como un par clave y valor. Entonces aquí estoy creando mi volumen y todos están separados por comas. Se nota que el registro es la clave y luego el valor es lo que llamamos objeto. Y el objeto tiene una clave que tiene en otro objeto, y cada clave tiene su propio valor. Cada vez que ves un colon, lo que está a la derecha es el valor, lo que está a la izquierda es la clave. Y luego la coma separa los nodos principales. Entonces este es un nodo Min que separa un host de carga, que es otra carga o vinculación de claves Vardy. Y luego eso es coma. Por lo que estamos creando nuestro propio mensaje de par de claves válido. Y entonces esa es la sintaxis básica JSON. Agradable y fácil de entender. Mensaje va a tener el valor. Esta es la lista de autos. Lección mensaje simple. Nada demasiado elegante. Sabes, lo dije en las cosas opuestas. ¿ Cómo accedo a este texto en la página para que se muestre más en el ADN al usuario. Entonces lo que tenemos que hacer es ir a nuestro archivo HTML index.js. Voy a crear otra propiedad. Voy a llamar a éste de menos. Por lo que para duplicar su control D o Control CNV, similar a Visa Studio Code, pero también funciona Control D. Tengo otra propiedad. Lo estoy llamando mensaje. Y necesito sentar mensaje para tener el valor del archivo de cosas opuestas, lo que significa que necesito acceder a la configuración. Por lo que al igual que discutimos en el archivo de inicio, estábamos inyectando aquí el objeto de configuración. Y entonces eso nos permitió acceder a cualquier cosa, o al menos los cargo porque no escribimos esto. Quien escribió esto hizo esa inyección para poder acceder a la configuración que lo hará. Vamos a seguir ese modelo. Los principios de inyección de dependencia uno, tienes un constructor, por lo que vamos a escribir C TOR presionar Tab dos veces y luego obtenemos el constructor. Comienza listas de parámetros, lo cual está bien. Pero entonces tenemos que decirle a qué dependencias debería ayudar. Entonces le voy a decir que debería estar usando la configuración I. Y si lo desea, sólo puede entrar en la startup sobre CS y se puede llevar la configuración I. Y estamos llamando a la configuración de variables. Línea roja significa que necesitamos una biblioteca, así que control dot y yo sólo puedo seguir adelante y golpear Enter. Por lo que incluirá la declaración using. Por lo que sólo hacemos eso y conseguir que la línea roja de la declaración de uso desaparece. No, necesito inicializarlo. Entonces le estoy diciendo que necesito la figuración ícono de la inversión de contenedor de control o veré contenedor. El startup básicamente pone todo en ese contenedor entre la startup en el archivo program.cs. Ponen esas cosas en el contenedor y luego en cualquier lugar de mi aplicación puedo acceder a ellas desde el contenedor. Así que literalmente cargó todo, Todo desde este archivo de configuración de aplicación en ese contenedor. Y estoy viendo que quiero acceder a ese archivo, que luego se obstruye a este tipo llamado configuración Uyghur. Necesito una variable local que pueda usar mientras que en esta página para acceder son como una copia. Entonces lo que voy a hacer es sólo decir conducto de control después de ponerlo en el constructor. Y luego fui a decir crear y asignar configuración de campo, y eso automáticamente hace ese proceso de inyección por mí. Por lo que ahora tengo esta versión local sólo para que podamos verlas de manera diferente. Voy a llamar a éste un subrayado. Y tiendo a hacer eso con mis campos en la configuración de partituras y puntos de Control para cambiar el nombre en todas partes, por lo que se deshace de ese error. Ahora que tenemos este objeto de configuración inyectado uno e inicializado y accesible a la página. Ahora puedo decir que mi mensaje debe ser igual a configuración. ¿ Está bien? El objeto de configuración me permite ver, dame la clave lo que quieres acceder para que recuerden que acabamos discutir par clave-valor es cuál es la clave que quería acceder al mensaje. Voy a ver la clave es mensaje. Recuerda de IRA, Básicamente es una matriz. Este archivo se convierte básicamente en una matriz a la que ahora puedo acceder usando la clave como subíndice. Una vez que hago eso, ahora tengo una nueva variable llamada mensaje que es accesible a mi página de índice. Así que puedo debajo del encabezamiento, poner tal vez unas etiquetas h4. Y luego solo vamos a separarlos con una etiqueta de RRHH. Se pone un poco de fantasía con él. Y fui a decir, firmaría modelo dot. Y luego recuerda que una vez que digo model.py tienen acceso a todas las propiedades que están dentro de la clase modelo, puede acceder al mensaje. Ningún mensaje no es sólo algo que escribimos y pusimos en una variable. El mensaje está afrontando todo el camino desde el malestar. ¿ Ves hasta dónde estamos lo que está trastocando? Tiene el valor y el par de claves para el mensaje. Y luego en la página, cargue. Estoy viendo cuando estás cargando esta página, quiero obtener una copia de este objeto de la dependencia o del contenedor del COI. Y estoy creando mi copia localmente. Y luego sobre la marcha puedo ver dónde se está cargando la página, ir a esa copia local del archivo de configuración de la aplicación, consígueme el valor que tiene el mensaje clave. Cuando hago todo eso, puedo hacer una construcción. Y todavía tengo mi página de la depuración anterior y lo ves sólo actualizaciones para mí? No. Estoy viendo ese mensaje viniendo desde el archivo de configuración de la aplicación. Eso es básicamente todo Dependency Injection funciona a medida que crece la aplicación. Vamos a ver definitivamente más de eso. Pero al menos esto es un bonito poco esencial de cómo en realidad se puede acceder a datos de otras partes de la aplicación y aún así conseguir que se muestren en la página. Y tus usuarios nunca serían más sabios en cuanto a dónde vienen estos datos, ya sea una base de datos o se trata de una variable en segundo plano. Pero estamos en control por lo que sabemos cómo hacerlo dinámico. Los usuarios solo viendo lo que parece ser una página muy estática, cargarla a ellos. 6. Añadir un marco de entidad: Hasta ahora hemos estado viendo algunos de los conceptos básicos de cómo podemos conseguir páginas de Razor muestren fechas dinámicas vienen de nuestro código C-Sharp. La realidad, sin embargo, es que nosotros, en nuestro escenario, realmente no vamos a estar codificando duro este tipo de valores y poniendo en variables y mostrando, sobre todo dado el tipo de aplicación que estamos edificio, que es una aplicación de reserva de autos donde vas a necesitar lista de tarjetas que puede demostrarse cambiar. Entra a la empresa un auto nuevo, uno se retira, etcétera donde fuimos después de gestionar la reserva. Entonces lo que tenemos que hacer es encontrar una forma muy dinámica de almacenar realmente este tipo de datos. Entonces necesitamos emplear los servicios de Entity Framework para que podamos uno, crear la base de datos para interactuar con la base de datos, y tres, seguir construyendo sobre la base de datos. Lo que vamos a estar haciendo antes de meternos en alguna de las complicaciones es engendrar, lo que necesitamos almacenar, lo vamos a hacer relativamente simple, pero es bastante complicado que podamos conseguir buena idea de lo que hay que cubrir en un escenario general. Lo que queremos hacer es emplear a la S en sólido, que es separación de preocupaciones. Y el principio detrás de eso es uno, un método o un archivo nunca debe tener más de una responsabilidad. Por eso es bueno que para cada página haya un archivo de código dedicado. Entonces toda la responsabilidad de este archivo de código es para esa página. Lo que vamos a hacer es quitarlo solo archivos y lo vamos a aplicar a proyectos. Ahora que estamos pensando en las interacciones de la base de datos, lo que tenemos que hacer es crear otro proyecto que va a hospedar o wholes más bien todos nuestros objetos relacionados con la base de datos. Solo voy a minimizar o colapsar la reserva del auto y fui directamente a la solución. Haga clic en Agregar. Y voy a crear un nuevo proyecto. De este listado de proyectos, vamos a elegir una biblioteca de clases. Entonces si no lo tienes en el reciente proyecto estimula, siempre puedes buscar. Lo que queremos es una biblioteca de clases C-Sharp. Puedes seguir adelante y seleccionar eso y estamos llamando a esta reserva actual hasta punto Theta. Entonces el nombre va a significar que este es el proyecto de datos. Hit Next, y queremos mantenerlo como un proyecto dotnet F5 y crear una librerías de clase de versión muy despojada de la obligación C-sharp son dos proyectos C-sharp a los que se solían. Porque se puede ver que este proyecto acaba de decir que archivo CSV y el único clasificador, casi parece una aplicación de consola y los expositores conocen program.cs. Y si incluso miras en el archivo del proyecto real, verás que todas las lágrimas son solo el marco objetivo. Si vuelves a tu consola, aplicaciones de C-sharp, notarías que también tienen una instrucción de ejecución para hacerle saber que se trata de un archivo ejecutable. Lo que vamos a necesitar hacer aquí es eliminar la primera clase, es definir algunas clases. Entonces nuestro, lo que estamos haciendo es crear entidades, que realmente sólo podría pedir archivos que se convertirán en tablas de base de datos. Entonces lo que sea, y ya miramos OOP, sea cual sea que nuestras propiedades de los datos que quisiéramos almacenar. Estamos creando nuestra clase para representar eso, que más adelante en realidad nos convertiremos en una tabla a través de la API es que Entity Framework nos permite por ahora solo queríamos entender cómo diseñamos el modelo de dominio. Por lo que nuestro primero me dejó modelo, desde que empezamos con los autos, serán cuatro cartas. Por lo que queremos una mesa para almacenar los autos. ¿ Cuáles son las propiedades de los autos que necesitamos para almacenar? Bueno, en general, eso podría diferir en función de las necesidades empresariales, los diferentes escenarios. Así que sólo voy a basarlo fuera de mi escenario. Podrías hacer un poco más o financiarlo necesita hacer un poco menos que yo. Pero mientras comprendan el alcance general de lo que estamos tratando de lograr, entonces eso no es problema. Lo que tenemos que hacer es crear nuestra primera lección haciendo clic derecho en el proyecto de datos, estoy agregando una clase y lo voy a llamar símbolo de coche. Dentro de coche. Vamos a hacer pública esta clase. Y luego defendemos las propiedades. El primer inmueble de cualquier tabla de base de datos. Si aún no has hecho bases de datos, no te preocupes por mí esto lo más amable posible. Si estás familiarizado con las bases de datos, sabrás que el siempre empieza con una clave primaria que es auto-incrementando. Si está familiarizado con el uso de SQL Server o así sucesivamente. Sabes que tienes que pasar por unos pasos, tienes que sentarte y restricción de identidad, también tienes que hacerle saber lo más incrementos IN1 y así sucesivamente. Con Entity Framework o en el diseño una entidad que sabemos que vamos a utilizar Entity Framework para manejar. Todo lo que realmente necesitas hacer es llamarlo ID. Simplemente haciendo esto en diferentes donde sabremos que, vale, esta es la clave primaria y debe ser auto-incrementándose. Eso es todo. Por lo que siempre tienen la clave principal para cada, la mayoría, si no todas las entidades, el 90% de sus entidades siempre debe tener un valor de clave primaria llamado ID. Si no quieres llamarlo ID, entonces hay otras cosas que podrías tener que hacer. Usando Entity Framework para que reconozca como clave primaria. Pero entre llamarlo ID o ID de coche o identificador de nombre de tabla, esos dos garantizarán que Entity Framework Core fue visto como la clave principal. Tenemos una identificación, ¿qué necesitamos? Voy a decir pública int año, tal vez el año del vehículo sea importante, también. Ir a almacenar el año. Y lo siguiente que voy a almacenar es el nombre de la cuerda, nombre del vehículo, Toyota Yaris, etcétera sólo voy a mantenerlo simple y eso siempre está tirando una pelota. El auto habría creado nuestra primera entidad. Ahora lo siguiente que necesitamos para que Entity Framework reconozca que esta clase debe ser una tabla, se llama contexto DB. Entonces DB abreviatura de contexto de base de datos, lo que significa que estoy mirando todos los recursos en la base de datos, y los reconozco como tales. Vamos a estar configurando el contexto DB. No vamos a estar conectando ni creando ninguna base de datos por el momento. Sólo estamos estableciendo las bases, ¿verdad? No. Voy a hacer clic derecho una vez más y agregar otro archivo, nuevo elemento o clase más bien. Y voy a llamar a esta reserva de un auto. Db contexto, niacina, nombre fácil de recordar. Carb mirando hacia arriba contextos DVI, sólo otro archivo de clase. Ahora el contexto DB va a ser una vez más público. Y va a heredar de una clase base que nos da Entity Framework llamado contexto DB. Con sólo escribir el contexto DB. Y si le das a Visual Studio unos segundos, te darás cuenta, de acuerdo, maravillas y herramienta de libro de errores, para poder utilizar los contextos DVI, necesitas instalar un paquete llamado marco NTD. Por lo que tienes Entidad Marco y trabajo anti diferente Corte. Estamos utilizando dotnet Core, por lo que tenemos que usar Entity Framework Core, que es el último y más grande de Entity Framework. Ahora lo genial es que necesitamos usar un gestor de paquetes. Entonces, en lugar de que tengamos que irnos y encontrar las cosas manualmente, Visual Studio viene con un gestor de paquetes llamado New get. Tenemos dos opciones. Podemos permitir que simplemente siga adelante y lo encuentre para nosotros e instalarlo. O podríamos ir manualmente, hacer clic derecho y presionar Administrar paquetes NuGet. Por lo que es bueno entender todas tus opciones porque el desarrollador que lo sabe necesita Entity Framework probablemente comenzaría aquí. Probablemente sólo irías a NuGet, ir a los bros. Y luego vería todos los paquetes disponibles para él. Y entonces realmente vería que tienes Microsoft dot Entity Framework Core dot SQL Server. Y ahí está la que se anunciaba para decir que tengo un montón de otros, pero no vamos a preocuparnos por los que no necesitas. Así que en realidad, vamos a estar usando bases de datos de SQL Server en diferentes núcleos de trabajo es en realidad de código abierto y disponible para la mayoría de los motores de bases de datos. En MySQL, postgres SQL secuela luz, todos ellos son diferentes motores de base de datos o proveedores. En el marco proporciona API que le permiten usar C-sharp para hablar con cualquier puerta única. No obstante, si nosotros, ya que estamos utilizando SQL Server, sólo podemos seguir adelante e instalar el en diferente trabajo core dot SQL Server, que nos dará las API del servidor SQL así como la biblioteca base para Entity Framework Core. Así que sólo voy a usar NuGet gestor de paquetes. Y todo lo que tengo que hacer es golpear esta flecha hacia abajo. Podemos elegir versión. Vemos que esta es la última versión estable. No es necesario modificar eso. Golpea Instalar, darte unos segundos. Podrías obtener licencias y acuerdos pronunciables. Y como esos co-morbosos, basta con hacer clic en Aceptar y aceptar y denotar el tiempo que está instalado. Y cuando volvamos al proyecto CS, verá que se agrega un grupo de artículos donde el paquete hace referencia que se pone. Eso está bien. Podemos dejar que lo dejemos hacer lo suyo en el fondo. Pero ahora cuando vamos alrededor de dos contextos de dB y control, vemos que tenemos la capacidad de simplemente agregar el espacio de nombres. Esa fue nuestra primera prueba de cómo podemos usar NuGet package manager para agregar bibliotecas que faltan inherentemente. Adelante en la declaración de uso. Ahora tenemos el contexto DB. Para que podamos dejar que el contexto DB sepa cuáles deben ser las tablas. Tenemos que sumar al público DB sit. Entonces le decimos crea un Db, Db ciudades Entity Framework. Habla por una mesa. El contexto representa la base de datos, conjuntos BB representa una tabla. Tenemos que proporcionar el modelo que deben basarse estas tablas. Bueno, hemos creado nuestro modelo en forma de auto. Alguien que diga base de datos. Tendrás una mesa en coche modelado. Y debes llamarlo autos cuando se crea en la base de datos real. Así que veamos eso otra vez. Toda esta clase representa nuestra base de datos en todos los activos que estarán ahí para ver las tablas, procedimientos almacenados, etc. Una vez que queremos agregar una tabla, queremos la mitad para crear el modelo que debe seguir la tabla. Entonces en el caso del auto, le dimos las propiedades que sabemos hacer la clase por no. Esto es realmente solo mostrar cómo se ve nuestra clase como una tabla en términos de desarrollo de bases de datos. Acabamos de crear una clase con todas las propiedades, todos los campos que conocemos nuestra o tabla necesita para tener los tipos de datos. Y luego le estamos diciendo al contexto de la base de datos que necesito una nueva mesa o un conjunto DV de tipo auto. Y quería llamar a autos. Cuando volvamos, lo que vamos a hacer es configurar mi agresión donde en realidad le decimos uno, generar código que va a crear la base de datos y vamos a evaluar cómo eso mira y hacia nosotros realmente lo haremos esa base de datos y ver que todo esto va a funcionar en la forma en que estamos hablando de ella. No. 7. Añadir base de datos a Proyecto: Bienvenidos de vuelta chicos. Entonces ahora vamos a estar sentados o base de datos real. Ya configuramos nuestro contexto, que básicamente representa una conexión a la base de datos. Ya creamos al menos una entidad o una tabla para esa base de datos. No, necesitamos una vez arriba lo que llamamos cadena de conexión. Y luego para crear lo que llamamos migración, que sería el conjunto de instrucciones que podría usar Entity Framework para informar cómo va a ir sobre la creación de la tabla y la base de datos y cualquier otros activos que deben crearse en consecuencia. Subimos a nuestra configuración de aplicaciones desde nuestra reserva de autos. Y lo que tenemos que hacer aquí es agregar nuestra cadena de conexión. Ahora la sintaxis para un flujo clínico se ve algo así, y lo acabo de agregar justo encima del registro. Entonces recuerda que todo esto es un gran objeto JSON. Estoy agregando una nueva clave llamada cadenas de conexión. Y luego esa clave tiene un valor de objeto que toma otro par de valores clave, conexión predeterminada, y luego este es el valor. Así que vamos a pasar por lo que tiene este valor. Este valor tiene un servidor y el nombre del servidor es más o menos el nombre de la máquina o el nombre de la instancia de base de datos. Si no estás tan familiarizado con las bases de datos, eso está bien. Contamos con un proveedor de base de datos incorporado con Visual Studio llamado Local DB, MS Sql base de datos local, siempre se puede llegar a estas bases de datos yendo al Explorador de Objetos de SQL Server. Si no quieres tenerlo de un lado como yo, siempre pueden ir a View. Y luego puedes buscar Explorador de objetos de SQL Server. Entonces esto te da acceso instantáneo a esa instancia de base de datos y puedes simplemente desplegable y es local DB slash MS SQL local DB en el B2C, todos esos servidores de bases de datos es igual a Debian local, escríbelo exactamente cómo lo ves. Paréntesis abierto, DB local, paréntesis de cierre. El doble slash es porque necesitamos escapar de la barra. Si tenemos una sesión, se obtiene ese error. Necesitamos tener esa barra doble en el contexto de este archivo y MS SQL DB local. Entonces tenemos un punto y coma y luego indicamos la base de datos es igual a auto reservando arriba en la puntuación db. Ahora, una vez más, aún no hemos creado esta base de datos, pero sabemos cómo queremos que se llame la base de datos, por lo que le estamos haciendo saber en ese momento. Más adelante verás que tienes conexión de confianza es igual a true y múltiples conjuntos de resultados activos es igual a true. Por lo que se trata de entidades relacionadas con la seguridad para la usabilidad. solo puedas seguir adelante y replicar todo eso. Ahora después de haber volteado en nuestra cadena de conexión, necesitamos dejar que la aplicación o que al inicio estés usando esta cadena de conexión para la base de datos. Todavía en nuestra app web, vamos a jumbo a la startup. Entonces en los servicios de configuración, vamos a registrar nuestro hilo de contextos DB. Entonces fui a decir servicios que agregan contexto DB. Y luego pongo en nombre de los contextos DVI. Y como estoy haciendo esto, estoy mirando a través y viendo que tengo un nombre aquí y otro nombre de este lado. Entonces en realidad esto es lo que quería que me llamaran. Lo llamé Libro de autos Up DB context en error. Fui a actualizarlo, ¿verdad? Ningún carburador busca el contexto DB del nombre de archivo y luego actualiza el nombre de la clase en consecuencia. Muy bien, entonces ahora que se hace ese refactor, me siento un poco mejor y puedo volver aquí. Entonces los servicios dot BID, context, y la forma en que he escrito corchetes con el nombre del contexto DB, y luego tenemos las opciones. Entonces obviamente esto realmente no está registrado lo que estamos tratando de hacer, de ahí las líneas rojas. Entonces lo que voy a hacer es control dot. Entonces va a indicar que necesito agregar una referencia a mi auto reserva hasta proyecto de datos. Muy bien, entonces lo tenemos en dos proyectos diferentes a diferencial llamarán asambleas. Y en este momento el Visual Studio o la solución lo ve. Vale, estoy tratando de hacer referencia a algo que no está en el proyecto actual, que lo veo en otro proyecto. Te gustaría sumar la referencia que fui a decir que sí, por favor adelante y añada la referencia. Una vez que haga eso, verá que este nulo cambia a ese color que indica que sabe qué archivo es y todo es. De acuerdo, pero entonces todavía tengo otro error que sólo voy a controlar. Y me está diciendo que necesito agregar una declaración de uso para Entity Framework Core para poder seguir adelante y hacer eso. No, ya no tengo más errores. Eso es agujero. Agregamos ese bit de código con las opciones para usar SQL Server, como dije, Entity Framework, core puede soportar múltiples motores de bases de datos. Entonces estamos especificando que estamos usando SQL Server aquí. Y luego estoy buscando en la configuración. Recuerde, todo eso se inyectó antes, el punto de configuración get cadena de conexión. Entonces esa es una función incorporada de la configuración. Buscaban la conexión predeterminada. Entonces esa conexión predeterminada, y luego está obteniendo ese valor. Entonces a cualquier cosa que puedas haber llamado esto si no quisieras llamarlo una conexión predeterminada para mí, quería llamar a la carbocación hasta la conexión, sea que lo llames, solo tenemos que conseguir eso cadena de conexión aquí. Ahora hagamos una factura rápida solo para asegurarnos de que no hemos roto nada para construir fue exitoso. Vamos a seguir adelante. Por lo que el siguiente paso necesito realmente generar esta base de datos. Entonces como dije, tenemos que hacer una migración y luego podemos realmente generar la base de datos después de la migración. Lo que voy a hacer en proyecto de datos una vez más, voy a saltar hacia abajo a Administrar paquetes NuGet. Entonces vamos a buscar el paquete Entity Framework Core dot tools. Si no lo ves enumerado aquí, listo como es para mí, siempre puedes seguir adelante y buscarlo. Lo veo aquí. Sólo voy a seguir adelante e instalarlo como de costumbre. Adelante y acepta cualquier término y condiciones y sepa que está instalado. Permítanme simplemente darte un trasfondo rápido cuanto a lo que estas herramientas te permiten hacer. Si nos fijamos en la descripción de la biblioteca, dice que habilita a EE. UU., a usar comandos de uso común. Tienes agregar migración, eso es lo que estamos a punto de hacer. Ha caído la base de datos, obtener contextos DVI, cosas relacionadas con la migración, cosas relacionadas con el andamiaje, y migración de scripts y generación de comandos no relacionados. Entonces estos son todos los comandos y estos son en realidad comandos powershell que vamos a ejecutar usando nuestra consola de Package Manager. Esa consola de Package Manager, si no lo estás viendo donde lo tengo en mi barra de tareas, una vez más, siempre puedes ir a Herramientas y luego obtienes empaquetada manager y una consola de Package Manager. Muy bien, así que una vez que hagas eso, obtendrás una ventana similar a esta, donde te está pidiendo el comando. Lo que vamos a tener que hacer, uno es cambiar nuestro proyecto predeterminado o un proyecto de datos porque ahí es donde está nuestro contexto DB. Ahí es donde queremos nuestras migraciones y todo se levanta está relacionado con vivir. Fui a cambiar el defecto, predije un proyecto de datos. Y luego voy a decir agregar migración de guión e incluso puede presionar Tab para completarla por ti. Entonces voy a llamar a esta migración inicial. Después de eso, acabo de presionar enter. Se reconstruirá el proyecto y luego estoy recibiendo este error. No problemes. Entonces dice que mi proyecto de startup no hace referencia a esta biblioteca, eso está bien. Este paquete es necesario para que en el marco de herramientas Core funcionen. Así que en realidad nos están diciendo lo que está mal. No hay problema. Por lo que la señorita desciende la biomasa . Vamos a arreglarlo. Vamos a hacer clic derecho en nuestro proyecto web. Usa NuGet. Y solo estoy tratando de mostrarte lo fácil que es conseguir estas palancas una vez que faltan, obtiene más de lo probable que las tenga. Entonces adelante, ve a NuGet y luego solo voy a pegar el nombre de la biblioteca que decía. Una vez más, siempre se puede simplemente buscar en el, escribiendo la barra de búsqueda. Y luego una vez que lo consiga, solo puedo instalarlo. Cuando se hace eso. Ahora volveré a mi consola de Package Manager y solo presionaré. Así que cuando presionas la flecha hacia arriba, te compran el más recientemente, intentado, al menos intento de comando. Así que sólo voy a presionar, me compren esa migración, presione Enter otra vez, y en ninguna parte obtengo otro error. No voy a esconderme estas detenciones porque a veces se tiende a olvidar algunos de los pasos y es bueno ver los errores y saber trabajar a través de ellos. Claramente estoy olvidando algunos pasos aquí, pero eso no es problema ya el alcance del error, los arreglaremos. Entonces éste está diciendo que había una flecha accediendo a los servicios de alojamiento. Y tiene que haber algún constructor que tome la configuración que se está pasando. Entonces permítanme explicar exactamente lo que esto está diciendo. Bach, cuando habríamos configurado en nuestra clase startup que cada uno debería estar usando el contexto DB. Y estaría pasando en estas configuraciones. Entonces las opciones, más o menos todo este objeto aquí llamado opciones, nos permitirían poner en una serie de configuraciones diferentes que queremos ir y mantener interactuada la base con cuando la aplicación inicie su entidad. Es muy simple, ¿verdad? No, la única opción aquí es que debe usar la mezcla en cuerda. No obstante, esto no es suficiente porque mientras estamos tendidos aplicación utilizar esta base de datos y desconexiones, usted es este contextos de base de datos y lineal representan la base de datos que es nuestra desconexión y cadena. Tenemos que dejar que nuestros contextos DVI se supone que es una herramienta relativa, sean cuales sean las opciones que estemos pasando. Volvamos a saltar a nuestro contexto DB y crearemos un constructor. Por lo que sólo voy a leer CT OR, y presionar Tab, Tab. Y lo que tenemos que pasar aquí serían opciones de contexto DB. Y las opciones de contexto DB serían una herramienta relativa o arranque de coche en el contexto DB. Y sólo voy a llamarlo Opciones. Y entonces tenemos que dejar que el bajo note que debe usar las mismas opciones base por supuesto representa o contextos DB de la herencia. Esto está completando toda esa jerarquía de inyección de dependencia a la que habría aludido. Donde cuando se inicia la aplicación, una vez más, estamos viendo usar el contexto DB que se encuentra en este archivo y darle estas opciones para gobernarlo sin lo que acabamos de hacer con todos estos que línea de código. El contexto DB solo estaba sentado ahí en la-la tierra en ninguna parte dejándote saber esto es lo que ser consciente del hecho de que las opciones serán pasadas. Y también posible con los contextos DB, que es la clase base que nos da EF Core. Entonces ahora que lo hemos hecho, intentemos una vez más la migración a puerta. Y por fin tenemos un intento de migración exitoso. Muy bien. Ahora tenemos esta migración inicial. Por último, como obtendrías una nueva carpeta llamada migraciones que puedes colapsar. Pero cada vez que hacemos una migración o cada vez que hacemos un cambio a la base de datos, agregando una nueva tabla o columna o cambiando algo, tenemos que hacer una migración. El archivo de migración generará y dirá que estos son los cambios son estas son las cosas que voy a hacer. Y después podemos ejecutarlos y se mantendrá un historial. Por lo que es una buena manera de mantener un historial de todos los cambios que se están haciendo en la base de datos. Si en algún momento hacemos un cambio y eso no es exactamente lo queríamos no deseado para eliminar la migración, entonces se puede ejecutar literalmente el comando elimina la migración, que simplemente deshacer más migración reciente. Solo un escaneo rápido hasta lo que está diciendo este archivo de migración. Está diciendo, bueno, tenemos una clase llamada constructor de migración, que se está inicializando o positon más bien. Y entonces este constructor nos permite crear el nombre de la tabla es autos. Así que recuerda que sea cual sea el nombre que pongas aquí, ese es el nombre de la mesa entrando. Por lo que está diciendo crear una tabla con el nombre autos y las columnas deben ser ID. Recuerda que dije una vez que lo llames, ID sabrá automáticamente que su identidad, su clave principal. Ya está sentando todas esas restricciones en la columna ID, cuatro filas. Y creará el año y las columnas de nombres para nosotros. Eso está en la función. Entonces tienes un don not function, que básicamente dice, esto es lo que voy a hacer para deshacer esto. Entonces si alguna vez hacemos ACI en lugar la base de datos y luego el subrayado se dan cuenta, oh snap, eso no es realmente lo que quería después de mí. Tengo que cambiar esto rápidamente. Y se quiere deshacer la migración así como el cambio a la base de datos. Porque lo que sucede es que si los cambios ya aplicados a la base de datos en este momento este archivo no es no existe ninguna base de datos. Este es sólo un archivo de instrucciones para ver cuándo la base de datos esto es lo que voy a hacer. Si ya tienes la migración y ya la aplicas a la base de datos, entonces tendrás que retroceder la migración antes de poder eliminarla del historial. Este método don 't es lo que contiene instrucciones y decir, bueno, estos son los cambios que se hicieron. Bueno, esto es todo lo que voy a deshacer. Entonces éste dice crear una mesa con todas esas cosas. El Deshacer por eso sería dejar caer la mesa. A medida que avanzamos, veremos más de eso. Así que no te preocupes demasiado por ello. Sé que sólo queríamos asegurarnos de que ya tenemos que ser excretados. Entonces el siguiente comando que vamos a ejecutar es actualizar la base de datos. Puedes seguir adelante y ejecutar eso. Y luego una vez que eso ha sido exitoso, entonces podemos ir y verificar que nuestra base de datos fue creada. Así que vuelve a tu Explorador de objetos de SQL Server. Después expande, entra en bases de datos, y luego verá el auto iniciando BB. En esa base de datos, verás autos para una tabla y el historial de migraciones de EF como tabla. Por lo que esta mesa transporta todas las migraciones que se han aplicado a la base de datos. Y después veremos que esta base de datos se rellena a medida que ponemos más y más tablas en ella. 8. Clases de datos de Scaffolding: Muy bien, entonces ahora que hemos hecho nuestra migración, hemos creado nuestra base de datos. El siguiente paso lógico sería cargar la aplicación para interactuar con la base de datos. Porque, bueno, no querrías enviar necesariamente a tus usuarios a tu base de datos para poder gestionar el auto. No todo el mundo conocerá SQL, no todos entenderán cómo operar en ese entorno, por eso tenemos interfaces de usuario, nuestras aplicaciones web, que nos permiten realizar diferentes operaciones de una manera más fácil de usar. Muy bien, entonces lo que vamos a hacer es explorar páginas completas de razón hace que sea muy, muy perfecta para nosotros generar realmente interfaces de usuario para interactuar con nuestra base de datos. Ya como que empezamos a construir páginas antiguas para los autos. Y lo que pasaría es que tengamos la página de índice y el índice suele ser la lista de autos. Y entonces tendrías el otro lo que llamar a las páginas de multitudes. Entonces C y corroer representa crear, nuestro representa leer. Fuiste presenta actualización, y D representa eliminar crudo. Básicamente cada aplicación que alguna vez usarás en tu aplicación móvil en tu nevera, sea lo que sea, todo lo que están haciendo son operaciones crudas. Están mirando a la vista algo. Quitarlo si no lo quieres, cámbialo si no te gusta o va a crear otra cosa. Así corroe, ese es el quid de cada aplicación. Entonces lo que vamos a hacer es crear las páginas de multitud para nuestros autos. Debido a que necesitamos poder gestionar una flota, queremos ver todos los autos en datos BSO sobre para eliminar los que ya no están aquí. mejor alguien cometió un error tipográfico, quieres actualizarlo, etcétera En realidad solo voy a eliminar esta primera página de índice que creamos para autos. Lo que vamos a hacer es una página de índice scuffled y nueva usando Entity Framework. Entonces lo que podemos hacer es hacer clic derecho o carpeta autos ir a agregar una página Razor. Entonces cuando surja este cuadro de diálogo, tenemos tres opciones. Tenemos los vacíos, un pH, que ya miramos. Tenemos la razón por la que pgs es el Entity Framework, por lo que usaremos ese. Por lo que este siguiente cuadro de diálogo nos permite decir cuál es el nombre de la PGY1. Estamos reemplazando los bits de índice. Simplemente puedo decirle índice entonces la plantilla preguntaría, Ok, ¿lo quieres como plantilla de lista, editar plantilla. Por lo que en realidad podemos andamios carga de forma o toda la pantalla para lo que queramos. Entonces en este caso queremos la lista porque la página de índice, en términos generales, tendría la lista de cualquier tipo de datos o datos que esté mostrando. La clase más modelo sería la siguiente. Y la clase modal significa modelo caminado o modelo de tabla ¿se supone que debo usar al generar esta página? Entonces puedo decir auto. Lo haremos, lo haremos es seguir adelante y genera código para que pueda mostrar los diferentes puntos de datos de la entidad automotriz. El contexto de datos más por supuesto serían contextos RDB, que es donde se irán todos los objetos de nuestra base de datos. En fin, no queremos tener que cambiar ninguna de estas otras configuraciones y podemos seguir adelante y golpear Agregar. Sé que me encontré con este error que quizá no tengas, pero vamos a trabajar a través de este árabe porque desde versiones recientes de dotnet Core, este error ha ocurrido durante el procedimiento de andamios y se es bueno entender al menos agujero se puede conseguir alrededor de él. A veces es muy frustrante, pero vamos a trabajar a través de él. Por lo que hay pocas cosas que se recomiendan. Uno, lo necesitas y sólo voy a cancelar todo esto. Una es ir a Herramientas e ir a paquetes NuGet, Administrador de paquetes , lo siento, y luego a la Configuración. Y luego vas a limpiar todo lo que obtienes cachés. Entonces adelante y pega eso. A continuación es seguir adelante y construir o limpiar la solución. Entonces vamos a ejecutar una solución limpia. Y eso trajo tiene que hacer. Y luego estoy viendo que tengo dos errores aquí. Tengo un error con respecto a las versiones de los paquetes. Entonces eso es generalmente lo que causa este error. Cuando los paquetes son las versiones de los paquetes que podrías estar usando bullet necesariamente coinciden con las versiones que el andamio o busca. No estoy seguro por qué. Esta es una de esas partes más irritantes de ambos lo que Microsoft, el equipo de Microsoft ha estado haciendo en los últimos tiempos. Pero solo trabajemos a través del Alma. No, mis paquetes y sólo voy a hacer click en el archivo del proyecto y puedo ver que mis paquetes están en 5.09. Entonces lo que voy a hacer es dejarlos caer a 5.08. Entonces en el archivo CSV realidad puedo simplemente cambiar los bolsillos. Por lo que esta es otra forma en que puedes cambiar versión del bucket para que puedas cambiarla aquí mismo. Pero entonces si no estás del todo seguro de cuáles son los números de versión, no hay problema. usaremos que obtienes para la siguiente. Por lo que siempre puedes bajar al nuevo gestor de paquetes get in para ese proyecto en sí, mira las versiones instaladas, y luego verás qué versiones tienes. Y luego puedes cambiar esa versión. Por lo que solo dejaré caer la versión 2.08 y luego haga clic en Actualizar. Por lo que solo se puede hacer eso para la finalización del núcleo dotnet y paquetes de diseño para el Entity Framework. Después de haber hecho esa operación, veo que he construido con éxito. Entonces voy a probar de nuevo el andamio. Voy a hacer clic derecho autos tenían página Razor y luego pagina usando Entity Framework y simplemente llenamos las mismas cosas que acabamos de llenar. Entonces plantilla de índice es lista, clases de modelo, auto, y luego adelante y pulsa Agregar. Está bien, es como si fuera otra área. Éste al menos es un poco más informativo. Dice que hubo un ganando el generador de código seleccionado para regañar, instalar este bolsillo en particular. Entonces bien, no hay problema. Vamos a seguir adelante y seguir las instrucciones. En el fondo. Se puede ver eso y se llega a realmente empezar instalar ese mismo bolsillo. Voy a probar esto una vez más. Esta vez tenemos levantamiento. Entonces no sé que eso fue todo un ciclo de tratar de conseguir un trabajo distinto. Una vez más, sucede cuando se publican ciertas versiones, pero el mecanismo subyacente en Visual Studio no se ha actualizado para saber que esta es la versión de la biblioteca, se debe utilizar. Por lo que podría tener un poco de ida y vuelta con eso. Y como dije, no hay muchos recursos en línea para guiarte exactamente qué hacer. Esos pasos, en términos generales, funcionarán para ti. Pero con lo que terminamos es archivo índice. El archivo de código. En el valor del índice, se ve que se ha generado mucho HTML para nosotros. Y en el archivo de código verás que también se ha creado alguna cantidad de C-sharp para nosotros. Entonces discutamos brevemente lo que está sucediendo aquí. En el fichero índice. Empecemos con un archivo de código porque eso está en la lista. Mira lo que estamos viendo aquí es inyección. Entonces recuerda que hicimos forma de inyección de dependencia antes con un archivo de config porque la config tiene algo que queríamos. No queríamos crear una instancia completamente nueva del archivo de configuración cada vez que queremos algo. Así que en cambio estamos tomando esa copia compartida que estaba registrada en la aplicación para ser compartida entre todos. Entonces, en esencia, cuando habríamos ido a nuestra clase de startup y registramos contextos RDB, ya estábamos empezando a compartirlo a través de la aplicación, convirtiéndola así en un candidato a inyección en cualquier lugar que queramos. Entonces esto somos nosotros inyectando una instancia o inyectando la versión esquilada del contexto e inicializando nuestra propia copia privada en este fichero. Eso es inyección de dependencia en uno-a-uno. En cualquier momento que quieras hacer inyección de dependencia va a verse algo como esto y puedes inyectar múltiples cosas como a voluntad. Entonces no te limitas a una sola cosa a la vez. Ahora que tenemos el, en el contexto inyectado en nuestro índice, lo que estamos haciendo aquí es crear un objeto de lista de tipo auto, por lo que es sólo una colección de auto. Muy bien. Deberíamos llamar realmente a esto autos. Así que sólo voy a llamar a este autos porque es una lista. Y tiendo a ponerme muy específico con mi nomenclatura, al menos que lo pluralizo. Si es singular, entonces es singular. Por lo que puedes renombrarlo para usar puntos de Control y permitir que refleje hasta que todas las demás referencias para ti. Y entonces lo que tenemos está por conseguir. Entonces recuerda lo que discutimos cuando se carga la página. Tenemos el encendido, vamos, llegar aquí está siendo despedido. Una vez que navegamos a esta página de índice, se va a llamar automáticamente a este método. Este método configura cualquier dato o lo que necesitemos para la página, igual que hicimos con la config e inicializando nuestras variables en el ejemplo anterior. Entonces aquí estoy diciendo que mi lista actual de autos debe ser igual a. Y luego vamos a esperar los resultados de llamar a la mesa contextual dot cars y conseguir todos los elementos. Entonces este es el clásico Entity Framework. Entity Framework nos da acceso a la base de datos mediante este archivo de contexto. Cualesquiera que sean las mesas que declaramos, porque recuerden , autos, ponemos autos ahí, eso es nuestro. Eso es todo lo que está haciendo. Está diciendo contexto, dame los autos. Y entonces la forma en que funciona Entity Framework es que esto es lo que llamamos método de ejecución. Está viendo lista asíncrona significa que realidad me dan todo en la tabla como una lista. Y luego estamos almacenando esa lista en nuestra variable local o propiedad llamada autos. Después de todo eso se hace y se ha configurado la página, saltemos a nuestro HTML real. Entonces en la página HTML real, sabe que es una inexperiencia, dio su índice de no nombre encontró que todas esas pequeñas cosas son porque llamamos el índice de pH. Llegamos al botón Crear nuevo de cortesía, ¿verdad? Por lo que tenemos un enlace al crear nuevo. Por supuesto que esa página aún no existe, pero eso está bien. Obtenemos una tabla, y esa tabla tiene una cabecera o una sección de cabecera con las filas de encabezado. Por lo que tenemos el encabezado de la mesa para el año por delante, permitirnos el nombre. Entonces tenemos otra columna de cabecera de tabla que está vacía. Y luego para cada artículo que entró, el modelo dot car, modelar autos, esa es nuestra lista de autos. Y luego estamos usando eso para que cada bucle pase por cada ítem en esa lista de autos que estamos viendo. Dame un display para el año, dame un display para el nombre. Y en esa tercera columna que no tuvo ningún golpe, que podría haber llamado a estas acciones, tal vez lo que hay en esa tercera columna, dame tres enlaces querían editar, querer eliminar, y uno, sólo ver los detalles. Y cada uno pasará por encima de esa identificación. Recuerde, el ID de clave principal, Eso es lo que identifica de forma única una columna en la base de datos o ese rol en lugar de la base de datos. Y luego solo estamos atando eso al botón que cuando hacemos clic en Editar en cualquiera de estos roles, sepamos qué ID vamos a ver. Solo echemos un vistazo rápido a lo que se generó para nosotros. Aquí está nuestro pH. Esta es nuestra nueva página. Vemos aquí que tenemos algo parecido a una mesa. Si no estás familiarizado con todas las mesas, mira en Bootstrap, entonces eso es realmente lo que van a parecer. Pero tenemos la tabla, tenemos la columna para ti, tenemos nombre, y luego tenemos esa columna vacía la cual va a tener los enlaces. Lo que no tenemos son datos. Sí, tenemos la página que tenemos arriba que Create New button up top that index flood para que podamos empezar personalizar esta página a lo que queremos. En lugar de ver índice arriba arriba, podemos decir contrata lista de autos. Eso es básicamente lo que tuvimos última vez cuando hacemos eso y vemos si lo vemos refrescarse y cambiar. Muy bien, entonces lo que no tenemos sería crear nuevo. No tenemos ningún dato y tampoco tenemos ninguna de las otras páginas. Cuando hacemos clic en Crear nuevo, solo va a recorrer porque no hay página para crear una nueva, volvemos, lo que vamos a hacer es crear un repositorio de GitHub para este proyecto. Y luego podemos seguir desarrollando nuestras características. 9. Añadir proyecto a GitHub: Muy bien chicos, Así que estamos de vuelta y lo que vamos a hacer en esta lección es sentarse o repositorio de GitHub para nuestros proyectos. No, GitHub, hemos pasado por esto. Es herramienta o plataforma muy, muy útil para guardar una copia de nuestro proyecto uno y mantener la historia de nuestro proyecto. También nos permite colaborar con nuestros compañeros o amigos en un proyecto muy fácilmente. Museo Studio, microsoft compró GitHub hace años y desde la integración entre las herramientas de Microsoft y GitHub, es decir visual Studio y ya viste Visual Studio Code. Esas integraciones realmente han madurado y se han vuelto muy, muy, muy poderosas. Entonces vamos a ver cómo podemos enviar toda la información de nuestro proyecto usando Visual Studio a GitHub y en mantenerlos sincronizados. Por lo que es realmente simple hacer eso. Lo que podemos hacer es simplemente mirar en la esquina inferior derecha de nuestro Visual Studio. Y veremos este botón que dice Agregar al control fuente. Para que siga adelante y haga clic en eso y verá obtener. Así que ponte a instalar en tu máquina automáticamente cuando se instaló Visual Studio, si no estaba ya instalado desde cuando hiciste este ejercicio usando Visual Studio Code. Pero no, dirán crear un repositorio Git y configurarán el repositorio local. Y luego también te permitirá crear el repositorio de GitHub fuera de la caja. Así que si no estás diciendo No siguió adelante e inicia sesión, probablemente te pedirán que ingreses con tus credenciales de GitHub este punto. Pero luego a partir de aquí, puedes indicar que quieres un repositorio privado y eso está bien por ahora. Puedes dejarlo como privado de realidad se dio cuenta que cuando desmarques esto a menos que arreglen comprador a granel, no, pero no lo crearía en GitHub si no lo hicieras privado, no enteramente seguro por qué, pero siempre se puede volver atrás y cambiarlo a público si así lo desea. Lo dejamos como privado. No tenemos que poner en una descripción ni nada más. Y nos están diciendo cuál será el tweet de URL. Para que puedas seguir adelante y hacer click, Crear y empujar y darle unos momentos. Y no conseguí ninguna abierta indica que estaba terminada. Pero si miro en la esquina inferior derecha, estoy viendo que el botón para decir add ya no está ahí en lugar de camino centímetro, me está diciendo que tengo una rama maestra. Va a ser lo que llamamos el control remoto. Recuerda, habíamos configurado ese remoto, que básicamente tiene ese enlace al repositorio remoto. Tiene cambios pendientes y compromiso que podrían estar en empujado saber en recursos. Verás que todos los archivos del hub null del Explorador de soluciones, pequeños candados, estos lotes de botones indican que la versión que está en tu máquina no ha cambiado desde la última actualización de la servidor. Entonces si entro y encuentro con algún ajuste y solo haré un ligero ajuste a este expediente. Entonces verás que se deshace de esta garrapata roja. Significa que sí, este archivo ha sido modificado y tenemos otro panel llamado buenos cambios. Si no es donde está en mi pantalla para ti, siempre puedes ir a View y verás buenos cambios. Muy bien, así que una vez que abras conseguir cambios, te mostrará los archivos que se cambien y esperando estar comprometidos. Por lo que tiene su mensaje de confirmación, por lo que sí dice archivo de índice modificado. Entonces la forma más fácil de hacer esto sería comprometerse todo y ver lo que esto hace es empujar y tirar. Enviará sobre tus cambios y pullover algún nuevo cambio que pueda haber ahí? No. Hay situaciones en las que podrías terminar en conflicto con tu colega, lo que significa que hiciste un cambio a esta página de índice. Él o ella también hizo un cambio a esta página de índice. Y luego uno de ustedes se registró antes que el otro. Entonces cuando estás revisando tu versión modificada de la anterior, GitHub se está dando cuenta de que la versión que tiene es diferente a la versión que te dio por última vez. Y entonces eso causaría un conflicto. En ese punto, tendrás que hacer alguna gestión y resolución de conflictos. Podemos discutir que más adelante a medida que crece un proyecto. Pero retinal esto, sólo manténgalo lo suficientemente simple para saber que podemos crear o repositorio para cambios sincronizar y cuando hagamos compromisos y verás que lo va a comprometer localmente y luego sincroniza los commits locales con un GitHub commits derribar automáticamente cualquier cosa que no tengas que esté actualmente en GitHub. Entrada real. Eso es lo fácil que es codificar como grupo. Así que cada uno de ustedes podría iniciar sesión fácilmente en este proyecto en GitHub. Te voy a mostrar a través de Colón Maya. Entonces aquí está el carbo King up que se acaba de crear hace un minuto. Ahí está el pollo que acabo de hacer archivo de índice modificado. ¿ Verdad? Nadie es privado y dos de ellos la única persona. Entonces si quería Bueno, mantenerlo en privado pero compártelo, entonces eso es tan fácil como ir a la configuración, entra en Administrar acceso. Podrían pedirte que confirmes quién eres. Y luego después de confirmar quién eres, entonces puedes invitar a colaboradores. Invitar a colaboradores es tan fácil como escribir nombre de la persona. Así que tengo otro, estoy tratando de defender mi otro YouTube, un cono para poder simplemente demostrar cómo se ve eso. Pero en realidad puedes simplemente buscar el nombre de usuario de ese arte de ráfaga. Solo estaba lidiando con nombres de usuario aleatorios. Simplemente puede encontrar el nombre de usuario de otra persona, seguir adelante y agregar. Y entonces aceptarían la invitación, y luego podrían también empujar y tirar del proyecto en orden, digamos a tirar del proyecto en orden, la nueva persona en el equipo, o incluso si perdiste tu código, veamos, tu máquina se estrelló. Necesito perder su proyecto local y necesitas recuperarlo de GitHub. El mismo trámite que alguien que se acaba de sumar al proyecto y necesitan una copia local para empezar a trabajar. Todo lo que realmente tienes que hacer es ir al código. Y luego se verá abierto con Visual Studio. Una vez que hagas eso, se abrirá Visual Studio en tu máquina. Entonces indica que puedes clonar desde el repositorio. Entonces esta es una ubicación de repositorio que es la URL para la orilla de GitHub. Este es tu pasado local. Ahora se está mostrando rojo porque ya tengo ese camino local. Ese es un proyecto en el que estamos trabajando. No. Así que una vez más, si fuera nuestra primera máquina, entonces no tendrías este problema. O si fuera la primera vez que estás recibiendo este proyecto, no tendrías ese problema con el camino. Incluso si ya tienes el proyecto, todo lo que tienes que hacer es cambiar tan rápido y tiraría a una carpeta diferente si realmente quisieras una copia. Después de que signifiques dónde querías clonar localmente, solo tienes que hacer clic en Clonar entre Visual Studio y GitHub. Todos los archivos de proyecto que se han subido hasta saber serán descargados a su máquina y sincronizados y luego podrás empezar a trabajar. Entonces así es lo fácil que es para los equipos empezar a colaborar. Si quieres hacer público todo el proyecto. Serrano es privado, es decir si esta URL y yo tratamos de crecer traje y simplemente abriré una nueva ventana de incógnito. Si traté de crecer traje, llegaré a un 404. Técnicamente no existe frente a uno de mis proyectos públicos. Déjame simplemente encontrar uno que yo sé que es público. Si fueras a obtener esa URL y navegar a través de ella, entonces mostraría que cualquiera puede navegar a repositorios públicos en GitHub. Pero una vez que es privado, nadie puede, cuando estás trabajando en tus serios predice los proyectos de creación de dinero, no quieren compartir tu propiedad intelectual con sharp, hacerla privada. Pero entonces en el verdadero significado de código abierto y colaboración y cizallamiento, entonces probablemente quieras tener algunos proyectos abiertos porque entonces eso también puede duplicarse como tu portafolio para tus pretendientes o tus futuros empleadores Cuando querían ver qué tipo de proyectos has hecho y simplemente hacerte una idea general de tus habilidades. En general, GitHub es una herramienta maravillosa para conocer gente nueva, ya sabes, mirando lo que otros desarrolladores podrían estar haciendo. Puedes seguir a la gente. La gente puede seguirte mientras publicas. La gente puede iniciar tus repositorios o hacer sus propias copias de tu código porque tal vez estás haciendo algo que alguien más está interesado en hacer y lo que estás haciendo está medio hecho, puede ayudarles. En el verdadero significado, una vez más, están saltando a la comunidad de código abierto para la colaboración. Eso es lo que GitHub trae a la mesa. Así que adelante y lo que vamos a hacer es hacer shorts o un cono. Entonces cada vez que consigamos una pieza de funcionalidad en, estaremos sincronizándonos con el repositorio porque una vez más, nos dará la historia de todo. Entonces si cometemos un error y algo deja de funcionar, siempre podemos retroceder a la versión anterior. Lo que no quieres hacer es dejar demasiados cambios entre las versiones que estás registrando. 10. Agrega crea una página de Create: Hola chicos, bienvenidos de vuelta. Entonces ahora que tenemos una idea de cómo podemos generar el código para ver los autos o cualquier detalle en cualquier tabla. Más o menos lo que podemos hacer es continuar por esta línea y pescar todas las actividades de la multitud. Así corroe una vez más ya que estamos creando, leyendo, actualizando, y eliminando. Por lo que en este momento tenemos una de las opciones rojas en forma del índice, pero no tenemos datos en la base de datos. Tenemos dos opciones. Podríamos entrar en la base de datos, poner en el registro, pero por supuesto, al darse cuenta o no estaría haciendo eso, no estaría alentando a nuestros usuarios a hacer eso. Entonces en cambio, lo que vamos a hacer es continente para pelear con todas las páginas. Y el siguiente es la página Crear la cual clínica los de la base de datos permite usar la interfaz de usuario en nuestros datos y luego tenerlo visible desde el índice. De la misma manera que generamos el archivo de índice. Sólo vamos a ir a hacer clic derecho en autos, añadir página Razor. Y voy a hacer otra página de resultados con Entity Framework. Ahora, una vez más, solo podías manchar todos estos, pero yo quería hacerlos uno por uno para que podamos evaluar los diferentes bits de código y sostener que todos se juntan para darnos la funcionalidad crud completa. Así página de Razor usando Entity Framework, fui a agregar ese. Y esta vez voy a hacer un Create. Estoy nombrando a la página crear. El modelo queda que lo crea nos dará un formulario o una clase de modelo será nuestro auto. Y podemos dejar el estrés del contexto de datos, seguir adelante y golpear Agregar. Y genera nuestras peleas esa página para mí. Entonces obtengo el fondo pitch así como el archivo de código que estamos acostumbrados a eso ahora, solo recuerda que si te dan algún error respecto y no poder andamiar, acabamos de pasar por esa actividad con el índice. Entonces entre las lecciones, es posible que te hayas inclinado a actualizar tus paquetes NuGet y luego eso probablemente provocaría alguna desconexión con una scuffle más antigua. Entonces si estás recibiendo ese error, simplemente retroceda a la versión anterior o una versión antes de la de tu nula en. Y vuelve a intentarlo. Y a medida que arrastra y si sigues consiguiendo el área, solo mantén en andamios pliegues o soltando la versión del paquete NuGet e intentando scuffled. Por lo que ahora evaluemos lo que obtuvimos a través de esta riña, la actividad para la página Crear. Tenemos nuestro código detrás de archivo, que siempre fueron una clase heredando, heredando del modelo Page. Y luego tenemos nuestros contextos siendo inyectados en. Entonces en conseguir, solo está diciendo devolver el pH. En otras palabras, no tenemos nada que necesitemos cargar necesariamente para el Create, así que no tenemos que ir y Fitch ningún dato para mostrar el formulario porque solo van a estar mostrando un forma vacía al usuario para que realmente creen un registro. Entonces el inicio está vacío, no hay nada que volver aquí, eso está bien. También tenemos esta propiedad llamada tarjetas. Entonces tenemos coche público y es un objeto del tipo auto, y luego tenemos comprando propiedad. Entonces la propiedad bancaria aquí básicamente le dice la página Razor que en el formulario, sea cual sea la entrada que se dé para cualquier propiedad que esté dentro de esta clase, debe verla. Una vez que se presente, entonces va a golpear ese puesto. Cualquier cosa que esté deshuesada, se va a observar para que cuando golpeemos el post realmente raspe todos esos datos, haciendo coincidir datos para las propiedades del automóvil desde el formulario. Y así podemos procesarlo en eso on post. Aquí primero verificamos si el modelo es válido. La validez del modelo puede ser una serie de cosas basadas en qué datos estamos pidiendo. Por lo que en el caso de crear un automóvil, sería absurdo a un bajo, un auto que se entrara sin un año y con nombre OTA. O al menos tal vez el nombre sea lo más importante. El oído podría ser opcional. Por lo que definitivamente querríamos asegurarnos de que al menos el nombre esté presente antes intentar enviar algo más de dos la pieza de datos. Para que si el estado de los modelos es válido aquí, básicamente ¿eso comprueba para que veamos cuáles son las reglas de validación? ¿ Son emiten si no, simplemente recargar la página. Te voy a mostrar en unos segundos. Sostenga que se traducirá a cada uno mostrando lo que le pasa. Pero si no es válido, simplemente recargue la página. De lo contrario, lo que sucederá es que irá al contexto de la base de datos, vaya al establo del auto y sumará el nuevo objeto de auto. Vean que esos son los mismos objetos que dijimos Ben propiedad cuatro. Y luego después de eso guardará los cambios. Entonces eso es todo funciona Entity Framework. Dice uno, diciéndome qué mesa y dime qué querías hacer. Entonces en este caso, queríamos sumar y queremos sumar un auto. Y luego una vez estamos incrementando los datos, es decir dónde agregar algo, eliminar algo, actualizar algo. Una vez que estamos cambiando algo sobre los datos, tenemos que llamar a guardar cambios. Ahora te darás cuenta de la espera. Cuando haga doble clic, espero, verás que hay este otro título llamado fregadero. Entonces en la programación asíncrona, vas a ver mucha de esa tarea asíncrona fuera del tipo en que realmente resulta. Observe que el inicio es sólo i resultado de oxígeno. Éste es resultados de acción de tarea porque es una función asíncrona. El motivo por el que es asíncrono es que está haciendo una llamada a la función asíncrona al contexto. Por lo que sí tiene una versión no asíncrona. Simplemente guarde los cambios. Pero entonces eso requeriría que hagamos algunos cambios en nuestro método y todas estas cosas. Pero si generó eso para ti, siempre va a intentar darte el código más eficiente basado en lo que sea capaz de hacer. Entonces es por eso que estamos obteniendo las versiones asíncronas de estos métodos después de que haya guardado los cambios y todo está bien, entonces redireccionamos al índice de página es incluso el código generado sabe que debería estar buscando una página llamada Index. Esa página de índice estaría aquí mismo en el mismo nivel que crear. Después de que todo esté hecho, solo redirigirá a la lista y verás tu recién creado un registro en esa lista. Ahora echemos un vistazo rápido al archivo HTML que se generó para nosotros. No es mucho, es un formulario pequeño porque la tabla no tiene tantos registros para lamentar que muchos campos para llenar. Lo que conseguimos, obtenemos uno, conseguimos el auto. Si en realidad pudiéramos simplemente rediseñado esencialmente crear coche. Esa es nuestra etiqueta H1, quita esa H cuatro. Y luego tenemos algunos divs Bootstrap. Tenemos un div con una clase llamada regla, y luego ahí tenemos una clase llamada llamada MD4. Entonces eso significa que está tomando cuatro columnas en la regla. En Bootstrap, el sistema grid es tal que puedes crear una regla y luego puedes tener col, dash un número lo que tienes hasta 12. Por lo que puedes tener tantos divs de llamada en lugar de una fila de hasta 12. Entonces podrías tener 12 unos o tres , cuatro o cuatro tres. Muy bien, puedes mezclar tanto y simplemente no elegir tener ninguno, correcto. Entonces si quería formar distrito justo al otro lado de eso lo que he visto desde la sección HTML de este curso cuando acabamos de crear el formulario, le dimos todas las etiquetas de formulario y así sucesivamente un estirado lo más ancho posible, entonces no tendría que especificar ningún col md. Para que puedas experimentar con eso. Mira la documentación para las diferentes mediciones de columna, y podemos experimentar con eso y ver cómo se ve eso. Pero lo más importante es nuestra forma. Entonces en la forma tenemos este div que dice AASB guión resumen de validación en solo modelo. También tiene otro modo que ve todo. Muy bien, Así que a veces tiendo a sólo cumplir con eso todo. A veces te encanta el modelo solamente. Eso está bien. Quiero decir, verás los beneficios de uno y no del otro, aunque es más global. Por lo que solo te recomendaría que uses todo cuando tengas dos. Entonces le damos una clase con tics peligro. Esta sección de la página realmente se llena con cualquier error de validación que estuviera presente cuando dijimos si el estado del modelo no es válido, devuelva el pH, por lo que eso es automático. Por lo que el estado modelo es en realidad camiones para ver, bueno, Este es el modelo entero y esto se está deshuesando. Cuando se ingresan datos y en Post, se va a camiones todos los datos que se ingresaron aquí a través del formulario. Verás que tienes dos entradas. Uno para mi auto dot año. No quiero poner nombre de punto para que consigamos la etiqueta, vamos a obtener la entrada, y luego obtenemos el spun con ese mensaje de validación siendo incorporado. Por lo que dos lugares, los mensajes de validación se mostrarán debajo la entrada y en la parte superior del pH en un resumen de gen. Siempre que se publica un cheques, ¿era válido? Si no, regresamos a la página cuando recarga esa página. Entre el resumen de validación y estos tramos de validación, veremos todos los textos que indicarán por qué algo no fue votado. Lo que voy a hacer es darle la vuelta a esto porque es nuestra granja. Se generó para nosotros lo que podemos cambiarlo propio. Entonces fui a poner este grupo de formularios por un nombre por encima del año. Esta cosa que fluye más. Es poner el nombre del auto y poner el año. Eso es opcional en este punto. Y luego tenemos el botón Crear debajo con la clase BTN será diez tablero primario. Y incluso se puede extender este sentido que btn bloque, se extiende a la derecha a través de toda la página. Entonces tenemos nuestra lista volver al botón Lista. Entonces si la persona llegó tan lejos e inicia, vale, ya no quiero crear el auto. Siempre pueden simplemente dar vuelta a la lista, volver al índice. Debajo de todo eso hay una sección para los guiones. Y lo que pasa es que todo este flujo de trabajo de validación que acabo de describir, es realmente una combinación de nosotros agregando reglas de validación y estoy a punto de mostrarte cómo funciona eso. Y algunos parciales o lo sentimos, son algunos guiones los que se renderizan en la página. Este bit de código, esto es renderizando async parcial para scripts de validación. Si miramos en la carpeta compartida, entonces verá que los scripts de validación de guiones de subrayado parciales exactos parciales. Ahí está. Y si miras en ese parcial, verás que todo lo que tiene dos etiquetas de script para jQuery dot validar. Entonces a las bibliotecas jQuery, que vimos en orden www roots. Sólo estoy tratando de mostrarte cómo todo está interconectado aquí. Tenemos el jQuery validar, cómo el jQuery validar en molesta. Entonces tenemos esos, acabamos de crear un parcial o el marco generó este parcial para nosotros que automáticamente tiene referencias a eso. En cualquier momento se generará un formulario para usted o incluso si crea su propio formulario. Más adelante, estaremos viendo cómo puedes crear tu propia granja desde cero o tu propia página, entonces en realidad puedes usar este bit de código para obtener ese tipo de flujo de trabajo de validación en todas las partes cuando queríamos decirle qué campos son válidos o lo sentimos, se debe validar y en contra qué reglas tenemos que pasar al modelo real que se está utilizando o a la entidad real. Poner estos atributos son anotaciones de datos es tan simple como ir por encima del campo al que desea que se aplique la regla. Y luego usando corchetes y luego veremos requeridos. Entonces esa es nuestra primera regla que está diciendo que en cualquier momento se supone que los datos se ingresan contra cualquier página que se modele fuera coche o cualquier forma modelada fuera de auto. El campo nombre es obligatorio. Ese es el paso número uno. ¿ Qué otras reglas podríamos tener? También podríamos querer decir que es longitud de cadena debe ser, y luego podemos ver una longitud máxima de tal vez 50. Por lo que ningún nombre del automóvil debe superar los 50. Déjame poner eso a 150. Y entonces podríamos decir que si no llega a superarse, queremos un mensaje de error de mi nombre. Es el nombre es demasiado largo. Algo que también podemos establecer una longitud mínima para que la persona no pueda entrar nada con un personaje, ya sabes, cosas así. Así que en realidad puedes simplemente ensancharlos a lo largo justo encima del campo. Ahora, poner estas reglas en contra de la entidad deudora, porque esta es la entidad real que se está utilizando para generar la tabla como vimos cuando agregamos un conjunto DB. Agregamos nuestra migración. Cuando los ponga aquí, en realidad voy a estar afectando la base de datos. Entonces si genero otra migración en este punto, y sólo voy a generar una. Hago reglas de validación, presiona Enter. Y cuando hagas eso, recuerda siempre cambiar el proyecto predeterminado al proyecto de datos. Pero una vez hecho eso, entonces se puede ver aquí que los bienes una columna de altar poco de sintaxis. Aquí está diciendo alterar la columna con el nombre, nombre porque esa es la que acabamos de establecer las reglas anteriores. Entonces el tipo sigue siendo, el tipo es int varchar 150. Entonces antes de que fuera en var char marks, tenga en cuenta que mientras que sentado como limitación de longitud de cadena, va a cambiar el tipo de datos en la base de datos para saber que incluso entonces no puede almacenar más de 150. ¿ Está bien? No, ya no es inaudible porque ahora lo hicimos requerido. Entonces antes de que fuera cierto, no era un azul. Podríamos haber levantado MTU. La base de datos no tendría ningún problema. La propia base de datos con rechazarla activamente. Si es nulo, entonces si no se proporciona nada, le dará una cadena en blanco como valor predeterminado, pero no puede ser nula. No obstante, por el lado del cliente, ni siquiera aceptaría la cadena en blanco porque se requiere. Entonces cuando vayamos a probar o formarnos en la página de índice, voy a golpear Crear Nuevo y luego tenemos nuestros formularios. Entonces por la llamada MD4, ves que sólo se está estirando hasta cuatro. Lo que podemos hacer, solo explora esto. Sólo voy a inspeccionar elementos que podemos jugar con este ancho. Si hiciera eso llamado MDA ocho por ejemplo, se estiraría a ocho veces. Entonces, ¿de dónde vemos el EHR? Líneas que se extienden de izquierda a derecha, eso es tan anchas como las 12 columnas. Entonces sé que va a estar tomando ocho de los 12. Si no especificara un ancho, entonces eso es lo que se vería. Sería una especie de diminuta. Entonces si quisiéramos que se extendiera completamente y entonces podríamos decir col md. Así que sólo voy a hacer eso aquí, es igual a llamadas. Entonces esta es una forma agradable y sin fisuras de probar cómo se vería antes de cumplir con el cambio de código. Así que en ninguna parte ver llamado llamado dashboards. Por lo que se puede decir col dash AMD, T12, lo que significa en una pantalla de tamaño mediano, T corp dot size. O si solo quieres que sea universal en cada pantalla y ocupe ese tamaño de modo o no mathspace, solo puedes decir que col dash T2 se llaman dash el número. Entonces aquí vemos que se está estirando en última instancia de izquierda a derecha en la medida de lo posible. Y luego tenemos nuestro botón Crear, que es btn block. Si acabo de tratar de crear este punto. Ahí vamos. Estamos viendo nuestra validación funcionando. Así que en ninguna parte obtenemos ese resumen de validación en la parte superior y luego estamos recibiendo los mensajes de validación a continuación. No, no le dijimos campo del año que se requería con base en nuestras reglas. Lo que voy a explicar por qué vas a ver esto. Entonces es bueno entender estos matices con todo el plato válido encendido y qué campos se validan automáticamente, por así decirlo. Porque el año es un entero y no un int anulable. Entonces por defecto, cuando ves int en C-Sharp, significa que nunca puede ser nulo. ¿ Está bien? Entonces nano significa vacío. Pero entonces un int nunca puede estar vacío. Un int siempre va a predeterminado a 0. Entonces eso significa cuando nos sometemos justamente ni intenté someter alguno, si es modesto es válido. No fue válido porque el entero no obtuvo un valor en absoluto. Ni siquiera consiguió el 0. En lo que se refiere, es inválido. Entonces si hubiera puesto un 0 ahí, el mensaje de validación desaparece. Si traté de crear, está satisfecho tanto como 0 no es un año válido para nosotros. Ceros un valor válido en comparación con null para un entero. Solo estoy tratando de explicar todos los diferentes tipos de datos podrían tener su propio tipo de validación en función de la retención. Trabajan en C-Sharp. Pero en última instancia, si no pongo nada ahí, va a decir automáticamente solo, bueno, se requiere. Si traté de crear, no irá más allá. Y si quieres más pruebas, solo voy a poner nuestros puntos de quiebre justo en esta línea donde comprueba, ¿es válido? Hacemos clic en Crear, va a golpear ese punto de ruptura. Bueno, no va a golpear el punto de ruptura saber debido a que la validación está observando activamente. Así que déjame seguir adelante y crear auto. Esto está en realidad en mi viejo auto. Hermoso GAR, adelante y pega Crear. Y como aún no hay errores de validación activos, lo que tenemos es esta comprobación para ver el estado del modelo es válida. Es válido. Esto está diciendo si no es válido, entonces volver a pagado. Entonces como es válido, va a seguir adelante y agregarlo a la base de datos. Sólo voy a quitar este punto de ruptura, golpear F5 para dejarlo continuar. Y luego hace eso redirigir a la página de índice, que luego ejecuta la consulta para ver y meterme todos los autos en la base de datos y mostrarlos. Así es como todo está interconectado. Entonces voy a tratar de hacer otro crear. Y sólo voy a poner este punto de ruptura, solo toma y ver qué está pasando. Vamos a hacer clic en Crear y verás que ni siquiera llega al punto de ruptura porque del lado del cliente se está negando activamente porque las reglas de validación en realidad están configuradas para el campos basados en las reglas que nos sentamos. Si resalta o inspeccionamos el cuadro de texto para el nombre, vemos aquí que tenemos datos Val es igual a true. Por lo que todos estos son generados por el JavaScript. Entonces entre nuestras reglas que configuramos en C-Sharp y las bibliotecas JavaScript en el cliente dijeron que todos estos atributos se agregaron al text-box. Entonces los datos Val es igual a verdadero significa que se supone que debo hacer validación de datos en este campo. Los datos de longitud. Eso significa que el error basado en la longitud, es el mensaje de error que habíamos escrito. El máximo es de 150. Entonces todas las pequeñas reglas que habíamos establecido, verás siendo aplicadas en los foros de atributos aquí. Y no teníamos este código extra. Y si miras hacia atrás nuestro archivo HTML, sigue siendo el mismo isquio. No lo escribimos y no ha modificado el propio archivo. Todo esto se está haciendo sobre la marcha cada vez que se cargará la página web. Que hemos hecho, todo el, lo que vamos a hacer es sólo actualizar la base de datos porque acaba de crear una nueva migración. Y eso es algo que vamos a estar haciendo mucho cada vez que hagas un cambio a una de las clases de entidad, una, haces una migración donde documentará qué cambio tiene que suceder. Y debes quitar la migración, qué engaña y hay que deshacer o cambia. Y luego después de hacer la migración, volvemos y decimos actualizar la base de datos. Por lo que en realidad puedes usar tab. Si escribe algunos de ustedes para hacer es presionar Tab para terminar el resto de la misma actualizar la base de datos. Y si todo va bien, ya verás hecho. Ahora, hay momentos en los que puede recibir errores. A lo mejor algunos de los cambios que quieres aplicar pueden entrar en conflicto con algunos de los datos que ya están ahí. A veces eso sucede, pero como dije, cada vez que surjan estos errores, vamos a trabajar a través de ellos juntos. Para que puedas tener una buena idea de cómo solucionar algo. ¿ Se debe subir? Cuando volvamos, seguiremos con nuestra aventura de código. Por lo que ahora tenemos el Crear, tenemos la r, Así que tenemos la c, tenemos la R en forma de esta página de índice. Y luego podemos hacer la edición a continuación. 11. Agrega una página de aviación: Muy bien, bienvenidos de vuelta chicos. Así que ahora estamos en nuestra nueva actividad, que es configurar la página de edición. Por lo que las ediciones serían la actualización bruta de la ONU. El tiempo que vamos a editar algo, básicamente estás haciendo actualizaciones a los datos existentes. Por lo que seguir por la misma vena de andamios se acertadamente autos, autos carpeta, seguir adelante y calentar. Hay una página, una página que utiliza Entity Framework. Y entonces éste lo llamaremos edit. Mi justificación para usar estos nombres de página. Por qué dije ediciones en lugar de actualizar o dije índice en lugar de lista. Notarás que en la página de índice, esos son los nombres de las páginas. Se espera ver que dicho, sin embargo, si esos no son los nombres de página que quieres, siempre puedes cambiarlos. Entonces si quisiera que esto dijera actualización en lugar de editar, entonces eso estará bien. Voy a llamarlo actualizaciones. Fui a cambiar esta plantilla de Create para editar así obtenemos ese formulario de edición y verás la diferencia entre las plantillas de crear y editar. La clase modal sigue siendo coche, contexto de datos significa el mismo anuncio. Entonces obtenemos nuestras dos quintas partes. Por lo que obtenemos actualizaciones, CSEA, esmalte, y el archivo de modelo detrás de él, nieve, esto es actualización. Pero si vuelvo a la página de índice, el código que se generó está buscando la página ASP va a querer ver es editar y no actualizar. Así que está bien, bien. Simplemente puedo hacerlo nulo Cada mirada adelante para actualizar la página. También puedo cambiar el texto si quiero, porque esto es sólo una etiqueta de anclaje. ¿ Qué se necesita que quiera que se muestre? Puedo decir que quiero mostrar actualización, pero la dejaré en editar porque la actualización no es tan amigable con el usuario o los usuarios realmente no se relacionan con la actualización de palabras como lo iban a editar. Lo que usted presenta a los usuarios. Siempre importante. Pero puedes tener un poco de libertad con tus nombres de tono. Pero eso es todo lo que quería demostrar por no ediciones de Nimitz, poner nombrarlo, actualizar. Quieres tener cuidado si vas en contra de la norma, entonces tienes que cumplir cada vez más para facilitar tu implementación. No obstante, de lo contrario, si vas con las normas, tu necesidad de personalización se reduce en gran medida. Volvamos a nuestro archivo de código para la actualización del archivo CSS HTML. Entonces es más o menos lo mismo uno donde inyectar también el contexto de la base de datos, tenemos el mismo tipo de propiedad de banda, propiedad que vimos en el Create. Entonces vamos a tener el primero. Vamos a tener campos para el auto en el foro. Necesitábamos estar atentos a los cambios a los valores de la propiedad para que podamos procesarlos en post. Aviso, sin embargo, que están en GitHub tiene mucha más acción pasando, entonces nos habremos acostumbrado, y vamos a caminar a través de lo que está pasando aquí. Uno, notarías que esto es asíncrono, por lo que lo hicieron acrecentar esta vez, y tiene un parámetro para int id Ahora nota que este int tiene un signo de interrogación al lado de él. Por lo que anteriormente habría mencionado ins neoliberales versus int. Entonces int significa que no es opcional, tiene que ser al menos 0. No obstante, hay momentos en que es posible que necesite un valor nulo en la variable que se supone que es un int. En esta situación, básicamente están diciendo que alguien puede intentar navegar por la página de actualización sin proporcionar un ID. Muy bien, entonces eso significa que cuando llegue aquí, ese valor de ID sería nulo. Lo primero que hace es comprobar si el valor id es nulo, luego volver no encontrado porque no puedo encontrar nada. No significa nada. Y si me estás diciendo que quieres editar un registro sin nada como su ID. Y ya pasamos por hold que ID es ese identificador único en la base de datos? Es una clave primaria. Eso es lo que es el ID. Si me dices que quieres editar un ícono de registro, acude a la idea del registro que te voy a decir si no es teléfono y no lo encuentro bien. Así que cada vez que obtenemos esas 404 páginas en cualquier sitio web, básicamente lo que esto es todo lo que están haciendo, están regresando, no telefoneados. Muy bien. Si no se proporciona ninguna identificación, entonces no puedo encontrar nada. Eso es más o menos lo que estamos viendo al usuario. No obstante, si va más allá de esto, entonces podemos suponer que el ID tiene un valor. Por lo que tratamos de encontrar ese valor en la base de datos. Esto es básicamente decir, ir al contexto, ir al establo del auto. Así que ve a luego disculparse, ve al establo del auto y consígueme el primer registro o por defecto donde el ID coincide con el valor que está entrando. Esto es lo que llamamos expresión lambda. Muy bien, así que pongas demasiado. M podría haber sido cualquier Tolkien, esta podría haber sido la palabra registro igual w, q igual W2 palabra cachorro. M no lo es, no es nada manifiestamente especial. No obstante, m seguido de esta flecha, que solo voy a llamar la flecha Lambda, convierte en una expresión lambda, lo que significa que básicamente estás definiendo función como capacidades dentro de uno declaración. Muy bien, Así que esa es una expresión lambda. Entonces podría haber usado un elixir degenerado m, eso está bien. Pero podría haber usado cualquier letra, cualquier palabra, cualquier Tolkien y dicho flecha Tolkien. Entonces el Tolkien básicamente representa cada registro en la base de datos. Entonces en lugar de que yo tener que usar como un for-loop, porque ya establecimos no autos es como una lista de tarjetas o la lista de registros en la base de datos. Ya miramos cómo tendríamos que usar for-loops o para cada bucles para pasar por lo menos para conseguir todos los registros en lugar de decir que me traigan los autos. Y luego para cada tarjeta que está en la base de datos, si el ID coincide, básicamente esto está haciendo toda esa lógica que acabo de describir para nosotros. Entonces el Tolkien aquí representa cualquier registro en la base de datos. Obtenemos las propiedades para que pueda decir m dot m dot nombre, m dot año. Entonces, si necesitaba buscar algo, podría usar esta expresión lambda para buscar por nombre por oído. En este caso, estamos buscando por ID. El ID que mucho es el valor que se está pasando a través del intento de navegación del usuario a esta página. Puedo ver si el auto es no porque tal vez pasaron en ID TIN y no hay auto con una identificación diez, eso significa que nada habría sido volado a la base de datos. Entonces estamos diciendo que si no se encontró nada, entonces devolvemos la página. Hay formas en que puedas refactorizar esto, pero puedo explicar por qué fue escrito así y por qué probablemente querría refactoriarlo ganado. Fue escrito así porque una base de datos llamada es cara. Me gusta pensar en ellos como algo caro. Lo haces cuando sea necesario en absoluto. Quiero simplemente hacerlo fuera de la pero sólo porque más o menos lo que están diciendo es que si no se proporcionó nada, no espere. Llamó a una base de datos, verifica si se proporcionó algo y si no, entonces mátalo ahí mismo. La persona está perdiendo tiempo y recursos. Mátalo ahí mismo. No desperdicies la llamada de base de datos. Después de que hacemos la llamada de la base de datos, todavía queríamos saber ¿se llamaba ese respecto? Si no se encuentra, entonces regresamos no encontrado 404. De lo contrario devolvemos el pH con los datos cargados online con un crear donde el Create solo tenía el vacío o simplemente la instanciación del auto. Entonces no había nada en la tarjeta, esto estaba vacío. Por eso obtenemos la forma vacía. Porque el nombre del punto del coche estaría vacío. Coche dot año estaría vacío. Depende de nosotros llenarlo y se llenaría e ingresaría en la base de datos por correo. No obstante, en las actualizaciones estaban tratando llenar esto con datos antes de volver a la pizza, recuerda dije que quieres poner todo dentro de las propiedades antes de enviarlo al real apareció antes de disputar a los usuarios. Así que al igual que con el índice, estamos en conseguir. Seguimos adelante y corrimos la consulta. Entonces recuerda que esto se estaba utilizando, esto se está utilizando en la propia página, modelo dot cars. A diferencia del índice donde no estamos, lo siento, igual que con el índice donde llenamos las tarjetas con datos antes de volver página. Tenemos que hacer eso para la actualización. Por lo que necesitamos encontrar el registro y luego devolver la página. Y luego enlazaría automáticamente los valores existentes provenientes de la herramienta de base de datos, los campos de entrada en el formulario generado, que son capaces de mirar en unos segundos. Entonces es por eso que realmente fue escrito así. Si no hay identificación proporcionada, no desperdicies la base de datos, llame, muerte de ejecución. De lo contrario, intenta encontrarlo. Y si no lo encuentras, mata la ejecución, lo contrario, sigue adelante y muestra la página. No, esto podría refactorizarse para tener una declaración if porque estas dos declaraciones if mientras están comprobando dos escenarios diferentes, realmente están haciendo lo mismo. Si queríamos una respuesta diferente a cualquiera de ellas y tenemos dos líneas de código para cambiar. El factor preguntándose podría ser que, vale, arriesgamos la llamada a la base de datos. Lo intentamos para encontrar el auto sin importar, no obtenemos el valor. Muy bien, entonces sólo podría decir si el auto es nulo, porque al final del día, si se pasa nulo teoría sólo va a ver si el ID es equivalente a nulo, lo que nunca sucedería. Entonces auto sería nulo, volvemos no encontrado. O si ese valor es 0 o algún ID que no existe, Kyra todavía va a ser nulo, devolver, no telefoneado. Ya ves, solo te estoy mostrando que el código generado, pero no tengas miedo de explorarlo y modificarlo, como puedes pensar que podría ser más eficiente. Pero les estoy dando los dos escenarios y explicando por qué se estableció un escenario de esa manera. ¿ Y cuáles son los pros y los contras de ella? Ahora que tenemos una idea de lo que está haciendo el inicio y no voy a modificar esto. Lo dejaré tal y como está. No, podemos ver lo que tiene la página HTML para mostrarnos. Entonces la página HTML va a parecer bastante idéntica o crear. En este punto, No, estás viendo bien hay dos los dos mismos foros literalmente ahí para verle formas. La diferencia aquí sería esa forma degenerada aquí. Dice auto de actualización y fui a cambiar esto para editar auto. Saca cualquier cosa que no necesite. El botón por defecto se guarda en forma decretada. Se dijo crear. Muy bien, y luego podemos una vez más solo tomar btn block y ponerlo por aquí. Además, si no quisiéramos la clase para ella llamada MD4, podríamos cumplir con eso llamado MD, sea lo que sea. Solo te estoy mostrando que los dos formularios son generalmente idénticos entre un formulario de creación y una actualización en la mayoría de las aplicaciones web, generalmente son idénticas. En este punto, podrías tomar otra decisión de diseño. Podrías hacer una página que diga tal vez upsert, actualizar e inserciones que apoyen mental emerjan hacia la actualización e inserción. Y lo llaman absurdo. Este absurdo Pij sería más o menos en el, ETC. ¿ Recibí una identificación en Get ¿Me dieron una identificación? Si me dieron una identificación, traté de encontrar el auto y luego volver a pitch. De lo contrario, solo cargue la página vacía. De esa manera, si se presentan datos aparecerán. Si los datos no se presentan en la orilla hacia arriba. Y entonces podría hacer otra declaración if aquí para ver si el ID está presente en shore un valor en el botón o mostrar el otro botón llamado éste es un botón de actualización. Yo querría que fuera btn-primaria, me gustaría que fuera T sea btn peligro. Entonces es naranja. Solo te estoy mostrando, solo, solo estoy explicando diferentes consideraciones de diseño. Todo el mundo tiene diferentes contextos. Y así podría hacer algo que tú estás viendo, ya sea que no sea necesario hacerlo de esa manera. O podrías hacer algo con un colega o un amigo tuyo y ves que no necesitas hacerlo de esa manera. Pero los contextos siempre deben ser el factor determinante para sus decisiones a la hora de desarrollar una aplicación. Continuemos. No voy a hacer esas cosas absurdas, solo te voy a dar una idea. Pero el punto es que las formas son casi idénticas. aplicarían las mismas reglas de validación. El buck a listar está ahí, tenemos el botón, tenemos nuestros campos de entrada. Sólo voy a reorganizar este. Por lo que se parece al Create en términos del orden de los campos. Pero hay una cosa que quería señalar y que es esta entrada para lo oculto sí cambió esto a todos en el último. Por lo oculto. Si vuelves a nuestro Create, no hay oculto. Para una identificación. Este campo oculto es absolutamente importante. Uno, es un oculto porque nuestros usuarios realmente no necesitan conocer nuestras claves primarias. Piénsalo. En Amazon, es posible que vea nuestro número de producto, pero ese número rara vez es nunca. La llave paria María. Es posible que veas un número ISBN para un libro o algo así. Ya sabes, un número de identificación para nuestros alumnos. Pero esa rara vez es la clave parietal. La clave primaria es interna al sistema. No obstante, es absolutamente necesario para el transporte por carretera. Qué pasa, porque si no tenemos que esa clave primaria sea cargada en este formulario, entonces siempre va a suponer que se trata de un nuevo récord. Muy bien, así que tenemos que por eso creo no lo tiene porque siempre es siempre es un nuevo récord. No hay identificación cuando estás creando algo. No obstante, cuando estás editando o actualizando todo lo que pasamos por los ungulados, es obvio que el ID es muy importante. Y tenemos que recordar el DNI a través del formulario. Para que cuando esta persona somete la fórmula, pegamos la cabeza de nuevo al on post, ¿ves mucho más repentinamente a bordo? Sí, hemos validado. Ya pasamos por cómo se ve la validación , eso está bien. Pero entonces aquí donde decimos contextos dot coche adjunto y cambia de estado a modificado. Lo que realmente está pasando aquí es que estamos viendo base de datos. Por favor empiece a llevar por carretera este auto objeto. Por lo que habríamos conseguido aquí el disco original del coche. Si el nombre era un calabacín al deporte. Eso es lo que tenemos aquí. El año fue 2013, Eso es lo que conseguimos. El DNI fue de tres. No, no escuches después de que se haya editado, la idea nunca debe ser editada porque diferente IID significa que es un disco diferente. Entonces por eso está oculto y no permitimos el usuario lo vea o interrumpa con él, pero está siendo transportado por camión en segundo plano. Ahora si lo cambié de Suzuki. En los deportes y en como, oh, no era un deporte. Déjame quitarme el deporte. Entonces lo que estamos viendo es base de datos. Por favor empiece a ver este registro y sepa que está modificado. En la base de datos sabrá que está modificada o Entity Framework sabrá que está modificada u otra por el ID. Entonces va a suponer que algo en él cambia. Lo único que no debe cambiar es el ID porque ID está presente, lo sabrá. Ok. Tengo constancia con esa identificación, ¿verdad? No. Entonces lo que haré es guardar los cambios que se han hecho a ese registro con ese ID. En esencia, va a terminar con dos versiones. Va a tener el registro original que acabamos de recuperar. Y entonces va a tener este nuevo disco o esta nueva versión del disco COVID, pero propiedades potencialmente diferentes. Y luego Guardar Cambios, diremos, está bien, voy a guardar los nuevos datos en la tabla en consecuencia. Esto, en éste, verás que tenemos un try-catch porque esto es situación más delicada. Es decir, ¿y si dos personas trataran de actualizar el auto? Hice clic en editar este auto. Segundos antes de hacer clic editar este auto, ambos tenemos este registro de acero o al menos quién ambos de la corriente requerida entonces hago un cambio. Lo cambié del año 2013 a 2015 y luego haré clic en Guardar. Pasarás bajo el más largo bajo registro y todo tu registro es de acero porque tenías la versión del registro antes de que yo lo actualizara. Al hacer clic en Actualizar, vas a intentar guardar los cambios. Gané algo que ya estaba actualizado desde que lo hizo clic. Eso llevaría a este tipo de error o no sabía sobre intentar y atrapar o manejar excepciones, explotar C-sharp, lo que estamos haciendo es tratar de guardar los cambios, pero entonces es sólo esbozar explícitamente esta excepción de concurrencia de actualización de DB, que es ese mismo escenario que acabo de mencionar. Necesitan ver eso, bueno, si el auto no existe, entonces devolver no teléfono porque tal vez fue borrado para cuando estoy tratando de actualizarlo. Si no piensa desde entonces, devolver no teléfono, de lo contrario, solo lanza una excepción y error más Griswold formas de manejar esto, pero eso es lo que dice el código que se generó nosotros. Entonces eso no es problema. No obstante, si el juicio fue exitoso, no hubo nada atrapado, entonces devolvemos el discurso índice. No, esto es solo un auto método existe que básicamente simplemente devuelve verdadero o falso. Base de datos comprobar el auto estable si hay algún registro. Y aquí hay otra expresión lambda. Y sólo para mostrarte que los tolkien realmente no importa arriba arriba es la misma expresión lambda, pero usamos m aquí abajo. Es la misma expresión lambda que solo usa E. Si querías volver a compararlos, solo copia esto y ponerlo cerca de eso. Miré el hecho de que son el mismo código, sólo dos diferentes lambda Tolkien. Básicamente es sólo decir: ¿Hay algún auto en la base de datos que tenga ese DNI? En caso afirmativo, entonces bien. Si no, entonces regresa. No llamó por teléfono. Entonces si existe, eso significa que los datos siguen siendo que estoy tratando de cambiar. Entonces arroja una excepción, o podríamos simplemente enviar error de botón diciendo Hey, algo salió mal. Probablemente quieras volver a intentar esa operación. Muy bien, veamos cómo funciona esta operación de actualización. Así que sólo voy a seguir adelante y saltar adentro. Muy bien, así que no, veamos cómo funciona esta funcionalidad de actualización. Cuando hago clic en Editar. Observe que va a traer los datos. Eso no debió haber sido un botón rojo, eso debió haber sido btn advertencia, no ser diez Dash peligro. Permítanme solo hacer ese cambio. No hay advertencia para un botón naranja. Después de hacer ese cambio, sólo puedo refrescar. Y ahí vamos. No, es un botón naranja. Entonces veamos cómo se ve esta operación de edición. Aviso en la URL que ves autos slash update, luego las cadenas de consulta. Así que recuerda cuando hablamos de cadena de consulta llamada datos se transmite a través de formularios. Entonces cuando usamos un GET, entonces estamos no especificamos que realmente va a poner todos los datos y cadenas de consulta que puedan ser peligrosas. Y mientras estamos trabajando en un sitio web estático sin nada particularmente peligroso que se transmita desde nuestro formulario a cualquier lugar, estuvo bien. obstante, no notarías que generan explícitamente formularios con método es igual a post, porque cuando publicas los datos o cuando envías el formulario, no quieres estar enviando datos a través de la cadena de consulta. Especialmente como cuando se trata de tarjeta de crédito o información personal de los usuarios. Sigue volando ese nombre de usuario y contraseña. No quieres eso en la cadena de consulta que hablo. Si bien es inofensivo usar la cadena de consulta para el ID, puede que no sea inofensivo cuando estés enviando desde el formulario. Entonces es por eso que siempre queremos asegurarnos de que nuestras formas, nuestro método igual a publicar. No obstante, hagamos un poco de experimentación aquí. Así que estamos hablando de ambos el agujero se pone bien. Entonces cuando navegemos para indexar con el ID, solo voy a volver a poner aquí un punto de interrupción. Sólo voy a refrescarlo cuando llegue al punto de ruptura. Y pasamos el puntero sobre la propiedad ID, se ve que se pasa esa identificación. Entonces eso es lo que abrió. Obtenemos ese ID que viene a través de la cadena de consulta. Y entonces somos capaces de determinar, está bien, Esos autos de punto existen en nuestro sistema. Ahora mira lo que pasa cuando cambio este ID a uno que no existe. Sólo tengo un auto en mi identificación del sistema. No hay auto con el ID TIN. Si traté de bros ahí, me dan diez. Muy bien. Y entonces si acabo de hacer F5 y continuar, entonces verías que solo está diciendo que no se puede llamar HTTP o fluoróforo. Entonces esto es lo que obtenemos en virtud de llamamos retorno, no telefoneado. Muy bien, por lo que eso es básicamente sostén, eso funciona. Ahora nota una vez más que se trata de un método on post. El método on post es lo que va a funcionar con el formulario que está enviando con el método es igual a post. Muy bien, así que déjame volver a lo grabado que tenemos Hagamos logrado. Por lo que el año fue 2215, no 2013. Eso está bien. Fui a salvar y luego mirar eso. 2015. Recuerda que esto se está cargando desde la base de datos cada vez que golpeas el índice, está consultando la base de datos. Lo que veas aquí es el estado actual del registro que está en pocas palabras. Obra de actualización completa. No importa cuán complicado pueda verse un sistema, cuán sofisticados sean los botones y animaciones y así sucesivamente. Lo que estamos haciendo aquí está en la raíz de cada sistema, el sitio web con el que interactúas, todo lo que están haciendo es permitirte poner datos en la base de datos a través de la reforma, modificado a través de un formulario. Míralo a través de una página de índice o una página de detalles que vamos a mirar en unos pocos o eliminada. Eventualmente. Eso es todo lo que realmente está sucediendo, sin importar el sistema que esté mirando. Cuando volvamos, veremos implementación o eliminación de funcionalidad. 12. Añadir detalles Página de maquinilla: Muy bien, así que estamos de vuelta. Y sé que en la lección anterior dije que trabajaríamos en el Delete, pero tengo una sorpresa para el Delete, vamos a hacer las cosas un poco diferente para el Eliminar. En cambio, trabajemos en nuestro discurso de detalles. Muy bien, vamos a saltar a nuestro código. Y creo que a estas alturas conocemos al Drew. Vamos a pelear o velocidad de detalle. Así que haz clic con el botón derecho en la carpeta de autos, agrega página Razor usando Entity Framework, estamos llamando a este detalles Y la plantilla sería la plantilla para detalles. Entonces nuestro modelo es auto y todo lo demás queda. Y obtenemos nuestra página para los detalles con su archivo de código correspondiente. Conocer la página de detalles es más o menos sólo otra página que nos ayuda a conducir a la r de corroer que se lee. En este punto, podría ser algo difícil ver la relevancia de la página de detalles. Porque lo que realmente te muestra la página de detalles son los detalles de algo, mientras que el índice realmente muestra la falta de una vista previa. Entonces si tal vez nuestra mesa tuviera 20 o 50 campos diferentes, tal vez incluso diez campos, no querrías todos los de la lista. Pensable como un costo, una lista de clientes, o incluso en Amazon. Cuando estás mirando los productos en Amazon, no te están mostrando cada cosa sobre la proteína. Te están mostrando el nombre, su precio, tal vez cuánto tardaría en enviar. Pero entonces en el momento en que haces clic en ese producto, entonces ves todo lo que construyo un prototipo, ves todos los tamaños y colores potenciales y de dónde es y qué material lo hace, etcétera Así que eso es realmente para qué está diseñada la página de detalles. En este caso, es discutible que es opcional porque auto realmente cuando tiene dos detalles para mostrar en cualquier punto cuáles son el oído y el nombre. Bueno, una vez más, si fuera una mesa más grande con más detalles para mostrar, entonces no querrías enumerarlos todos en el índice en ese momento. Probablemente no querrías mostrarme ser el año del auto o el nombre del auto. Entonces digamos que no queríamos mostrar el año. Sólo voy a comentar esto. Entonces cuando miras la página de índice, solo estás viendo el nombre del auto. No obstante, se quiere ver el resto de los detalles sobre el auto. Haz click en la página de detalles donde tienen el enlace aquí y luego sabes que hemos creado la página, la tenemos cableada. Por lo que va a ir a esta página de detalles detalles que CSS HTML. Simplemente modificaré esto para decir detalles del auto. Deshazte de que cada Doug, hay una forma antigua porque una vez más, solo es leer datos, datos como un enlace generado automáticamente para ir a Editar. Entonces aquí hay otra cosa. Está buscando, editar fuera de la caja. Utilizamos la actualización del nombre de página. Entonces tengo que asegurarme de cambiar eso. Entonces podemos volver a la lista si así lo deseamos. De acuerdo, entonces, ¿qué está haciendo realmente la página de detalles o el archivo de código? Cuenta con auto predial, no tiene cláusula de propiedad de Bend. No hay presente extranjero, pero sí tiene la propiedad. Y luego hace lo mismo donde dice Consígueme el registro con el yodo está buscando esa identificación. Si es nulo, volver no telefoneado. No es nulo, entonces trata de encontrar el registro. Si puedes encontrar el registro, No es teléfono, devuelve la página. Entonces esta es una especie del mismo código que vimos generado para la, para la página de edición. Muy bien, no voy a hacer las modificaciones aquí. Estos tienen tanto a comparación del regular fuera de la caja anotado frente a nuestra pequeña modificación donde acabamos de hacer una llamada a base de datos y determinar si no se encuentra. Para que puedas compararlos, pero sigamos adelante y corremos. Así que sólo voy a Control F5 que podamos ver lo nos trae el pH de los detalles de nuestra página de índice. Si pego detalles, entonces voy a ver los detalles de la tarjeta y me va a dar todos los detalles. Por lo que una vez más, esto se genera. Puedes modificar el aspecto y la sensación de la misma como necesites. Desde aquí puedo hacer clic en él. Y debido a que modificé el enlace, no estoy teniendo problema saltando a la página de edición. Puedo volver a la lista. Una vez más, toda la navegación está estrechamente acoplada aquí porque cada enlace sabe dónde encontrar. Eso es muy, muy importante desde cualquier pH, deberías poder navegar a otra página. O el pH nulo debe ser de más de dos o tres clics en función del tamaño de un sitio web. Pero generalmente hay una política de gira de tres clics a la hora de navegar entre páginas. Eso es realmente todo por los detalles, Niza y sencillo, comparado con todo lo que hemos pasado con el crear y editar para ver que los detalles son realmente sólo cargar en el registro y mostrarnos. Se puede modificar lo que se muestra en el índice. Una vez más, si no quieres que todos los datos en la página de índice, por eso tenemos la página de detalles para mostrar lo que no se mostraba en la lista. Cuando volvamos, vamos a mirar usando algún jQuery con nuestro delete. Porque con nuestro delete, no voy a crear toda la página para el delete. Tienes dos formas de mirarlo y exploraremos las opciones cuando volvamos. 13. Añade la página de eliminación de Razor: Chicos, bienvenidos de vuelta. Vamos a estar mirando trabajar con nuestra eliminación operativa. Empecé a mencionar que generalmente hay dos modelos que gobiernan mantener la eliminación ocurre. Uno, se puede establecer el pitch he hold lead, que en realidad es igual a un discurso detallado, pero también se dobla como página de confirmación porque quieres permitir que el usuario vea el registro que son capaces de eliminar y luego pregúntelos, ¿ Estás seguro que quieres eliminar? Echemos un vistazo a ese 1 primero. Eso sigue el mismo patrón que hemos estado siguiendo. Adelante y agrega una nueva página Razor usando Entity Framework. Llamaré a este eliminar. De la plantilla. Yo sólo elijo las necesidades o el mismo modelo. Entonces obtenemos nuestra página generada para eliminar con su archivo de código. Por lo que una vez más, inyectando el contexto DB, también tenemos un botón apropiadamente para el auto. Por lo que aquí va a ocurrir alguna forma de forma o recolección de datos. En Git, tenemos el mismo tipo de lógica que acabamos de ver con la edición. En la página de detalles donde obtenemos el ID, asegúrate de que no sea nulo, obtienes el registro y devuelvo a pH si grabo fue encontrado. Pero luego en el post, también va a verificar que el ID no esté vacío. Por lo que ten en cuenta que está buscando sólo el ID en Post. Es muy posible simplemente tomar un parámetro que corresponda con los datos que se encuentran en la página. Así que permítanme simplemente correr el paralelo aquí. Con nuestra operación de actualización. Dijimos comprando propiedad en todo el auto. Aviso que no hay parámetros en el OnPause. Eso se debe a que todo el objeto automovilístico tenía campos presentes en el formulario. Entonces teníamos una identificación, teníamos el nombre, teníamos el año. Entonces cuando hacemos clic en Guardar, realidad serializaría todos esos puntos de datos que se ingresaron y los colocaría dentro de los autos. Entonces es por eso que enlazo propiedades, básicamente cargando qué datos entraron al objeto, entonces podemos operar en él. Conociendo el caso de un delete, realmente no necesito saber el nombre y el año. Realmente solo necesito saber cuál es el ID del registro que hay que eliminar. Entonces puedo especificar en el onPause que solo estoy buscando el ID. Una vez más, puedo hacer todos los cheques. Comprueba si es nulo. Quiero decir, si estoy tratando de eliminar nada, entonces devolver no carpeta, pero de lo contrario intente encontrar el registro del auto que necesita ser eliminado. Entonces esta vez solo vamos a usar este hallazgo asíncrono. Entonces es algo diferente de los valores predeterminados de primer orden porque la multa estos Sing utiliza los valores clave para que pueda dispersarme en Id a diferencia los primeros o predeterminados que requieren una condición o esta expresión lambda, donde esto es cierto, entonces conseguimos un auto, mientras que el hallazgo, va a ver ir a la mesa y encontrar un registro con ese ID para la clave primaria, que por supuesto todavía se encuentra con el riesgo de que sea no. Entonces tratamos de encontrar el auto. Sería ese ID si el auto no es igual a no, entonces procedemos a retirar la base de datos del automóvil, conseguir la mesa de autos, y quitamos este registro. Por lo que tenemos que encontrar el registro. Después quitamos el registro. Una vez más, estamos incrementando datos por lo que guardamos los cambios. Después de todo eso, volvemos al índice. Por lo que aunque Kiara estuviera modo en este caso, no vamos a devolver ninguna no telefonada. Sólo vamos a redirigir a índice va. A lo mejor estás tratando de eliminar algo que importaba el tiempo que haces clic en el plomo, alguien más, lo necesitaban, sin daño, sin falta, solo regresas al índice. Una vez más, esto se acaba de generar código. Si quieres hacer algo diferente en tus escenarios, siéntete libre de modificarlo como necesites. Este escenario funciona bien porque cuando pasamos al Delete, vemos uno. Se ve igual a los detalles. Este es el mismo código que estaba en la página de detalles. No obstante, tenemos un mensaje. ¿ Estás seguro de que quieres eliminar esto? Simplemente voy a hacer lo que siempre hacemos aquí donde veo los mejores cambios están golpeando borrar auto. ¿ Estás seguro de que quieres eliminar esto? Mostramos los detalles del auto, pero mira el formulario. Esta vez tenemos una forma de todo lo que está en esta forma. Bueno, sí, es post método, pero todo lo que tiene es el oculto para la identificación del coche. Eso es análisis básico P4. El Yo Am Voy a atarme a esa propiedad. Por lo que habría visto este formulario ESP, el Crear, ver cualquier cosa las actualizaciones, vinculante a esta propiedad coche dot ID. Pero entonces el nombre del inmueble será ID. Y luego en el Delete, eso realmente solo lo vinculará al ID del parámetro. Entonces así es como sé que solo estoy obteniendo el DNI de este envío de formulario. Así que aquí estamos viendo es un botón de enviar con el delete válido y es un peligro de guión BTN, lo cual tiene sentido. Si cambias de opinión, siempre puedes volver a la lista. Muy bien, echemos un vistazo a lo que obtenemos con el delete. De la lista voy a hacer click para eliminar. Se va a cargar mi registro, eliminar autos, por lo que quieres eliminar esto. Y así en los detalles del registro, podemos optar por eliminar o podemos optar por volver a la lista. Entonces si hago clic en Eliminar, entonces vuelve a la lista y ya no hay un coche en mi base de datos o al menos las leyes de base de datos. Una carta menos y tenía antes de hacer esa operación. Sólo voy a crear recrear el auto rápidamente. Suzuki Swift sport. Y fue un 2013 haría y crear. Muy bien, entonces tenemos nuestro registro de nuevo y puedes hacer esto por tantos registros como necesites. Entonces esa es la opción uno. Te gustaría permitir que el usuario revise el registro y pregunte, ¿ Estás seguro de que no pudieron eliminar y confirmas? Sepa qué pasa si no quisiera introducir otra página completa solo para la operación de eliminación. ¿ Y si quisiera eso aquí mismo? Cuando la persona hace clic en eliminar, les pedí pop up tal vez. ¿ Estás seguro de que quieres eliminar? Haga clic en sí, y luego ocurre la eliminación. Probemos algo que nadie método de implementación de esto sería envolver cada enlace de eliminación en un formulario y convertirlo en un botón de envío en lugar de solo una URL a la Delete. Sí, tenemos la página, pero volvamos a nuestro índice y tipo de modificación o lo que está pasando aquí. Podría decir forma aquí mismo. Déjame hacer bien mi ortografía. En esta forma, vamos a tener botón. Este botón básicamente va a ver lo mismo que ve el botón actual no comía. No quiero que necesariamente se vea como un botón. Quiero decir, supongo que en este momento probablemente podamos empezar a ser creativos con nuestros enlaces también. Entonces no hay problema. Sólo diré que la clase es igual a vt n dash. Eso es editar. Por lo que probablemente querré que sea como una advertencia. Eso es todo. Es botón. Por supuesto cualquier botón necesita ser T y luego btn dash el tipo de botón. Este es un detalle, por lo que esta sería b2 info de la industria, solo para mostrar la info. Y entonces este botón va a ser costo igual a b2 y peligroso, No, yo usuario no podría decir cuál es un botón, cuál es un enlace. Todos ellos se verán iguales. Tenemos este botón Eliminar. Lo que podemos hacer es decir onclick. Ya miramos esas cosas de eventos cuando hablamos de JavaScript antes, puedo ver, ¿Estás seguro de que quieres eliminar este registro? Entonces onclick, voy a devolver un confirmar. Entonces ese es un método incorporado. ¿ Y cuándo miraremos el método de alerta en JavaScript? Al hacer clic, confirmado es solo otro métodos JavaScripts que estoy viendo desclicar volver, confirmar. ¿ Estás seguro de que quieres eliminar este registro? Yo soy que básicamente sólo da un sí, no caja. Eso es realmente todo lo que necesito para el botón. Pero luego volvemos a la forma uno. Queremos asegurarnos de que sea el método post. Ahora voy a explicar por qué queríamos ser explícitos sobre que fuera post. Hay una serie de cosas sucediendo con los postes. Por lo que los beneficios implícitos de usar los posts que ya exploramos, donde hemos hablado sobre el hecho de que los datos no se están enviando a través de la URL. Se está ocultando en el fondo. Entonces eso es bueno. Soy protección inherente a los datos sensibles como nombre de usuario, contraseña, información de tarjeta de crédito, etcétera. No, probablemente te estés preguntando, vale, entonces qué desde entregable, tal vez la identificación. Bueno, ya vimos que en el Foro Delete incluso entonces, intentaron usar el post aquí porque este mismo concepto, golpearon el ID y luego tuvimos el botón eliminar. Es lo mismo que estamos haciendo excepto que lo estamos haciendo dentro de la lista en el índice. Pero entonces otros beneficios de la publicación serían incorporados en ASP.Net Core, nuestras características de seguridad contra XSS y el CRS si los ataques. Esencialmente sin entrar en los detalles de lo que estos dos significan y así sucesivamente. La forma en que funcionan sería que las personas puedan usar JavaScript y secuestrar maliciosamente los datos que se envían a través del cable. Lo que ASP.Net tiene incorporado o ASP.Net Core. Cada vez que tengas un formulario y lo conviertes en un post método, y luego lo tienes en post esperando ese tipo de envío a través de esa publicación. Cuentan con el validar de Tolkien antiextranjero que cualquier solicitud que llegue a un puesto es válida desde el sistema y no secuestrada por una entidad externa. De acuerdo, así que eso es como una característica de seguridad que está incorporada. Doy no mencioné que no te darías cuenta de que todo eso realmente está sucediendo en segundo plano. Entonces por eso es importante que a pesar de que no estamos generando ni formamos aquí, siempre quieras asegurarte de que lo tengas como post método y esas características de seguridad casi estarían implícitas. Otras cosas que queremos hacer ahora que tenemos el formulario, tenemos el botón, tenemos que decirle a dónde ir. Ahora cuando digo raro al gol, me refiero a que las otras páginas que tenían foros como vamos a ver, el Create crearon el formulario que había dicho post método. No tenía nada explícito que decir a dónde debía ir. Eso se debe a que supondrá que una vez que se presente el formulario, se trata de una solicitud de post. Por lo que automáticamente irá al on post. De lo contrario va a conseguir lo mismo con las actualizaciones, lo mismo con el índice de eliminación, sin embargo, solo tiene uno en Get. No tiene posts. Y sabremos que estamos poniendo en una forma que va a estar tratando de llamar a un método post en la página de índice que no existe. Lo que podemos hacer ahora es crear Handlers personalizados. Así que sólo buck trucking, sólo para que entendemos en llegar a la publicación. Y el que somos capaces de crear, a esos se les llama manejadores. Estos métodos conseguir, publicar, hacer lo que sea en segundo plano, son manejadores. Por eso los llamamos. Tenemos que decirle al formulario que debe ir a su ISP, P dash page dash handler. Voy a ver DDGT. Ese es el nombre del manejador al que debe ir. El método es post. No. Además de eso, también quería obtener el valor id. Voy a ver es B dash, escribió guión ID. Eso no soy yo diciendo que cuando estás enviando el formulario, quiero que pases por encima escribí valor o un valor de cadena de consulta con ese nombre. Entonces si dijera auto ID o si dijera pulpy, sea cual sea ese tipo ahí después de que la palabra escribió, ese es el nombre de la cadena de consulta que dice el nombre del parámetro que mi manejador estará buscando . Entonces lo voy a dejar como yodo de coche en lugar de solo el DNI. Muy bien, entonces ahora se puede ver explícitamente a lo que me refiero. Por lo que ASP ruta del dash, identificación del coche debe tener el valor de at sign item dot ID. Aviso cada vez que hacemos clic en Editar o detalles, se envía automáticamente a través del ID. Eso se debe a que desde el bucle para-cada, cada elemento donde el enlace que es p root dash ID aquí. Entonces eso ya está sucediendo. Lo vemos sucediendo cuando haces clic en detalles. Se llama página de detalles y está enviando sobre el valor id. Es por eso que en Get, está viendo identificación. Al igual que con detalles o borrar más bien en Post, está buscando ID, y eso es porque el delete, déjame encontrarlo rápidamente en el Delete, realidad estamos sentados aquí. Sólo te estoy mostrando diferentes sabores. Obtienes el código generado, pero es bueno entender cómo puedes hacer lo mismo de múltiples maneras. Esto funciona el formulario y está enviando el DNI esta semana. Esto también funcionará con menos líneas de código, solo la forma. No obstante, diciendo ir a este manejador de páginas y enviar un parámetro llamado Car ID con el mismo valor de ID. Es un método postes. Estamos agregando esa confirmación al botón. Y sólo voy a comentar el enlace existente. Pero lo que vamos a hacer ahora es crear ese manejador de eliminación en el archivo de índice. En el código índice detrás. Puedo extender esto y puedo decir público y no convertirlo en una tarea asíncrona. Digamos resultado de acción de tarea porque voy a querer que devuelva un resultado real. Y voy a decir en post, eliminar. Vamos a ver la sintaxis en get on post. Y puedo decir post asíncrono si quiero. Esa es una convención de nomenclatura que reconocen. Eso es opcional. Pero mi punto es que uno sé es un método post del foro, por lo que tengo que especificar en post a llamo al delete. Dije que tu manejador es borra. Se buscará automáticamente un manejador llamado delete que esté esperando una respuesta post. Por lo que solo poner en cartel en git le dirá al manejador qué tipo de solicitado debe estar buscando del intento del Buró en post delete. Lo que realmente voy a hacer es solo reutilizar este código. Sólo voy a copiar eso de la eliminación generada. Ciertas cosas no serán adultas, pero eso está bien. Podemos rellenar los espacios en blanco, pero lo más importante serían los parámetros. Así que voy a decir int signo de interrogación identificación del coche. ¿ Por qué ID de coche? Porque en mi forma, el índice, sí vi que tu raíz ASPE es identificación de auto para todos los demás fue ID. ¿ Qué para este? Voy a decir identificación de auto. No lo estoy haciendo por ninguna razón especial. Sólo te estoy mostrando. Lo que realmente hace la raíz ASP. Si cambio el ID, entonces mi manejador necesita buscar ID. Si lo cambié a Puppy, necesita buscar cachorro. Sólo voy a dejarlo como identificación de auto solo para que podamos ver la diferencia. Entonces auto ID del formulario, va a llamar al pH 100 delete y es un método post. Por lo que va a ir por aquí y buscar un manejador llamado delete que está diseñado para en las respuestas post que está tomando el parámetro llamado Car ID, entonces el código tendrá que ser ajustado porque no hay identificación ya no es identificación aquí, no es identificación del coche, identificación del coche. Ahora había visto que no hay auto seguro de un auto, eso está bien. Puedo ver fácilmente, dame una variable local llamada auto, porque no necesito una propiedad de la clase como la última vez. Sólo necesito una propiedad local llamada auto. Ve y encuentra el auto. ¿ Encontraste el auto? ¿Sí o no? En caso afirmativo, entonces retire auto. Muy bien, así que esta es sólo mi variable local dentro de la eliminación. Entonces al hacer clic en Eliminar, tratamos de encontrar ID, señor. Tratamos de determinarlos. Id tiene un valor. De no llamarse por teléfono. Probablemente no querrías no llamar aquí. Si estamos eliminando directamente del índice, entonces eso está bien, eso está bien. Podemos dejarlo. Quiero decir, una vez más, el contexto determinará cómo quiere utilizar una experiencia para ser. Así que eso está bien. Lo dejamos, lo dejamos como esta identificación del coche. Si hace clic en él, no telefoneado, intente encontrar el auto. Si el auto no es igual a nulo, entonces lo eliminamos y luego recargamos la página de índice. Lee Erich a *****. Bueno, eso podría ser fácilmente redirigir a la página sin nada en ella. Entonces literalmente solo diría, ¿en qué página estoy? Permítanme volver a cargar esa página. También podríamos decir tono de retorno. Por eso lo hice. En realidad resulta aquí. Entonces, a diferencia de éste, este no tenía un tipo de retorno. Por lo que no necesitaba los resultados de la acción i. Pero en este caso quiero devolver alguna forma de mando para decir llevarme de vuelta a la página en la que estoy. Por eso dije tarea, resultado de acción aquí. Retinol acaba de hacer la redirección a la página sin ningún valor. Así que sólo te estoy mostrando los diferentes escenarios. Una vez que te pongas cómodo, empiezas a escribir el código a nivel experto, entonces estarías como, vale, sí, veo como todo va juntos y sostengo todo funciona. Tomemos este otro Delete o esta alternativa eliminar código para una prueba de ejecución. Tan bien tomó autos y luego está bien, podemos arreglar este problema de visualización más adelante. No hay problema. Haga clic en Eliminar. Aquí está nuestro pronta. ¿ Estás seguro de que quieres eliminar este registro? Si hacemos clic en Ok, va, causó el manejador, el borrarlo leía Eric al pH. Así que vamos a crear otro auto de prueba. Algún año aleatorio. Voy a poner un punto de descanso. No estoy en modo de debug. Déjame ir al modo de debug y luego podemos poner un punto de interrupción para ver qué pasa. Cuando hago clic en Eliminar. Recibo el clic del prompt, Ok, entonces procede a llamar al manejador. Entonces, una vez más, supo dónde buscar porque le dije el formulario, usar ese método en particular y pasar por encima de ese ID de ruta en particular. Y esta es la solicitud de método, el método a utilizar. Los tres de estos se combinan para dejar que se presente el formulario nulo que quiere. Debería golpear a este manejador y al lado de codificación de este manejador, el nombre sugiere que es, es un, un 100 supuestamente para manejar este escenario. Este escenario es que quiero eliminar este auto, identificaciones de autos tres, de acuerdo, por lo que vemos que el ID de ruta va por encima. Bueno, obviamente llamó al auto en la datos o encontrará la base de datos actual, lo eliminará, y luego redirigirá a la página en la que está. Así que déjame golpear a F5 y ya ves que acabas de leer Eric sin ningún ajetreo. Muy bien, así que acabo de arreglar rápidamente la pantalla es que estás teniendo aquí con los botones. Y es una solución realmente simple. Probabilidad, incluso un HUC, dependiendo de cómo lo mires. Pero en lugar de poner las etiquetas de ancla lado viejo, acabo de poner todo en la forma porque la forma es lo que estaba rompiendo las líneas. Entonces acabo de poner las etiquetas de anclaje dentro del formulario y eso es realmente saber consecuencias porque al final del día, sólo el botón hará el envío. Si hago clic en Editar, simplemente se alejará. Si hago click en Detalles, navega lejos. Entonces si hago clic en Eliminar, me solicitan efectivamente cancelado. No pasa nada. Y luego si hago clic en Ok, hemos visto lo que pasa. Esto es agujero. Puedes empezar a trabajar un poco de JavaScript en el nodo para empezar a ver, vale, bueno, esto es lo que se supone que debe hacer. Cuando volvamos, te voy a mostrar un poco más de JavaScript. Empezaré a diseñar nuestras páginas porque vemos que nuestro botón Crear está arriba. Parece un enlace. Empezamos a mirar total para dar estilo al botón Editar, la lista de botones sigue siendo un enlace. El detalle tiene dos enlaces. Entonces, cuando volvamos, veremos un aviso de confirmación más robusto. Vamos a estar usando esta biblioteca llamada Sweet alert. Eso es uno. Y cómo podemos usar JavaScript o jQuery para conseguir eso en. Y dos comenzarán a estilizar un poco más los RPGs. 14. Uso de vistas parciales y mejoras de la UI: Muy bien, bienvenido de nuevo. Entonces nuestro objetivo para esta lección es un estilo todos nuestros enlaces para lucir un poco más amigables. Y lo que queremos hacer es poner en una confirmación un poco más robusta en la eliminación al menos. Empecemos. En primer lugar, vamos a crear el cambio y crear enlace. Déjame saltar del modo de depuración, ir a mi archivo index.html, y aquí está el botón Crear. Entonces vimos que todo lo que tenemos que hacer por nuestras etiquetas de anclaje es darles la clase BTN dash. Soy primaria para el Create. Vamos a ser un poco más creativos allí momentos en los que tal vez quieras pensar en poner los iconos ¿verdad? Así que a veces no quieres que toda la palabra edite o toda la palabra detalles. Y incluso puedes quitar un poco estos iconos de tubería. O incluso como el Create que probablemente querrías y es un signo más en su alma. Lo que podemos usar para eso sería Font Awesome, que es una biblioteca que tiene una serie de iconos. Y podemos mirarlo rápidamente. Si saltas a Font Awesome.com y estamos viendo los iconos en la versión 4.7, verás que tienes bastantes iconos que puedes usar. La mayoría de ellos son gratuitos. Es posible que tengas que pagar o inscribirte en alguna cuenta que tengan, pero eso está bien. Pero en este momento, hay tantos íconos que te sacas de la caja que es realmente genial. Entonces si quieres un signo más, estoy seguro de tener un uso Pelosi de plus. Creo que tienen como un frijol o basura o algo para significar eliminar. Pero tienen bastantes iconos que podemos usar con el fin de solo mostrar ciertas cosas. Ahí vamos, basura. Por lo que a veces quieres un ícono. Ahora, ¿qué crees que podrías ser? Se llama otra cosa, pero no hay problema. Veamos cómo podemos integrar esto en nuestro proyecto. Volver a nuestro código. Podemos hacer clic derecho dub, dub, carpeta raíz dub. Y luego podemos agregar una biblioteca del lado del cliente. Cuando hacemos eso, sólo tenemos que escribir en fuente. También muchos asientos ya tipo de relleno adeudados por nosotros. Así Font, Impresionante, selector de iconos. Y entonces ese no es el 101. No es un icono de peaker. Déjame intentarlo de nuevo. Así que solo estoy quitando la ubicación objetivo. Permítanme en realidad sólo asesorar y empezar de nuevo. Así que agrega biblioteca del lado del cliente. Simplemente escribiré fuente, y ahí está, guión de fuente, Impresionante. Eso es lo que quiero. Cuando hacemos clic en eso verás va a decirles a los que vamos a estar poniéndolo en la ubicación objetivo de dub, dub, dub route slash font. Impresionante. Pero me gusta que todas mis bibliotecas de terceros estén organizadas en el mismo lugar. Entonces en cambio voy a decir dub, dub, dub route slash, LIB slash Font. Impresionante, Ahí es donde quiero. Pero estos son todos los archivos que vamos a conseguir. Y no voy a modificar nada de eso. Voy a elegir archivos específicos. Sólo voy a seguir adelante y golpear Instalar. Y luego descargará lo requerido para mí y lo agregará a la carpeta que especifico. Ahí está, Font Impresionante. También tenemos un archivo adicional en forma de este Lindeman dot JSON, que básicamente es simplemente llamativo decir que estas son las bibliotecas que has utilizado el gestor de biblioteca cliente para instalar. Muy bien, eso se ve bien hasta ahora. Saber lo que necesito hacer es todo el diseño sepa que también debe incluir recursos Font Awesome. En el área de la cabeza donde puse todas mis hojas de estilo justo encima del bootstrap. Fui a poner en la hoja de estilo para la fuente. También. ¿De dónde obtengo esta hoja de estilo? Está en la carpeta lib, carpeta Font Awesome, carpeta CSS. Y entonces verás todo todo el punto Min es una especie de colapso en la deuda. Entonces en lugar de usar el todo usamos la versión minificada. Ya discutimos la diferencia entre la versión única y la minificada, correcta, por lo que sólo vamos a hacer eso. Por lo que incluimos ese expediente justo ahí. Con esa inclusión, puedo No, seguir adelante y mirar cómo puedo usar mis iconos. Si vuelvo a saltar a la página web y miro los ejemplos, entonces me mostrará cómo se ve la sintaxis y es realmente simple. Todo lo que necesitamos es una etiqueta I y luego una clase con FA. Y luego si un guión, sea cual sea el ícono que estamos buscando. Sí dijimos que queríamos como una basura para la eliminación. On. Aquí hay un ejemplo práctico. Tienes la etiqueta ancla, y no configuraron la etiqueta ancla, tienes ese ícono. Entonces lo que sea que tome el uno, ahí es donde se obtiene ese ícono de anfitrión al lado de casa. Ese libro dijimos biblioteca, etcétera para que puedas ser muy creativo y usar estos iconos como te parezca conveniente. Entonces aquí hay algo práctico que vemos aquí tenemos la papelera. ¿ Cómo obtengo la papelera? Vale, es basura. Así que sólo voy a pedir prestado esto. Saltar a nuestro código. Entonces en el botón eliminar en lugar de la palabra eliminar, solo quiero el icono para la papelera. Para editar. A lo mejor sólo quiero y déjame ver cuál es el testimonio. Entonces creo que si no me equivoco, la inteligencia realmente comenzará a llenarse u opciones basadas en el hecho de que incluyamos el CSS. ¿ Y si quisiera un libro para editar? Déjame ver si hay una edición. Editar. Hay uno explícitamente para editar. Y luego para detalles probablemente podamos usar algo como déjame ver si hay algo para los detalles. No, entonces podemos usar bulk o un viejo guion de libros Open. Ahí vamos. A veces puedes, tendrías que sentarte y explorar las diferentes ideas de íconos o las opciones más bien. Y luego te acercas a la tuya basada en lo que quieras transmitir al usuario. Así que sólo voy a previsualizar rápidamente esto. Cuando echamos un vistazo, vemos que, vale, esto parece una edición. Este es un libro abierto. Yo sostengo. Mi usuario inferiría que este es el aspecto de los detalles más y luego el ícono de la papelera no aparece. Así que si salto hacia atrás, a veces también basado en la versión de la fuente Awesome file que estás usando ciertos campos son ciertas clases podrían no funcionar. Así que como basura dot dash o podría no funcionar pero discontinuado basura mi trabajo. Así que déjame que acabo de hacer ese cambio refrescarse. Y ahí vamos. Así que estamos haciendo que nuestra papelera luzca mucho mejor. Solo te estoy mostrando que estas son formas que puedes usar para condimentar cómo serán tus pantallas si no quieres confiar solo en los iconos, porque no todo el mundo podría inferir lo que nosotros quieren que de solo los iconos y siempre se puede editar el icono de texto luego la palabra editar detalles y eliminar. No se diga que no fue muy fácil de usar porque no sabías lo que menos los iconos MIT Boulder le aporta ese poco estilo. Así que incluso para el botón Crear, el link create, más bien solo voy a copiar eso que etiqueto. Y entonces esto está creando un nuevo bot. Entonces arriba arriba, voy a ver ¿hay un signo más? Hay un signo más. Entonces si un guión más refrescar, y vemos que plus inscribirse periodos. Entonces es así como puedes empezar a sacar al corruptor a tu pantalla de tu aplicación usando estas bibliotecas de terceros. Puedes pasar por. Desafía a rediseñar estas páginas, ponerme en el buck para enumerar un poco más robusto en los detalles. Ella es la editora y el dinero para enumerar aquí y vamos a necesitar ya está haciendo lo que tiene que hacer. Puedes seguir adelante y hacer eso. Por lo que espero que asumiera ese reto y que siguiera adelante y aplicara algo de creatividad a las otras páginas. Pero te voy a mostrar lo que hice. Y así podemos comparar notas en la edición. Todo lo que hice fue agregar esto de nuevo a la lista. Ahora observa que esta lista anterior de dos es, es un golpeado con una bobina primaria o ambas. Sólo tiene esa mirada cuando me pongo sobre ella. Eso se logró fácilmente mediante el uso BTA y la línea de guión, guión primario. Por todas las páginas que tenían el dólar para listar el enlace hacia abajo en la parte inferior, lo que hice fue moverlo fuera de la DV estaba adentro, ponerlo en el mismo div que el botón Enviar, y luego darle el btn, btn esbozar primaria. Y todo lo demás permaneció intacto, pero le di icono de flecha izquierda. Aún entonces, perdí una oportunidad aquí con la entrada. Entonces la entrada no puso en ese icono. En la entrada. El botón guardar es solo una entrada no es una etiqueta de botón, es solo una etiqueta de entrada. Si quisiera poner en algo para decir que está guardado y no podría usar la entrada. Lo que tendría que hacer es usar el botón. Vine a mostrarte lo que hice y me estoy dando cuenta de que si tuviera más espacio para mejoras para poder cumplir con ese botón y darte la clase btn, btn dash advertencia. Y luego los botones pueden tomar un tipo. Y éste sería un botón Enviar. Eso está bien. Pero entonces por su ícono, veamos qué ícono podría usar aquí. Si es, hay un Save, vale, si guardo y creo que eso nos va a dar ese disquete, este ícono de aspecto. Entonces después de hacer esos cambios, termino con ese botón de guardar versus las entradas. Así que solo te estoy mostrando cómo puedes usar diferentes etiquetas para lograr la misma funcionalidad. Por lo que ahora puedo eliminar esa etiqueta de entrada o esa entrada. Sí y no. Sólo tengo este guardado con ícono o arriba para enumerar. Una vez más, esa pequeña animación hover se logra solo por falta BTN, guión de contorno, y luego tienes la misma advertencia primaria, peligro, etcétera yo estaba en un proceso. Te veré en que cada página que tenía el buck to list link, todo lo que hice fue moverla al mismo grupo de formularios que el botón para el envío. Entonces esa es la página de actualización en el Crear. Hice lo mismo para poder conocer el mismo tipo de modificación aquí con el botón Crear. Sólo voy a hacer eso mientras todos estamos aquí mirando. Tomado ese botón y esto es casi tan sencillo copia NPS solo la diferencia sería que esto sería primario. O puedo hacerlo algo más como el éxito porque es un Create, así que es éxito, crear. Y luego puede tener también el ícono de guardar. Podía ver si hay algo más que me vendría bien. No puedo pensar en nada más este momento, así que lo dejaré con la página Guardar, la Crear. Clip hasta la lista dos y hago clic en Crear nuevo, obtengo ese botón verde. Ese buck para enumerar. De acuerdo, entonces para mi página de detalles donde tuve la edición y volver a Listar los mismos principios. Entonces este es el mismo botón que viene de la página de índice para el Editar. Y entonces esta es la misma lista de bucket que hemos estado usando. No, hay una pequeña diferencia sintáctica en el discurso de detalles donde el ID de ruta del tablero ASP por supuesto es model.py car dot ID. Entonces esa es una diferencia entre lo que habría sido y lo que tenía que escribir lo que había en la página de índice más bien frente a lo que tiene que ser en esta página. De lo contrario. Ahora estamos empezando a ver cómo podemos añadir un poco, vez más carácter a nuestra aplicación. Ahora que sabemos integrar bibliotecas de terceros, lo último que vamos a hacer es usar alertas dulces para manejar la confirmación para el Delete en lugar del script Java estándar pronta que actualmente estamos utilizando. Paso número uno, encontremos nuestras dulces alertas Biblioteca. Haga clic con el botón derecho www root otra vez, agregue biblioteca del lado del cliente. Y sólo voy a escribir dulces alertas ahí está apareciendo. Sólo voy a seguir adelante e incluir eso. Y luego una vez más estoy cambiando la ubicación. Quería dub, dub, dub o root slash lib slash slash sweet alert. Adelante y pulsa Instalar. Se actualizará o gestor de biblioteca o un archivo lib man. Por lo que ahora sabemos qué biblioteca adicional se ha agregado, pero también obtenemos los archivos o el archivo agregado al proyecto. Sepan que eso está en su lugar. Vamos a saltar a nuestro archivo de diseño e incluir el guión. Entonces la razón por la que vamos a incluirla en el layout y no en la página ni en la, ya sabes, exactamente donde eso si lo queremos en múltiples lugares, entonces tendrías que repetir esa inclusión en todas partes, que no necesariamente quiero. Por lo que sólo voy a incluir la amenaza por encima del sitio SIG. Simplemente agregaré esa etiqueta de script donde el SRC es igual a. Voy a saber que está en la barra de lib asientos barra de alerta. Todo eso estaba abajo por inteligencia. Agradable y limpio. Es decir, no, podemos acceder a esa biblioteca de alertas dulces desde cualquier lugar de nuestra aplicación. posible que lo desee en diferentes páginas. Cuando tienes diferentes archivos de índice, quieres tener el mismo tipo de funcionalidad de eliminación. Puedes, puedes hacerlo en todas partes. Cuando vuelvo a mi página de índice, necesito configurar una sección para un guion. Ahora, esto es algo que ya vimos porque en nuestra página Crear, era su sección para guiones. Entonces déjame darte un trasfondo en cuanto a lo que es esta sección lo puedo resaltar en. De acuerdo, queríamos incluir los guiones y así sucesivamente, pero no expliqué del todo por qué la sección está ahí y no solo incluimos los guiones. Volviendo a nuestra vieja página alelo, notarías que tienes diferentes secciones, por lo que tienes el tipo de datos de vista. Ya establecimos para qué sirve eso. También tenemos el cuerpo de render. Ya establecimos que ahí es donde todo el contenido dentro de nuestras vistas, se va a renderizar dentro de todo el layout posteriormente, no, verás que también tienes una sección que dice render sección llamada scripts, y no se requiere. Esto permite que siempre que queramos poner en un script, podamos invocar esa sección, poniendo ese script jQuery JavaScript personalizado o lo que sea. Y cuando la página de un todo se renderiza, ese área de guion se rendería debajo todo lo demás o relativo a su posición en la pieza Leo, ahí es donde se renderizará. Esto es importante porque recuerden hablo de dependencias. Jquery, entonces, entonces bootstrap tiene una dependencia de jQuery. Eso significa que no puedo poner la inclusión de arranque o referencia de escritura por encima de jQuery porque entonces lo que Bootstrap necesita hacer no estará disponible porque jQuery no estaba disponible. Al igual que con la dulce alerta. No puedo llamarlo una dulce alerta si no tengo la biblioteca de alertas dulce ya disponible en el momento en que estoy escribiendo mi código. Si bien tenemos que hacer es asegurarnos de que tengamos todos nuestros scripts que se necesitan en todos los ámbitos, todo en nuestro diseño y luego en nuestros puntos de vista cada vez que necesitemos un script o personalizado referenciado a otro script, nos aseguramos de que lo ponga en sección. Volviendo a uno de los foros existentes, el razonablemente a hacer los scripts de validación es que los scripts de validación son ambas bibliotecas relacionadas con jQuery. Estaremos llamando a la funcionalidad jQuery antes de que exista el archivo jQuery. Lo pone en esta sección para que cuando toda la página de diseño se renderice con todos los guiones y la novela y así sucesivamente. Jquery ya está en la página. Entonces para cuando se carga el formulario, los scripts de validación jQuery se cargan después del jQuery. En nuestro caso, queremos asegurarnos de que llamamos a nuestro dulce código de alerta después las bibliotecas de alertas dulces no estén en un pitch en la sección de ciencias a la que fui. Mira, quise abrir y cerrar la sección de guiones. Entonces aquí puedo empezar a escribir mi propio JavaScript personalizado o jQuery o lo que quiera. En esta situación, necesito un evento jQuery para ver cuándo se está enviando el formulario. Muy bien, así que leamos esto juntos. Veamos si va a funcionar, pero solo te voy a guiar por lo que estoy haciendo y podemos arreglarlo a medida que avanzamos. Entonces signo de dólar, estamos usando jQuery. Así que una vez más, no puedo estar usando el código jQuery hasta que la biblioteca jQuery ya exista y haya sido invocada. Sólo voy a signo de dólar C. Poner en esa función punto la función global abierta y cerrada, corsé punto y coma. Y luego dentro de esta función o puedo empezar a escribir mi código personalizado. Así que signo de dólar, y estoy buscando un envío de formulario. Por lo que sólo voy a decir formulario presentar. Entonces en un formulario de envío, queremos que el teléfono Shun. Y fui a darles a dos un parámetro llamado E. Así que E es como un argumento de evento para ver, bueno, represento el evento que está a punto de suceder. Por lo que estás tratando de presentar el formulario. E tiene la información para todo lo que está a punto de pasar. Lo primero que quería hacer es decirle E dot prevent default porque la operación por defecto de un envío de formulario es enviar. Quería pausar eso porque estoy a punto de preguntar, ¿Estás seguro? Muy bien. Entonces el botón recuerda que estamos agradando a esta materia sin hacer clic con las dulces alertas. Por lo que hace clic en el botón, quiero pausar el comportamiento predeterminado del envío del formulario. Y entonces voy a ver swale, que es mis dulces alertas, mientras que es corto para alertas dulces. En lugar de esos tirantes abiertos. Y luego voy a, solo, en JavaScript, la sugerencia de código no es tan poderosa como HTML y CSS y C-sharp. Entonces lo que intenté hacer es cuando abro algo que cierra a la misma hora y pongo el punto y coma, así que no lo olvido más adelante. Swale toma algunos argumentos y si lo desea, puede buscar la dulce documentación de alerta. Siempre es bueno mirar el documento es. Así que cuando no estés seguro, pero por ahora solo continuaré y solo lo veremos aquí. Entonces fui a ver, ¿estás seguro? ¿ Este es el título de la pronta? Como? Entonces tenemos el texto, que será el mensaje real que la persona va a ver, que es lo que voy a ver como lo que teníamos antes. ¿ Estás seguro de que quieres eliminar este registro? Ir a ver ícono. Icono es advertencia, por lo que sabe que este es un momento muy serio. Voy a decir botones igual a verdad. Así que las alertas dulces realmente pueden ser como un pop-up para decir, está bien, esto sucedió. clic fuera y dices, bien, cuando dices botones, sin embargo, por defecto te va a dar la archaea y cancelar tipo de prompt como lo que vimos con el onclick. Entonces también vemos que un modo de peligro es cierto. Observe que cada línea termina con una coma porque esto es como un edificio o para todo el objeto. Tenga en cuenta que tenemos el dulce objeto de alerta que Bill dijo que necesitamos seguir viendo. Entonces. El entonces parte va a ser como un delegado notas para ver, ver la entrada del usuario. Los insumos se almacenarán en cualquier variable que pongamos. Entonces confirme. Estoy viendo entonces mira para que lo confirme. Si hago clic en Aceptar. Confirmar es cierto. Si hago clic, Cancelar luego confirmó su falso. Eso es más o menos lo que es. Y hacemos ese mismo tipo de expresión lambda en esto. Entonces esta es una función delegada donde solo estamos haciendo una función sobre la marcha para ver luego continuar disfunción contra la variable confirmar. Estoy viendo si confirman. ¿ Qué queremos hacer si se confirma. Entonces si confirmar es básicamente ver si este valor es cierto, si decían, Ok, entonces ¿qué queremos hacer? ¿ Qué quiero hacer? Si dijeron confirman, entonces quise decir este punto someter. Estoy pausando el comportamiento predeterminado, pero luego estoy viendo, bien, bueno, adelante y preséntelo. Si decían que sí, declaremos esto para un giro. Muy bien, así que he ido adelante y sumé algunos registros adicionales para que podamos probar. Así que sólo voy a decir eliminar y oh, chasquear, no eliminé el prompt original, pero déjame simplemente hacer clic en OK y continuar. Y luego ves aquí está nuestra alerta de suites. Mira, oh, bonito. Eso se ve. ¿ Estás seguro de ese simpático ícono? Sólo te avisas que oye, peligro por delante. ¿ Estás seguro de que quieres eliminar este registro? Si hago clic en Aceptar. Está bien, sigue siendo un estímulo, así que tenemos que ponerlo en un poco más de diversión para que sepa exactamente lo que está pasando. Lo que está sucediendo es que porque cada uno de estos botones de eliminación es un formulario. Al hacer clic en Eliminar, está viendo todos los formularios, la página. Y entonces es por eso que ese prompt viene varias veces. Entonces no hay problema, estamos explorando lo que hay que ir en su lugar para que esta cosa funcione correctamente. Entonces en primer lugar, vecino mueve esto onclick. Ahora que tenemos las dulces alertas, no necesitamos que el navegador por defecto prompt. Sabemos que tenemos una interfaz agradable más limpia para usar un método alternativo para imprimir formulario por conferencia que veo imprimir fuera forma para cada botón sería difícil una forma. Y luego veremos en el botón, por favor. Sólo estoy mostrándote todas tus opciones. Entonces vimos que esto funciona el prompt predeterminado, y si te sientes cómodo con eso, no hay problema. Pero luego a veces cuando empiezas trabajar en otras bibliotecas, comienza a tener que hacer compromisos en el camino con todo tu diseño. Muy bien. Vamos a trabajar en combinar nuestro conocimiento de cómo funcionan los formularios en espera los trabajos de publicación en todos los datos necesitan estar sentados antes de que se pueda presentar la presentación. Lo que quiero hacer es crear una instancia de la granja en lugar de tener tres registros y tres foros diferentes, quiero tener sí, mini botones eliminar como muchos botones Borrar dice, hay registros, pero vamos a usar un formulario para ejecutar el comando delete a. Voy a tomar esta forma y la voy a colocar debajo de la mesa por sí sola. Así que sólo estoy cortando las etiquetas de formulario y poniéndolas por sí mismas. Fui a quitar esto es b root car id. Y en cambio le voy a dar una entrada, igual que lo que vimos en el origen o eliminar. En la forma de plomo originalidad. Teníamos una forma en el fondo del terreno de juego. Teníamos eso oculto, así que sólo voy a copiar eso para que tengamos un punto de referencia. El tipo de entrada está oculto, es antes de que no tengamos ninguna propiedad ni nada en el modelo llamado auto. No puedo ver una identificación automática de tarjeta para la ASP para en cambio, solo le voy a dar un nombre. El nombre aquí es identificación del coche. Ahora, ¿cuál es la relevancia del nombre? ¿ Cuándo tenemos un formulario? ¿ Algún formulario? Recuerda que cuando hicimos la página HTML básica, hablamos duplicó el nombre y por el nombre, viste las cosas pasando por la URL. Es el mismo principio excepto ASP dash four se encarga de nombre e identificación para o.Así que notarás que nuestras etiquetas de entrada aquí, no teníamos que ver rodilla sería suficiente para verla ID todo lo que tenemos que ver como entradas y establecer la clase y el tablero ASP para hueso hizo herramienta, el nombre de la propiedad para el nombre del modelo sería el reemplazo para ASP dash four. Así que realmente y verdaderamente lo que se imprime es id es igual a Nombre del punto del coche, nombre es igual a Nombre del punto del coche. Podemos dar manualmente nuestra propia etiqueta, su propio nombre, que correspondería con el mismo ID de ruta que teníamos o el mismo parámetro de ruta que el método post en realidad está esperando ver el ID del coche aquí. Ideas de autos y también te voy a dar el id, identificación del coche para que podamos acceder a ella a través del jQuery. Entonces esa es nuestra forma. Ni siquiera necesita un botón de enviar porque tenemos el botón aquí. Nosotros sí, sin embargo, necesitamos saber el ID del botón que se está haciendo clic. Así que sólo voy a agregar otro atributo de datos. Una vez más, solo estamos explorando todos los compromisos y todas las cosas bonitas que podemos poner en. Hay un atributo que podemos poner en el botón llamado data dash ID. Y luego podemos darle el mismo valor de artículo, dot ID. Conoce que los enlaces tienen sus identificaciones y cada botón que se va a duplicar como botón de enviar tendrá su propio ID. No, tenemos que mirar para un clic de botón en lugar de una camarilla de formulario. Para eso, puedo decir fácilmente, darle a esto una clase personalizada, eliminar btn. Por lo que cada botón de borrar será identificado como delete btn dentro de mi jQuery. En lugar de mirar para un envío completo del formulario, puedo saber decir Dot Delete btn. Así que ten cuidado con un evento click en cualquier elemento que tenga la clase delete btn. Entonces ya ves cómo eso va a venir a todos juntos. Siempre que se haga clic en eso, no hay defecto. No tengo que evitar impagos, así que sólo voy a eliminar eso. Mostrarte una vez más contexto. ¿ Por qué escribimos el código sobre las diferentes circunstancias? Por lo que no hay forma para que presente. No tengo que evitar el comportamiento predeterminado de un delete btn click. No obstante, lo que sí necesito hacer es rápido, lo que todavía va a suceder. Entonces si confirman, lo que voy a hacer es y tengo que darle una identificación a este para que pueda identificarlo. Por lo que en cualquier momento necesitamos identificar un elemento en JavaScript o jQuery, podemos usar la clase o podemos usar el ID. Por lo que esto es borrar formulario. Voy a ver uno que el valor que debe obtener la entrada debe venir del ID de datos del botón en el que se hizo clic. Así que déjame simplemente hacer todo esto paso a paso. En primer lugar, vamos a conseguir los botones. Por lo que puedo decir var btn es igual a signo de dólar. Esto. Este soy yo diciendo que este es el elemento. Se trata de un objeto que representa los elementos que activaron el evento. Ese es el paso número uno, herramienta. Var id es igual a y luego puedo obtener el ID de los datos btn dot. La razón por la que utilicé los identificadores de guión de datos que de hecho consultan se puede enlazar fácilmente a ese elemento de datos y obtener esa clave. Obtener el valor basado en la clave. Estoy viendo datos btn dot, y luego consígueme el valor que se está almacenando con el ID de clave. Y ahora tenemos el DNI o identificación del coche que corresponde con un botón en el que se hizo clic. Saber después de tener todo eso, fui a establecer el valor de los elementos ocultos. Entonces dólar firma comillas, hashtag y su auto ID dot val. Y entonces solo te voy a dar el DNI. Conocer el valor de este oculto se establecerá cualquier ID que estuviera en el botón eliminar. Entonces después de hacer todo eso, ahora puedo ver el hashtag de signo de dólar, borrar formulario. Usas el hashtag para ID al igual que con css, dot full class hashtag o libra o el número que dice para ID. Por lo que voy a ir por el formulario de eliminación por ID hasta que siga adelante y presente. Adelante y lleva a cabo tu comportamiento predeterminado después de haber configurado tus datos para ti. Así que declaremos esta, esta versión de la misma para un giro. Podemos hacer click, Eliminar, obtenemos nuestro aviso, hacemos clic en Aceptar, y mira eso. Está funcionando, ¿verdad? Entonces todo lo que hicimos fue en segundo plano. Una vez más, creamos una etiqueta de formulario. Por lo que incluso si inspecciona elemento, se nota que en la parte inferior de la tabla. Entonces tenemos cuerpo y déjame entrar al div, eso es un contenedor. Y luego tenemos la mesa y luego tenemos nuestro formulario C. No es diferenciar en la página. No parece que estuviéramos en conspicuo cuando se adjuntaba a cada botón, pero no, es sólo una forma en la página, por lo que no hay confusión en cuanto a qué forma se está haciendo clic, que botón que para mí está tratando de ser presentado. Ya no hay confusión. Sólo hay una forma. Y luego si miras cada botón, verías que el ID de guión de datos tiene el ID correspondiente con todos los demás enlaces. Entonces esto es ID cinco. Cuando se hace clic, obtenemos el botón en el que se hizo clic. Obtenemos el id Entonces lo ponemos al elemento oculto. Después seguimos adelante y nos sometemos. Y luego el formulario sabe que debe ir al manejador Delete con un método de posts y está pasando por encima ese valor oculto llamado Car ID. Una vez que todo eso esté en su lugar, se golpeará el on post delete con el ID de ruta a esperar. Y lo que sabemos se supone que debe hacer todo eso, todas esas mejoras cada vez que estamos poniendo en bibliotecas de terceros y quiere usarlas, ya sabes, tenemos que tomar ese tipo de diseño decisiones a medida que avanzamos porque se puede pensar que va a funcionar o puede funcionar en una situación particular. Pero luego cuando añades otro código y bibliotecas, es posible que tengas que agregar algo más de diversión. Simplemente modifique su refactorización de código a medida que avanza. Entonces eso es todo por esta actividad. Nos vemos en la siguiente lección. 15. Agrega cambios a GitHub: Muy bien chicos, bienvenidos de nuevo. Esta lección va a ser corta. Todo lo que vamos a estar haciendo en éste es revisar los cambios de orden. Entonces empezamos a usar GitHub algún tiempo saber. Y lo que hicimos fue comprobar en nuestra inicial, cuando llegamos a cierto hito, comprobamos todos nuestros cambios. Queríamos volver a hacer eso. Las garrapatas rojas indican archivos que están pendientes, cambios o ediciones. El plusses verdes representa los que se han cambiado y los candados azules básicamente representan los que no han cambiado. Todo lo que tenemos que hacer es ir a conseguir cambios. Una vez más, si no ves dónde está en mi pantalla, siempre puedes ir a Ver y hacer clic en Obtener cambios. Entonces ese paquete te mostrará cada archivo que se ha agregado solo para bibliotecas de terceros que agregamos están todo ahí. Y nuestro archivo de migración y o archivos de entidad. Así que sólo voy a dar un mensaje rápido. Si bien el mensaje no necesita ser un ensayo, por lo general me gusta ser lo más descriptivo posible en mi mensaje para que cualquiera que lo lea consiga la gist de lo que estoy haciendo en esta versión, commit. Después de hacer eso, sólo puedo decir comprometerme todo y hundirse. Una vez que ese gameto se haya completado con éxito, verás ese mensaje. Y luego cuando volvamos al Explorador de soluciones, todo tendría candados azules. Cuando volvamos, empezaremos a extender un poco más nuestra aplicación. 16. Gestionar cambios de base con Entity: En esta lección, vamos a estar configurando nuestras otras entidades para esta aplicación. Entonces en este momento lo que tenemos es auto, que es esencial. Tanto todo lo que tenemos para coche sería el año y el nombre del auto. Sabes si has estado alrededor de autos el tiempo suficiente, sabes que no es sólo un nombre tarjetas tienen una combinación de un manso y un modelo, ¿verdad? Por lo que el manso sería la marca del auto como Nissan o Lamborghini. Y el modelo sería modelado de esa marca, ¿estamos lidiando? Lo que queremos hacer es hacer algunos cambios en la base de datos aquí. Y lo que tenemos que sacrificar es nombre y dividirlo en make y model. En este punto, querías hacer algunas consideraciones de diseño porque es bastante fácil de ver. De acuerdo, quería cambiarme esto y simplemente duplicaremos eso y conoceremos a ese modelo. Y será bastante fácil tener solo cuerda. Pero entonces considera esto, cuando alguien está entrando un auto en tu sistema, ¿necesariamente quieres que estén escribiendo en la leche y escribiendo en el modelo? ¿ Y si tienes dos del mismo tipo de vehículos de la Meca y modelo? ¿ Qué quieres que estén escribiendo en la palabra Suzuki cada vez? Porque entonces tal vez el voto de permiso o el error, uno de los SAT lo anota o viceversa. El punto es que En ese punto se quiere limitar la posibilidad de error humano al tomar datos a través de nuestra interfaz de usuario. Si bien esta no es una decisión de la interfaz de usuario, lo que hacemos aquí influirá en cómo diseñamos o interfaz de usuario. Por lo general hablando, en una forma cuando hay datos que necesitan repetir, usaría una lista desplegable, lo que significa que tendría una lista desplegable con todas las opciones potenciales. No lo dejarías hasta el usuario habitual para poder simplemente decir, oh, aquí está el valor y simplemente escribirlo manualmente. Para mí puedo modelar, me siento más cómoda o al menos por MEK, que serían las marcas porque eso es más ácido que el modelo porque diferentes marcas de diferentes modelos y combinaciones 0 para que puedan teclear en el modelo, pero para el mic, personalmente, unas cuantas más cómodas dándoles una lista de las marcas potenciales. Si no está en la lista, podemos agregarlo a la lista, pero es mejor que tengan esa lista. Y pueden escribir en el modelo relativo a lo que eligieron de la lista. Eso nos va a obligar a hacer algunos cambios clave en la base de datos. Porque si necesito una lista de mic, no puedo estar viendo cadena cumplir. Ahora de lo que vamos a empezar a hablar de lo que llamamos claves extranjeras y claves primarias. Por lo que ya sabemos que ambos son clave primaria. Muy bien, pero ahora necesitamos otra mesa y necesitamos una llave foránea para esa mesa que presenta en coche. Entonces vamos a crear esta nueva mesa. Entonces las migraciones, lo siento, nada de migraciones en el proyecto de datos más bien, fui a agregar una nueva clase, y voy a llamar a esta clase me el micrófono. Recuerda que estas, estas gafas son solo modelos para lo que se programará una mesa con tener cola en las propiedades para lo que queríamos almacenar nuestra tensión. Entonces, ¿qué querríamos almacenar tanto a los mansos? En primer lugar, siempre tenemos nuestra id int pública. entonces tendríamos el nombre prop, top tub, nombres de cadena. Nombre aquí solo significa nombre como en el valor de cadena que va para la media en la tabla llamada mic. Hacer el número uno podría ser Nissan, hacer el número dos podría ser Toyota, etcétera Así que eso es realmente lo que el nombre aquí representa. Si quisieras ir y decir Hágame personalmente, no sigo esa convención de nomenclatura. Algunas personas lo hacen. No lo hago porque ya esté en la tabla llamada mic, así que no necesito verme nombre obviamente, nombre sería el nombre de cualquier valor que esté poniendo en esa tabla ¿verdad? Ahora tenemos la mesa principal, está bien. Tengo que dejar que los contextos de base sepan que hay una nueva tabla en tono. Acabo de ir a esa línea Control D solo para duplicar las partes duras. Pero fui a llamar a esta mezcla. También podría llamar a este auto hace que realmente no importa lo que yo llame la mesa. Pero realmente me gusta ser consistente con el nombre de la entidad y el nombre de la mesa, ya que no lo ves con auto y autos. Pero una vez más, puede que no necesariamente te guste mi convención de nomenclatura y quieres, aunque uno, entonces, no hay problema si quisieras nombrar a este coche mic y auto mix o tienes la entidad llamada Mika, esto llamado auto mixto y eso está bien. Me gusta mantenerlos consistentes porque conduce a menos errores en la línea. Ahora tenemos una nueva mesa. Lo que tengo que hacer es dejar carnal que sea un cuatro o que tenga una clave foránea que hacer. Entity Framework hace las claves extranjeras muy fáciles para nosotros. Lo que voy a hacer está bien, voy a dejar este mensaje de validación para el modelo. Eso está bien. Pero debajo de todo esto, voy a poner otra propiedad, int hacer ID. Estaba señalando que Entity Framework, nos facilita introducir claves foráneas. Porque cuando decimos que queremos un nombre de tabla e ID, automáticamente inferirá que queremos decir que queremos una, una clave foránea. Entonces ese es el paso uno, al menos. Lo hace diciendo int mic ID, sabrá que, vale, tengo una entidad llamada Mek, y sí tiene un ID, por lo que la combinación significa que debe haber una clave foránea. Otra parte a esto sin embargo, es sumar nuestras propiedades de navegación. Por lo que diríamos Make me esta propiedad de navegación básicamente dice que si consigo un auto y quería saber el micrófono del auto, hacer que los nombres estén realmente almacenados en la tabla make. Entonces todo lo que realmente tengo que bajar es ese auto ABA y tiene hacer ID1. No sé cuál es el nombre de ella, solo de la mesa del auto. Muy bien. Entonces, si estás acostumbrado a las bases de datos, sabrías a lo que me refiero cuando miras en la tabla del auto o cuando son claves foráneas, todo lo que estás viendo son los valores de ID pueden causar ID1, luego car off mic ID1. Ya entra en C's make ID. No conocemos los detalles. Entonces al agregar esta propiedad y en términos generales, agregamos como virtual para que pueda ser anulada si es necesario. solo puedas seguir adelante y hacer eso. Pero cuando agregamos esta propiedad de navegación, cuando recupero un auto, puedo decir por favor incluya también todos los detalles de esa tabla adicional o esa tabla relacionada. Entonces puedo traer la propiedad del mic con todos los detalles. Cualesquiera que sean los detalles entraron en mí, tal vez ni siquiera pude poner en algo para ver qué país es el micrófono. Decir si quisiera ser creativo, diría que esta marca es de este país. Y entonces me encontraría con el mismo tipo de tema de calidad de datos aquí si dejo país willy-nilly, porque algo de Estados Unidos de América podría ser escrito como EU por una bursa, USC como otra persona, banda de Estados Unidos en la persona, etcétera Entonces es por eso que cada vez que tengas algo que quieres controlar, querrás ponerlo en su propia mesa y luego hacer una llave foránea referencia a ella. Todavía no me voy a complicar demasiado. Echemos un vistazo a tener dos mesas y estamos introduciendo este concepto de clave extranjera. En este punto, coche sabe que debe tener una clave extraña a la tabla donde la navegación o aseveró la validación de modelos. Por lo que se requiere. También voy a requerir que el DNI está en se ingresa año. Podemos requerir un año si queremos. También podríamos sentar más validación en estas dos jeringa. Mínimo, mínimo para el año. Digamos que no queremos nada menos de 1990 en los sistemas. Cualquier cosa que sea 191990 o antes de 1990 no es aplicable. Y luego máximo Vamos a ponerlo a 2021. Estamos en el año 2021. Así que sólo te estoy mostrando el rango. La validación realmente funciona. Permítanme espacio el mosaico puede ver todo en su propio espacio. Recuerda que todas estas anotaciones, todas estas cosas necesitan falsificar la base de datos para afectar el paso número uno de la base de datos, o después de realizar esos cambios, el siguiente paso sería agregar un migración. Todavía tengo mis comandos de migración desde la última migración o el último conjunto de actividades relacionadas con la base de datos. Sí recordamos una ciudad, un proyecto predeterminado al proyecto de datos. Y puede presionar hacia arriba para obtener los comandos anteriores. Sólo estoy presionando para conseguir la migración add. Sólo voy a cambiar una falta. Por lo que hice mezclar mesa, presiona Enter y mi campo de construcción. ¿ Por qué fallé mi construcción? Bueno, eso es porque eliminé el nombre y se estaba utilizando mucho en otras partes de mi aplicación. Si estás codificando durante esto, esta es una de esas consecuencias de refactorizar en la aplicación Ricci y algo que podrías tener un efecto ondulación lo largo del resto de tu aplicación. Así que mantengamos esto simple. En primer lugar, instituimos el formulario de eliminación y así sucesivamente. Así que realmente no necesito la vista Delete y esto eliminar punto CSS HTML. Entonces lo que voy a hacer es simplemente eliminar esto, eliminar, eliminar combustible. No necesito esa. Bien para el crear. Lo que tendría que hacer es solo al menos temporalmente comentar la zona. Por lo que en cualquier lugar donde se accediera al nombre de la propiedad en cualquiera de sus vistas, solo puede seguir adelante y encontrarla. Estaba siendo utilizado aquí, entrar en totes, entrando en totales aquí. Entonces no, a menos que aparezca en la lista. La actualización también se estaba utilizando aquí en la forma que solo puedes volver a revisar tu lista de errores solo para ver dónde podrías haberte perdido. Y voy a hacer Control Shift y B para hacer un construido solo para que se vuelva a compilar y ver si hay un error ahí y no hay ninguno. Así que intentémoslo con la consola Package Manager de nuevo. En audibilidad exitosa y tenemos nuestra migración. Lo que hay en nuestra migración uno va a cambiar el nombre de la columna de nombre a modelo. Está bien, así que sólo porque cambiamos la propiedad lo va a ver como cambio de nombre en lugar de eliminar. Muy bien, para nuestros asientos de ID Manso agregando la columna, es un int. No es un disponible, y el valor predeterminado es 0. A pesar de que nos hubiéramos sentado tres pulgadas para estar en 19192021. Entonces eso significa incluso entonces, nunca debería conseguir este incendio donde la base de datos tendría que establecer el valor predeterminado en 0 porque el cliente dijo que siempre vamos a hacer la validación. Ya vimos que eso sucedió. Entonces va a crear una tabla llamada mix con dos nuevas columnas, dándole la clave principal. Y luego mira esta parte. Está creando un índice. Un índice en una base de datos es una búsqueda de alta velocidad. Entonces cada vez que esperamos que los autos usando las ideas de make sean claves o estamos usando eso para decir, dame todos los autos con esta identificación única. Al crear este índice en esa columna, lo hará muy rápidamente. También estamos agregando la restricción de clave extranjera. Dice agregar una clave foránea en los autos de mesa, el ID de micrófono de columna donde se mezcla la tabla principal y el principio de las columnas ID. Entonces, en otras palabras, una clave foránea significa que hacer que el ID en el automóvil sea estable nunca puede obtener un valor que no esté disponible en la tabla de mezclas. No puedo estar agregando un auto que no sea de tipo o no en la mesa mixta mixta. Si está en la mesa mixta, me pareció que tienes tres íconos. Añadir un auto con ID TIN. Yo como que me acaba de poner un auto que no está presente. Entonces eso es una especie de protección. Por lo que llamas a esa integridad de datos cuando estás hablando de diseño de bases uno y para mantener esa integridad a través del diseño de tu aplicación. Entonces entre todos estos y validaciones, se mantendrá esa integridad de los datos. Una vez más, el método de domo es básicamente el desmantelamiento. Entonces si tenemos que deshacer la migración, esto es lo que hará para derogar los cambios que habrían hecho. Y después de hacer todo eso, volvamos y actualicemos la base de datos. Entonces esta base de datos de bits de resumen y la consola de Package Manager, ninguna parte ver algunas flechas no son problemas. Entonces leamos a través de estas flechas. Está viendo que no pudo ejecutar el comando Alter donde está agregando la referencia a la tabla de mezcla de claves foráneas. Entonces está en esa mezcla tiene un ID de columna. Y en pocas palabras, sin, lo que pasa es que estas flechas tienden a verse muy complicadas. El texto, si no estás acostumbrado, puede que no salga como muy fácil de usar. Pero la realidad es que si solo prestas atención, escogerás ciertas palabras clave. Aquí mismo. Está diciendo que la altitud fue el conflicto de Stephen por las restricciones clave extranjeras en la columna que estamos entrenados para agregar, que se mezcla con Manso ID más bien. Entonces, ¿cuál es el problema? El problema, pesar de que las áreas que realmente están viendo eso, oye, este es el problema. Si vamos a la base de datos y buscamos en la tabla de autos, recuerda que habíamos entrado algunos autos. Había ingresado autos a nuestra base de datos en o no tienen la idea de micrófono de lo que están ahí. Y el ID de micrófono no puede ser 0 porque una vez más, el ID de micrófono no puede ser un valor que no existe en la tabla de micrófono. Este es uno de esos peligros cuando estás cambiando las bases de datos están haciendo migraciones. Voy a tener que hacer una modificación. Y hay dos formas de hacer una modificación cada vez que estés introduciendo una clave externa en una tabla que ya tiene datos, uno de los peligros es que vas a terminar con este error . Esta es una de esas buenas Aras, yo llamo a esto un buen error del que aprender. Este conflicto se debe a que estoy introduciendo una clave extranjera en una mesa que ya tiene reglas que no necesitaban la clave extranjera. lo que se refiere, esos roles existentes, roles están violando las limitaciones que se le está diciendo a la clave extranjera que debe tener. la columna de clave externa se le dice que no puede ser nula y su valor predeterminado es 001041. Lo siento, es un valor inválido para nuestra clave extranjera. ¿ Por qué? Porque no puedes tener. Una clave primaria coinciden con el valor de clave principal de 0. Entonces Manso ID nunca puede estar en la mesa de make. Nunca pueden ser un valor de 0. Siempre tiene que ser uno o superior. Nunca puede ser 0 al intentar ingresar a IT pro, reactivamente en la base de datos o después que ya hay filas, está tratando de darles el valor predeterminado es 0, lo que está provocando que conflicto del que está hablando. Muy bien, en realidad puedo modificar el archivo de migración aquí. O puedo eliminar la migración, cambiar el modelo, y corregir el error. Por lo que sólo voy a mostrarles qué modificaciones haría a la migración. Y eso sería cambiar lo conocedor de falso a verdadero. Entonces en otras palabras, esto puede entrar, la llave extranjera, puede entrar, pero no necesariamente tiene que tener un modelo. Los autos existentes simplemente no sabrán qué modelo son. Más o menos no habría. Por eso nadie es cierto. Entonces tampoco tengo que sentarme al valor predeterminado porque se puede conocer. Entonces si no hay valor, entonces es no. Si hay un valor, entonces hay un volumen. Esa es la opción a. opción B, sería la opción E. Permítanme antes de continuar. Opción a, me permitiría saber realmente simplemente probar la base de datos de actualización de nuevo. Y luego intentaría una operación de migración nueva y editada, que sería agregar esta columna como anulable. Y esos eliminan cualquier potencial de conflictos. Entonces esa es una de las opciones a la hora tener la migración generada. Eso no necesariamente cumple con los requisitos son que necesita modificar esto, modificar la migración, e intentarlo de nuevo. No, otra opción sería, y probablemente elegiría esta opción porque es una opción más segura en mi libro. Uno, quitar la migración. Así que sólo ve, está bien, olvida que te dije que hicieras esta migración. Para ello, es literalmente eliminar la migración de guiones. Siempre vi este comando antes cuando hicimos la migración de anuncios y decía deshacer esta acción usuario mover migración. Tenemos una migración que es de calidad. Queremos deshacer. Por lo que acabo de ver eliminar migración. En realidad eliminará ese archivo de la carpeta de migración. Después fui a actualizar mi modelo para entonces tener reglas que generarán una amarga migración. La regla que fui a modificar es que fui a hacer que el ID del micrófono sea anulable. Otra cosa que está influyendo en la decisión Entity Framework de hacer esto un int que no es anulable es nuestra notación para decir que se requiere. Esto va a ser un segue perfecto en cómo vamos a tener que separar la validación a nivel de base de datos de la validación a nivel del cliente porque en este punto estoy viendo requerido para el año y zona de estar y Joe K, eso realmente no va a afectar que una base de datos. Pero luego vimos dónde se está reflejando lo racionalizado en la base de datos y el hecho que el modelo no sea anulable se está reflejando en una base de datos. Entonces cuando hice esto anulable en la interfaz de usuario, lo voy a necesitar definitivamente, no voy a subirlos para proceder con la tensión. No obstante, en la base de datos de ellos diciendo que es opcional, esos se están separando en dos mundos diferentes. Las necesidades de UI son diferentes a las necesidades de la base de datos. Solo tienes que tener eso en cuenta. Pero estaremos terminando ese concepto en resumen. Después de eliminar la anotación requerida y hacer el int y int, puedo saber seguir adelante y volver a ejecutar mi migración. Y cuando hago eso, mi migración no está viendo para la columna, es int, pero es en nullable. No hay valor predeterminado. Eso no es problema. Todo lo demás está bien. Entonces cuando seguimos adelante y actualizamos nuestro centro de base de datos, entonces es exitoso. Ya verás una vez más, análisis tiene que entrar en lo que podría estar causando el problema tanto como el error realmente no lo insinuó. Pero esa es una de esas áreas que términos generales, si ves ese error, sí cuida lo que podría ser los riesgos potenciales me están arruinando introduciendo una clave foránea en este punto en el diseño de mi base de datos, porque esta va a ser una actividad en curso. Como ves algo nuevo, vas a tener que editarlo. Bueno, es así de fácil simplemente generar. Una migración estará en la base de datos, pero luego se vuelve más difícil por las reglas y las limitaciones que se ponen alrededor de las diferentes columnas frente a los datos existentes que podrían no han sabido de las reglas en el momento en que se estaba entrando. Eso es nosotros introduciendo esta nueva mesa que asisten a saltar por encima y verás que tenemos la mesa y el auto estable. Si extiendo esto, verás que en las llaves de los autos, tengo la llave foránea que acababa de presentar. Si miras el nombre aquí frente al nombre en mi línea 39, verás que es el mismo nombre. Si los autos de subrayado gay en el marcador se mezclan en el marcador Manso ID, ese es el nombre de la clave foránea. Si miramos hacia arriba mix, veremos también que tiene su clave principal. Entonces no o columnas para autos sería la idea cuál es un modelo de año int clave primaria. Y luego hacer que Idea note que el elemento clave que no puedo al lado de él, lo que significa que es una claves foráneas, claves primarias. Las llaves foráneas se ven así. Hemos agregado con éxito otra tabla a nuestra base de datos. También tuvimos que comprometer y eliminar algunas de las cosas de nuestra interfaz de usuario, la facilitada. Cuando volvamos vamos a tener que actualizar nuestra interfaz de usuario a normalizar el nuevo campo. Campos porque ya no nombramos conocemos nuestro modelo y tenemos mic. Y también estamos salieron a ver cómo vamos a separar las reglas en torno a lo que los usuarios pueden hacer en la interfaz de usuario frente a las reglas que la base de datos está imponiendo. 17. Mejora en forma: parte 1: Muy bien chicos, estamos avanzando muy bien. Cuando estuvimos el año pasado, configuramos la nueva cinta antes de mix también establecerá la asociación de claves foráneas para micrófonos en autos. Conocer las reglas que seguimos podrían haberse extendido para cualquier número de llaves extranjeras porque algunas personas habrían extendido el kit de antídoto. No van a modelos de acero porque no pueden arriesgarse a que la gente escriba la palabra Sony para el mismo Nissan, nissan Sony. Y una persona pone en una, la otra persona pone en dos extremos. Posteriormente veremos ese tipo de tablero de escenarios en este momento queríamos enfocarnos en nuestra interfaz de usuario actualizarnuestra interfaz de usuariocon nuestra introducción de nuestros nuevos campos en las formas de marcas y modelos o Manso ID y modelo. Lo primero o bien, no quiero decir lo primero como si necesitáramos necesariamente seguir este orden. Pero una cosa que definitivamente vamos a necesitar serían las páginas de multitud para la media. Porque podemos escribir no, los autos tienen dependencia de Manso ID. No puedo muy bien poner una lista desplegable para el micrófono en lugar de los autos a menos que exista mezcla. Voy a tener que crear algunas páginas para que podamos gestionar la mezcla. Sólo voy a seguir adelante y golpear agregar una nueva carpeta. Y voy a llamar a esta mezcla. Entonces pasado de lo que en realidad fuimos uno por uno creando todas las páginas de código. Hicimos la página Crear, así que hicimos la página de edición, etcétera Para mí, fui a hacer una operación más al por mayor. Por lo que sólo vamos a hacer clic derecho en esta carpeta, haga clic en Agregar serie de página, y luego usaremos la opción Razor páginas usando Entity Framework y crudo. Muy bien, haz clic en Agregar. Entonces va a decir, está bien, ¿cuál es la clase modal esta vez que estamos lidiando con el mic, ese es el contexto de datos y haga clic en Agregar. Ahora si echas un vistazo a lo que hay en la carpeta, verás que todas las páginas que vimos meticulosamente agregadas una por una cuando estamos lidiando con autos, están todas generadas para nosotros. Tenemos la puja de índice, que es la lista de mix. Tenemos la página de edición, que es el formulario para editar la mezcla, tenemos los detalles. Todos ellos se generaron en un solo barrido. Te llevé a través de ellos uno por uno para que pudieras mirar el código. Ahora que tenemos una mejor comprensión de lo que cada página está haciendo bajo código que se genera está haciendo. Podríamos simplemente hacer las operaciones al por mayor. Puedes hacer eso por tus clases, pero no te adelantes demasiado y empieces a hacerlo por todo lo demás justo todavía, porque hay más cosas que debemos considerar en el diseño, pero no, está bien. Ahora tenemos la capacidad de hacer o ingresar datos en la tabla mixta. Y luego una vez introducimos datos en esa tabla de mezclas y construimos esa lista en la base de datos. Tenemos que poder presentarlos a los usuarios cuando están entrando autos. Una cosa que voy a hacer es agregar este elemento de menú o un elemento desconocido al pitch de diseño para que podamos navegar hasta él. Y luego solo controlaré F5 y simplemente hago una prueba rápida solo para asegurarme de que el código esté funcionando para mí. Saltando al enlace, podemos hacer click en Crear Nuevo. Y luego el primero es Toyota crear. Y vemos creado. Entonces no escribimos ningún código, solo saberlo. Todo lo que hicimos fue simplemente seguir un simple paso de andamios o todas las páginas. Y ahora tenemos todas estas ediciones. Tenemos los detalles. Como ves, regresó con los botones y enlaces estándar y así sucesivamente. Así que siempre pensé la uniformidad de la burbuja. Queríamos asegurarnos de que nuestros botones se vean así para todas nuestras apps para que puedas seguir adelante y darles estilo. Ejercitar músculos de arranque flexibles no. Y empieza a ver bien. Quiero que todo se vea de la misma manera. No hay problema. Por ahora sin embargo. Sólo queremos enfocarnos en la funcionalidad. Así que estamos consiguiendo, déjame ponerme uno más. En este punto, tal vez un administrador sería el que gestione esta lista mixta. Eso está bien. Ahora cuando miramos el crear para auto, recuerda que teníamos que entrar hasta el campo que se pegará en el nombre. Pero no, necesitamos tener un campo para modelo y necesitamos tener un campo que sea una lista desplegable con la lista de mix. Lo que tenemos que hacer es saltar a nuestros autos crea página y voy a descomentar esta sección para el nombre del punto del coche. Ningún disco se puede tallar modelos, modelo de punto de coche. Esa es nuestra nueva aportación para esa sección. Pero también voy a presentar, sólo estoy copiando el grupo de formularios. Una vez más, la uniformidad. Eso es lo que se generó En cada vez que queremos controles. Sólo voy a guardarlo en ese tipo de formato. Incluso si lo estoy escribiendo manualmente, a veces es posible que tenga que hacer eso. Es bueno simplemente seguir esa convención de codificación porque eso es para esa capa que quieres. Para el modelo Kardon o para el siguiente, diría Car dot mq ID. Ahora para el id de micrófono, queremos una lista desplegable. No queremos una toma la caja. Así que recuerda que es informa que tenemos etiqueta llamada select. Esta etiqueta nos permite poner en opciones. La primera opción que voy a decir es select mic. Muy bien, así que ese es el primer aviso. Pero obviamente, no voy a sentarme a escribir en todas las demás opciones, Nissan y Toyota. Porque si lo hago manualmente, eso niega el hecho de que queremos tener esa lista dinámica de la tabla mixta en el select, voy a decir ASP dash four. Por lo que estos son ayudantes de etiqueta donde puedo ver quiero que esta lista desplegable sea para auto make ID. Entonces lo siguiente sería decir, ¿de dónde estoy sacando los artículos? Mis artículos tienen que venir de algunas listas. Entonces voy a verme mezclar. Sólo estoy poniendo eso ahí fuera. Ese no es el nombre de la lista todavía, eso aún no existe. De ahí que la línea roja. En el código detrás necesito enviar o preparar al menos llamado mix, que comprenderá la lista de mí x de la base de datos. Así que al repasar, voy a querer crea nuestros derechos de propiedad en el punto uno. O en realidad prefiero tener mis propiedades por encima de mis métodos. Sólo estoy haciendo este refactorizado rápido. Eso es porque prefiero tenerlo de esa manera. Si no tienes ningún problema, entonces ningún problema no necesariamente tiene que seguir, pero me gusta verlos a todos en un solo lugar. Entonces sí, sabemos que tenemos la propiedad del auto. Pero luego fui a decir lista de selección pública. Entonces ese es un nuevo tipo de datos que estamos viendo. Y estoy llamando a este una mezcla. Hacemos eso Gita y nos sentamos. Entonces después de tener la lista de hendidura en conseguir, recuerda en consigue prepara. Más bien está ahí para que podamos preparar todos los datos necesarios para la página. Por lo que antes de esto, no se necesitaban datos para la página. Solo teníamos que volver a la forma vacía. No, necesito realmente sacar estas cosas de la base de datos, de la mesa mixta, llenarlo, o ponerlo en esta propiedad mixta. Y creo que basado en el nombre aquí, oh, necesito decir modelado mix. Para haber creado mix, puedo decir modelado hace disculpas. Esa es una mezcla model.fit. Y aquí están nuestros apropiadamente llamados micrófonos. Necesito llenar mix con los datos provenientes de la mesa mixta. De lo contrario, no estaríamos más cerca de lograr nada que seamos. No. Por lo que puedo ver mix es igual a, no quiero inicializar una nueva selección para seleccionar lista me permite pasar en una colección de artículos. Y luego al igual que con la etiqueta de selección o la lista desplegable, tengo algo que se muestra y algo que está siendo atrapado o almacenado. Es decir, cuando estamos mostrando el micrófono, el usuario debe estar viendo Toyota, Nissan, Lamborghini, Ferrari. No obstante, si bien necesitamos rastrear y almacenar es el ID real, por eso dijimos que es el ASP para el manso IID, lo que significa lo que selecciono de la lista desplegable, mira su valor y almacena ese valor en el ID de marca. No obstante, estaré mostrando el nombre que está asociado a la media. Para la lista, voy a ver contexto. Contexto. Por favor dame todos los micrófonos y para enumerar esto soy yo diciendo dame toda la mezcla en la base de datos. Entonces solo diré Como. El perdón, sólo voy a asegurarme. Vale, sí, a veces me las meto. Por lo que tenemos el campo de valor de datos y tenemos el campo de texto de datos. Entonces el valor que estamos comprobando es la media, es el ID más bien de la tabla mixta. Y si te olvidaste, solo ve a la mesa mixta para ver cuáles son los nombres de campo. El valor que estamos llevando a cabo es ID. Queremos traer de vuelta el nombre. También notas que tengo estas propiedades adicionales, por lo que eso es en realidad opcional, pero cumple con el mismo propósito que cuando ponemos la propiedad mic en los autos, es decir que un auto va a tener uno manso. No puedes tener un auto al que vas a llamar una mezcla diferente para tener un Nissan o te diré cuáles son algunas cosas. Entonces es uno por eso que en la mesa del auto, tenemos una identificación al auto y una propiedad de navegación. No obstante, Toyota fabrica muchos autos. Entonces si estamos viendo un Toyota récord, podría haber muchos autos que tengan el Toyota ID en ellos, así que por eso tenemos una lista de auto hasta ahora, cualquier registro de micrófono que miremos, en realidad podemos ver todos los autos que se asocian a él están todos relacionados con ella. Mientras estamos aquí, solo puedo silenciar esto virtual. Muy bien, volver a nuestro código donde transportando el ID, pero queremos mostrar el nombre al usuario. Esto solo soy yo viendo en llegar a carga lineal en la página. Por favor, siga adelante y ejecute esa consulta, rellene esa lista y luego envíe de vuelta la página. Una vez que hagamos todo eso, sólo voy a guardar y Control F5 para previsualizar. Y aquí estamos. Sé que se ve un poco desigual, pero podemos arreglarlo. Lo que estamos viendo, el id del micrófono. Entonces esa es nuestra etiqueta. No tecleamos eso. Todo lo que hicimos fue darle la etiqueta y decir déjame saltar por encima. Todo lo que hicimos fue decir una etiqueta para cardamomo identificación única. Bueno, estamos viendo la etiqueta. Si miramos en esta lista desplegable, estamos viendo la opción select mic. También estamos viendo otras cosas que no agregamos como opciones. Por lo que ves que se va a la base de datos y consiguiendo Toyota y Nissan. Una vez más, lo bueno de esto es una vez que se actualiza esta lista, por lo que si digo Ferrari y creo, una vez que refresque la página, se actualizará esa lista y aparece. Muy bien, ese es el poder de esta lista desplegable. Cuando queremos restringir lo que el usuario puede ingresar, solo les damos una lista desplegable y mantenemos esa tabla. De lo contrario, tienen muy poco control sobre lo que pueden poner por ese valor. Quiero decir, estilismo sabio, lo que nos falta es o control de formulario de clase en la clase selecto equivale al control de formulario. Simplemente guardaré eso y refrescaré y permitiré que se compile. Y eso se ve un poco mejor. Y entonces también podemos ver cómo podemos cambiar todas las etiquetas. Pero intentemos crear un auto. En primer lugar, si digo select mic, no pongo en nuestro modelo, no pongo el oído interno. Entonces recuerda, aquí se requiere un modelo. Si traté de crear, solo me dirá, Hey, no puedes ir más lejos hasta que se haga algo. Me está diciendo el mensaje equivocado de validación aquí. Y eso es porque no me actualizé. Esta validación fue muy lejana. Ese es uno de los peligros de copiar y pegar. Sólo asegúrate de cubrir todas las bases. Pero oye, por eso estamos aquí para probar. Si pongo en Toyota, pongo en el modelo Sea Harrier. El año es 2001. Si todo parece válido y creo, entonces vemos nuestra lista volviendo con tres. Añadimos dos antes y supervisamos tres. No, en la lista, no se muestra nada. Y no se muestra nada en esa lista. Ahora vamos a saltar a la lista y ver. Entonces habíamos comentado el nombre y el año. Lo que voy a hacer es simplemente descomentar todo esto en comentario, todo. El nombre va a dar un error porque ya no hay nombre no es modelo. Y mira este nulo cuando quiero ver qué tipo de tarjeta del año. Entonces es un Toyota Harrier 2001. ¿ Qué tengo, verdad? No. Sólo tengo el año que es 2001, mic en Meek ID, que es el campo en la base de datos. Pero obviamente no puedo estar mostrando que los usuarios hacen TI. Así que solo voy a mostrar lo que verían los usuarios si dijera Manso ID, porque los valores de ID son realmente para uso interno, realmente no son para una visibilidad de usuario. Cuando refresco y veo esto, no, los dos primeros no tienen ID de micrófono y eso está bien. Entendemos por qué porque existían antes de que lo estalláramos en el micrófono. No obstante, sólo estoy viendo uno. ¿Qué es uno? ¿ Qué es uno más alto? Eso no significa nada para el usuario. Por lo que ya establecimos que las claves primarias son útiles para navegar. Entonces en todo qué registro estamos mirando y a qué registro estamos apuntando. En esta situación, esto se muestra, esto no significa nada para el usuario. Por eso tenemos la propiedad de navegación que estaba describiendo. Cuando creamos auto, nos aseguramos de poner en esa propiedad de navegación porque no, puedo ver dame el mic que está asociado a este auto y puedo obtener los detalles de ese mic en la forma de su nombre. Para que pueda saber apenas cumplir ese cambio rápido en mi punto de vista. Y probablemente lo voy a ejecutar a otro error, pero déjame cumplir con ese cambio, refrescar y eso está en blanco. Muy bien, veamos por qué eso es negro. Está en blanco porque al preparar los datos, estoy diciendo que me den todos los autos. Necesito decirle a la consulta que cuando me consigas los autos, también quiero incluir los detalles fuera del micrófono. Conseguir los autos, sí. Y consiguió la identificación mansa, pero no consiguió los detalles de la media. Sólo te estoy mostrando cómo todo está interconectado. Entonces por eso sigo mostrándote lo que no funciona en cómo lo arreglamos. Entonces para obtener los detalles del mic, tengo que ver autos dot incluir. Entonces le voy a dar una expresión lambda donde pasaron por lo que parecían las expresiones lambda. Estoy viendo incluir manso. Entonces en cualquier momento tienes una clave foránea en una mesa y tienes esa propiedad de navegación y quieres ejecutar una consulta donde llegues a todos los detalles de la tabla de claves foráneas también como la mesa principal. Eso es todo lo que tienes que hacer. Base de datos Consígueme los autos, incluya los detalles para los mansos relacionados y luego dame todo como al menos después de hacer ese cambio. Si vuelvo a refrescar, entonces vemos toyota. Ya ves cómo todo acaba de juntarse en este. Una vez más, permítanme solo revisar. Incluí los detalles del mic en la consulta. En autos se acercó. Fue fácil para mí ver, dame el auto, tráeme el manso, y consígueme el nombre. Ahora en caso de que no te expliqué antes lo que estas áreas subscripts están aquí arriba frente a que no se hagan aquí, solo queremos el nombre para mostrar. Por lo que en realidad podría simplemente quitar esto y poner en su propio nombre para mostrar si lo desea, eso estaría bien. Nombre aquí, el nombre realmente no significa nada. Ok. Sí, habíamos nombrado inicialmente pero teníamos nombre Voy a rutear o el de Suzuki en deporte. Ningún nombre sólo va a estar almacenando Toyota porque el modelo está ahí para ver un más alto. Entonces esto realmente debería decir algo más como yo. Si quieres cambiar lo que se está mostrando, puedes quitar fácilmente ese código y ponerlo en tu cuenta. Ya miramos las mesas. Sabemos lo que podemos poner en nuestro propio texto para el encabezado de la tabla. Con ese simple cambio, cuando regeneramos la tabla o la página, vemos no imprimiendo manso. Muy bien, entonces ya ves cómo se está uniendo todo. Entonces la cosa es, básicamente tenemos que repetir ese feed para cualquier lugar que esté tirando de datos y se espera que muestre algo. Entonces sí, lo tenemos en la lista, pero vamos a pasar por esto se llama prueba de regresión. Ahora, en cualquier momento que hagas un cambio en tu sistema, siempre quisiste asegurarse de que lo que haya obtenido y trabajado acería. Vemos que tenemos funcionando la lista. Vemos que tenemos que crear trabajo. Si miro edición y detalles, voy a ver que, vale, Update aún necesita algún trabajo al respecto. Y los detalles necesitan algún trabajo al respecto. Así que vamos a cambiar los viejos. Así que empecemos con las actualizaciones porque ya sabemos que la actualización se parece al Create. Solo necesito tomar los mismos campos que tengo en el creado para la lista de selección y el modelo y ponerlo encima en la actualización, poco sobre ella que comentó código y pega. Pero no es sólo eso. Todavía tenemos que cargar esta lista desplegable porque las semillas que la completan no sabe qué es la mezcla. Al igual que lo que hicimos con el crear donde teníamos esa propiedad llamada mic. Alguien se va a dar esa propiedad llamada mix otra vez. Entonces voy a tener que llenar eso hace propiedad con datos. Así que al igual que lo que hicimos eso es en el on llegar aquí para la actualización. Voy a tener que contarlo en conseguir sí, aquí se mete en el récord del auto para ser abatido. Pero entonces sólo voy a seguir adelante y poner en esa mezcla. Entonces si obtienes el registro del auto y no está devolviendo la dinámica telefónica NADH, la siguiente base de datos llamó para obtener la mezcla, entonces podemos devolver la página después de hacer esos cambios a la página de actualización. Si refresco, entonces voy a ver que tenemos esto sucediendo. Observe que es por defecto seleccionar mic. Si vuelvo a List y elijo uno que tenga un mic, automáticamente se atarán y me mostrarán la leche que se seleccionó previamente. Es vinculante. Es, es un poco inteligente. Pero debido a que los otros no me tenían, se consigue no mostrarme nada, disculpe, el predeterminado una vez que un valor se reúna una vez a la semana idea te presentaba al bind automáticamente en la edición para los detalles. Bueno, antes de llegar a los detalles, asegurémonos de que esto aún funcione. Fui a ver esto es una herramienta de 2 mil igual de simple cambio, guardar, y vemos que se está reflejando, por lo que el editor sigue trabajando. Eso es bueno. Necesitamos actualizar los detalles saber para hacerle saber lo que se espera de ella pueda descomentar que el enfermo SHA-1 fue en primer lugar, lo duplicé, luego puedo descomentar. Esto no es nombre, ya no nombre solo sino nombre de punto y esto no es modelo. Ningún detalle mostrará el oído, el nombre del micrófono fuera del micrófono y el modelo. Para nuestra consulta. Tenemos que avisarle cuando primero consigas autos. Tercer defecto. Una vez más, por favor incluya los detalles del micrófono. Entonces incluimos la expresión lambda y el mic en get, obtenemos el auto con los detalles. Y entonces podemos ver todo. Si veo los detalles del Toyota superior nom, ver todo volviendo. Una vez más, vemos ese nombre justo ahí mismo en su lugar. El asunto es que no, fui a fui a una especie de retener en cambiar la propiedad aquí porque lo hicimos por el índice donde lo cambio manualmente. Pero entonces podríamos querer hacer por los detalles, pero entonces si lo cambiamos dinero, alguna vez fueron y entonces el cliente o quien sea que estemos construyendo el software para una viene y dice, yo don no como esa etiqueta, cambia esa etiqueta, entonces eso es tantos lugares como vamos a tener que cumplir con el cambio. La forma más rápida de cumplir con ese tipo de modificación será utilizar anotaciones. Aquí puedo ver la clase MEC que su pantalla. Display. Después de incluir bibliotecas faltantes controlar datos e ingresar. Entonces el nombre es el parámetro. Entonces tu nombre para mostrar es solo cambiando que aquí están sentados que aquí arriba de esa propiedad. En cualquier lugar ese nombre para mostrar para ello es ya está actualizado. En cualquier lugar ese nombre para mostrar para beta de código está siendo utilizado como si estuviera siendo utilizado en el índice. Antes de cambiarlo a nombre para mostrar semilla para eso automáticamente va a buscar cualquier anotación de datos por encima de esa propiedad que vea mostrar y luego usar ese texto. Eso en realidad me arrojaría el dolor de necesitar cambiar ese dinero mientras ellos en todas partes, puedo volver a mostrar nombre para el índice. Puedo guardarlo en los detalles porque ahí está nombre para mostrar. Entonces en todas partes a las que se está haciendo referencia, utilizará automáticamente ese gusto. Muy bien. Sólo te estoy mostrando unas buenas maneras más limpias en lugar de volver a escribir en seco. No te repitas. Ese es uno de los principios fundamentales del desarrollo sólido. Así que lo menos posible debería estar reescribiendo código siempre buscar una solución que tenga un alcance más global, a diferencia de una que requiere que sigas haciendo lo mismo una y otra vez. Ahora, intentemos crear algo más modelo. Vamos a llamarlo Tesla, año 2221 crear. Muy bien, por lo que ves que esto no es válido para mí ID. Entonces este es uno de esos errores predeterminados porque no le pusimos ningún mensaje de error, pero solo nos está volviendo a búfer y viendo que no es válido para Manso ID, por lo que la validación es casi automática en ese punto. De la misma manera, si tengo una fecha inválida, año que no sea que veas el oído de campo debe estar entre ese mensaje. Ese mensaje se acerca porque ponemos en el rango para el detalle. Estas son formas en las que puede mejorar la interfaz de usuario y hacer cumplir ciertas reglas para que sus usuarios preserven su integridad de datos. 18. Mejora en forma: parte 2: Muy bien chicos. Lo que queremos hacer es seguir construyendo sobre cómo mejoramos los foros y las dos cosas que tenemos que hacer para asegurarnos de que brindemos la mejor experiencia a nuestros usuarios. Saber cuando se trata de los pasos de validación, vistas notarían que nuestro es válido no se golpea cuando tratamos de enviar los datos no válidos. Y eso es realmente porque tenemos aquí los scripts de validación, asegurándonos de que solo los datos válidos vayan más allá de lo dicho el cliente y eso es bueno. Pero entonces en caso de que existan ciertas circunstancias en las que pueda pensar que es válido por este lado, pero luego necesitamos validación en el lado del servidor. Entonces esta es la validación del lado del cliente. Me has oído hablar del conjunto de los clientes. Creo que la validación del lado del cliente ocurre en el front-end, ¿verdad? Entonces entre JavaScript y HTML, estamos haciendo saber a los usuarios qué es válido, qué no. Si uso un desactiva JavaScript, pueden eludir fácilmente ese mecanismo. Además, podría haber momentos ciertas reglas de validación tengan que ser evaluadas en el lado del servidor. Entonces si tienes una lógica compleja, como tal vez tengas otra validación para asegurarte que el modelo coincida con el micrófono del coche o algo así. Sea lo que sea, es complejo. Realmente no puede ser retrato en nuestra ESR ni se requiere, o es entre estos valores. En realidad no es un booleano o algo que sea rápido. Y entonces tendríamos que construir algunas reglas de validación más complejas en el lado del servidor o en el código para asegurarnos de que sea válida. Lo que quiero retratar en este momento es lo que sucede cuando tal vez es que la validación del lado del cliente no se está ejecutando. Para hacer un experimento rápido con eso, solo voy a comentar los scripts de validación parciales. Entonces una forma rápida de comentar, pon el cursor en el control de línea. Casey comentará y la clave de control que descomentar. Apretando Control. Pulsas la tecla, luego presionas C, y luego entrará. Y luego haces lo mismo con clave y tú, y se descomenta. Estoy deshabilitando este script que se está ejecutando en el lado del cliente. Y voy a poner aquí el punto de ruptura para que podamos ver qué pasa cuando se invita algo en el foro. Sólo voy a hacer clic en Crear y mirar lo que pasa. Se salta justo al puesto. Entonces no hay mensaje de validación. Recuerda la última vez que siempre solo imprimiríamos todo el mensaje de validación fuera del botón. No, no se está llevando a cabo ninguna validación del lado del cliente. Entonces nuestro a prueba de fallas es este estado modelo, el estado modelo DOT es válido, es válido, la retina es falsa. Si miramos en los estados modelo, sólo para que podamos entender exactamente lo que está pasando aquí. Lucy, estado de validación en válido, cuántos hay, entonces tienes las claves y resultados. Entonces vamos a los resultados. Los resultados nos mostrarían las claves y los conjuntos de validación de cada clave. Entonces la clave aquí sería cada valor que está en el modelo que se está validando o módulo de coche. Y la validación diría que se requiere el año, se requiere modelo, hacer ID aunque todos esos son requeridos. No. Ninguno de ellos fue proporcionado. Todos ellos son inválidos. Y luego si quieres perforar hacia abajo en ella, ves la clave, ves el valor, y luego te dará algunos otros detalles. Intento de valor fue que hay muchas cosas que no puedes sacar de este modelo estados. Entonces aquí está ese error exacto. Está diciendo que se invita al valor que es una cadena vacía. Ese es el erudito que vas a llegar ahí, presiona F5 ilimitado, continúa. Esto es lo que impide el viejo. Entonces estamos obteniendo ese resumen de validación y estamos recibiendo cada error debajo de cada campo. Entonces si pongo en algo que está fuera del reingreso, sí dije que el rango es de 1999 a 2020. Entonces si pongo 1990 e intento de nuevo, entonces sigue siendo inválido. Presiono de nuevo a F5. No, nos va a mostrar un oh diferente, lo siento. Debí haber dicho 1900. Eso habría sido invitado. Déjame intentarlo de nuevo. Entonces crea calor, el punto de ruptura, continuar, y ahí vamos. Por lo que el oído de campo debe ser entre 19902021. Entonces estamos viendo toda la validación donde estamos familiarizados con este Randolph. Eso es qué? validación del lado del servidor restablece la tabla si alguien inhabilita su JavaScript en su navegador, o por cualquier motivo el área con un bypass el JavaScript porque todo con HTML y y CSS está disponible para sus usuarios. Entonces esto se trata de nodo de codificación segura porque todo lo que tengo que hacer es inspeccionar elemento. Puedo ver todo por encima del código. Podría modificar esto ciertas cosas. Podría optar por desactivar este script en esta página, cosas así. Eso es agujero, el agujero importante o paso de validación del lado del servidor es asegurar que no lo hagamos, no devolvemos ninguna basura a nuestro sistema. Ahora otro gran tema que son un gran tema que definitivamente tenemos que abordar es el hecho de que solo iba a empezar de nuevo. Vamos a crear nuevo. Tenemos nuestra lista de los mics no son divertidos. Fui a decir modelo Toyota, modelo de auto, lo que sea. Hago click en Crear, invierno, elimino este punto bruto porque sabemos que va a ser inválido porque no había modelo, ni valor para el año proporcionado. Pero, ¿qué pasó con los mansos? Mira eso, esa lista ha desaparecido. Lo que sucede es que cuando estamos tratando con lista de selección y ciertos tipos de listas en el post, siempre hay que asegurarse de que si vas a terminar devolviendo la página, es necesario volver la página con todos esos datos adicionales. Porque en este momento el único dato que es bueno para persistir es cualquier cosa que tenga la propiedad bind por encima de ella. Incluso si veo la propiedad de Ben por encima de la lista de selecciones aquí, la realidad es que no hay campos en mi formulario para almacenar toda la lista. Tengo un campo para almacenar el ID que fue seleccionado de la lista, pero no toda la lista. Esta lista tiene que actualizarse cada vez que se carga esta página. Sólo para decir que no podemos ir a conseguir la lista de la base de datos y por periodo. Por lo que podría cargarse cuando soy inválido o el pH, el envío es un en estado inválido y el pH tiene que ser devuelto. El pH va a tener que ser devuelto sin mezcla en él. Entonces fui a dar un ejemplo de lo que quiero decir aquí. Sólo voy a poner algún código aquí que sólo va a decir var mix. Después de enviar es igual a mezclar. Vamos a ver lo que hay en mix antes de Enviar. Y luego vamos a ver lo que pasa a mezclar después de una presentación. Entonces con las últimas versiones de Visual Studio anteriores en modo de debug, realidad puedes simplemente hacer clic, Aplicar cambios de código. Entonces vuelve a tu código. Simplemente refrescaré la página. Muy bien, vamos a pasar por esto otra vez. Voy a intentar crear y voy a mandar algo que no es válido. Voy a volver a poner mis puntos de ruptura para que se detenga para que podamos ver qué valor viene aquí. También voy a poner un punto de descanso aquí antes de que devuelva un melocotón. Así que cuando vea, está bien, déjame refrescar. Permítanme volver a hacer esto, lo siento. Así que crea mediodía. Entonces cuando sí creo nuevo, golpea este punto de ruptura para la página. Entonces si miro en mix, estoy viendo que mix es que tiene datos. Todavía tiene eso sugiere que tiene datos. Tiene los ítems que entrarán en la lista desplegable. Muy bien, eso se ve bien. Sólo voy a quitar ese punto de ruptura. Envía algo que no sea válido. Cuando el punto de ruptura fue que la declaración if, no lo golpeó. Así que sólo lo estoy moviendo hasta la línea 34 para mí o los primeros escritos del método. Voy a entrar en esto y luego vamos a buscar mix, mix es nulo solo para conducir mi herramienta de punto y que una vez que se envíen los datos, tu selecciona esto y básicamente cualquier cosa que sea al menos que no sea ser deshuesado o que no se puede deshuesar va a estar vacío. Una vez que envíes. Lo que tenemos que hacer es actualizar esa lista. Sólo voy a parar. Y vamos a hacer ese bit de código para asegurarnos de que la página siempre esté provista de su lista de selección. O en un caso en el que tengas múltiples desplegables, este es el mismo concepto. Esto asegura que todos ellos estén poblados con los datos cuando el pH se carga en absoluto. Así que en realidad podría simplemente tomar este bit de código y colocarlo aquí. Si el estado del modelo no es válido, vuelva a cargar la lista de mezcla y luego volver a la página. De lo contrario, basta con seguir adelante para que no desperdicie la llamada a la base de datos. Si el estado modelo es válido, entonces no hará nada de eso. Simplemente saltó a esto y procederá. Saber lo que no me gusta hacer es repetir código como este. ¿ Por qué parece simple y simplemente basta es un archivo de clase pequeño y en realidad es solo una línea. Pero entonces, ¿qué cambia algo? Recuerda, dije que cuanto más repitas en medio de código alrededor de la aplicación, más difícil será tu mantenimiento cuando algo cambie. Lo que tiendo a hacer es tener un método privado. Así que voy a decir tarea privada. Sólo diremos tarea privada. Y lo haré una tarea asíncrona. Aquí. Llámala poblar, listas desplegables. Es uno que simplemente lo llamaría poblar listas desplegables. Y luego dentro de eso, hago esa llamada al método. Entonces esto sabría b. Y puedo conocer a este asíncrono asociados al menos un fregadero que me necesita para incluir esa biblioteca. Y entonces puedo cumplir con este trigo. Muy bien, entonces es un método asíncrono. Quería hacer uso de los métodos asíncronos. Lo que sí sé es simplemente llamar a este método en todas partes que necesito hacer esa población. Si tengo múltiples listas desplegables, necesito poblar. Acabo de hacer solo los pongo aquí una vez que lo llamo a eso. Y entonces puede hacer eso porque hay otras situaciones en las que podría necesitar datos que no están siendo atrapados en la página. posible que sea necesario que esté presente en el pH si se invita al estado del modelo. Para que puedas, por qué estoy llamando populate desplegable esto, también podrías llamarlo como Señor, datos iniciales. Entonces cualquier consulta, cualquier operación que necesites realizar antes de que la página sea visible, pones todo ese código aquí para que no tengamos que repetirlo en tus manejadores. Si tienes más de 100, solo 100 realmente no importa. No tienes que repetirlo. No, tengo que esperarlo cuando esté haciendo la llamada porque es asíncrona. Pero luego arriba arriba, éste me está dando una flecha, y eso me está dando un error porque este método no es asíncrono. Entonces vamos a convertir este a asíncrono. Tarea asíncrona. Y se espera que esta tarea devuelva algo del tipo i resultado de acción. Y una vez que he hecho todo eso, todas las líneas rojas brillantes y todos están felices. Sólo te estoy mostrando unas pequeñas trampas o cosas que tener cuando estás escribiendo tus aplicaciones. 19. Mejora los formas y validaciones, parte 1: Muy bien, entonces estamos construyendo esta aplicación y mostramos a nuestros grupos de interés porque al final del día, la mayor parte de lo que vas a estar construyendo, vas a tener que hacer una demostración a alguien. Mientras lo pruebas, mientras lo desarrollas, lo pruebas. Um, o estás guiado por sus expectativas en forma de requisitos de software, o te estás guiando por lo que crees que necesitan, cual puede ser peligroso. Porque en esta situación sin ningún requisito formal dado, nos han dado alguna retroalimentación y nos han dicho que definitivamente habrá que cambiar ciertas cosas. No, número uno, están diciendo que necesitan más información sobre los autos para ser almacenados. Conoce el año, el micrófono, el modelo. Eso no es suficiente información. Necesitan que digamos de qué color es el auto y que proporcionemos un número dividido de licencia, que creo que son puntos de sellador. Otro tema que han señalado es que pueden ocurrir errores ortográficos porque dejamos el modelo como campo de texto libre. Si bien la música es una lista desplegable, el modelo no lo es. Y discutimos el peligro de eso antes. Entonces por el mismo resultado que hicimos, hacer una lista desplegable. Vamos a tener que hacer lista desplegable de modelador. Eso viene con sus propios retos también porque modelo, no podemos poner un modelo al azar. Entonces por ejemplo, un Nissan, nissan, Sony con ojo. Esos son errores ortográficos. No obstante, nada impide a alguien escribir en Ferrari Sunni. Y si sabes algo de Ferrari, sabes que no tienen un modelo llamado sunita. Por lo que también dijeron que al seleccionar un micrófono, querían asegurarse de que el modelo que son capaces seleccionar después realmente se aplica a ese Manso. Esos son algunos requisitos que han llegado a nuestro camino. Ya hemos hecho cosas que rodean algunos de estos cambios. Y veamos exactamente cómo funcionará esto. Entonces el primer cambio que voy a hacer es a la entidad automovilística. Recuerda que habíamos introducido mic, necesitamos introducir más campos y no lo estamos, ya estamos familiarizados con lo que tenemos que hacer para introducir nuevos campos. El primer campo, solo estoy usando Control D para duplicar así que no tengo que teclear todo desde cero. El primer campo sería cadena. Esto sería de color. El color también es otro tema sensible. Porque alguien puede escribir azul, alguien puede escribir B0, alguien contrarrestar el negro y olvidar la c. Así que ese es otro tema sensible. ¿ Queremos dejar el color del vehículo como texto libre? ¿ O queremos encerrarlo y tenerlo en la lista? Se trata de decisiones que tenemos que tomar para asegurar que nuestro sistema sea debido derecho por parte de los usuarios. Personalmente. Prefiero tener colores en una lista porque entonces las posibilidades de que los usuarios ingresen colores incorrectos son colores que ni siquiera existen se disminuye en gran medida. Del mismo modo que tenemos el identificador de llamadas. Esto va a ser una clave foránea. Entonces déjame, déjame retroceder un poco y voy a introducir los nuevos campos en el orden. Muy bien, así que debajo de mí, fui a salvar a public int y no estoy haciendo ningún nivel. Entonces recuerda por qué tuvimos que poner esto a disposición. Estamos introduciendo una clave foránea después del hecho, después de que haya registros ahí ya. Por lo que queríamos asegurarnos de que tengamos muy pocos conflictos con los valores clave extranjeros. Vamos a tener otra propiedad, que va a ser una propiedad virtual y fue a llamarla color. Se va a llamar color en sí, tipo color. Se va a llamar color, sin color. Mira esto. Sólo puedo hacer puntos de control. No tenemos una clase llamada color. Para que pueda ver generar un tipo llamado color. Y les preguntará, ¿quieres que necesite en un nuevo expediente? Fui a verlo, sí, porque quería denotar nuevo para nosotros. Ahí ha aparecido como color y ese error se ha ido. Así que esa es una forma rápida agradable cuando estás creando nuevos tipos y no los has creado vtable, estás enjuagando o lo que necesitas hacer. Visual Studio tiene sugerencias para ayudarte a ser más productivo y no enfocarte en las cosas pequeñas. Eso es color. ¿ Qué necesito? Necesitamos la lista para modelo. Modelo va a sufrir el mismo destino que sufrió el nombre. Algunos solo van a quitar el campo modelo. Esto va a ser una identificación modelo. Te darás cuenta que siempre vuelvo y corrijo. Deja fuera algo que no está capitalizado o cómo un error ortográfico siempre estoy jardinería porque cuando lo haces bien la primera vez que sube firewall. Así que una vez más, con modelo, no estoy vinculado a usar ninguna biblioteca. En realidad quería generar mi propia confianza. Y luego modelo, como ves, es en realidad como una palabra clave porque es modelo. Me habrías escuchado hablar de modelos cuando estábamos hablando de Entity Framework en etcétera. Entonces es un poco arriesgado si solo llamo al modelo de clase porque no sé con qué otro nombre o con qué otro tipo de datos podría estar en conflicto. Voy a llamarlo modelo de auto, sólo para estar en el lado seguro. El tipo de datos que estoy creando se llama modelo de coche. Pero entonces voy a llamar al campo dentro de mi auto de clase, solo modelo. ¿ Está bien? Una vez más, a veces lo nombra de manera diferente. A veces lo nombras de la misma manera si necesitabas verlo, sabemos problemas, así que vamos a nombrarlo de la misma manera. Se trata de modelo de automóvil, ID, modelo de automóvil, y el modelo de carro de campo. Para nuestras nuevas entidades, ¿qué necesitamos? Todos ellos necesitan igual que lo que puede cortar. Todos necesitan una identificación. Necesitarán un nombre, y todos tendrán esa lista de cartas. Entonces en realidad, estos campos se pueden replicar fácilmente a través de todos ellos. Entonces para el color, tenemos ID foto color. El display aquí sería de color y no manso. Entonces ya ves, estoy copiando y pegando no hizo nada malo con copiar NPC1L1 para entender el concepto o lo que estás tratando de lograr, siempre puedes copiar y pegar y acelerar su productividad. Muy bien, entonces tenemos esos tres campos en color. Y luego fui a hacer lo mismo en nuestra clase de modelos de autos usando punto de control para incluir cualquier referencia que falte. Entonces éste estaría aquí en el nombre de la disciplina. Puedo ver un modelo porque sabemos que estamos mirando el auto, así que no necesito decirle modelo de auto al usuario. Esto es sólo porque estoy tratando de evitar conflictos y esto es acecho más experimentado porque he encontrado eso antes. Así que no te sientas de ninguna manera si te estás preguntando, de acuerdo, ¿cómo sé cuándo puede haber un conflicto o no? A veces es de prueba y error. A veces lo haces cuando intentas correr, te encuentras con el problema para que lo cambies. No hay problema. Contamos con auto modelo color, tenemos auto y tenemos Manso. No. Otra cosa que voy a señalar en este punto es el hecho de que todos están usando campos similares en cada uno de estos modelos de entidad hasta ahora tiene el campo llamado ID. Déjame simplemente espaciarlos tanto como estos tres tienen los tres fusionando auto común no tiene ninguno, nada más en común. Pero mi punto es que en lugar de repetir ID, ID, ID, ID, ID cada vez, una cosa que puedes hacer para una vez más reducir la repetición y aumentar extensibilidad y compartibilidad a través se introduce el código lo que llamamos modelo base. Entonces voy a crear un nuevo elemento que voy a llamar a base una nueva clase u otra porque estoy llamando a este dominio en tutti. Y entonces voy a conocer a esta clase pública abstracta. Entonces es abstracto. Las clases abstractas básicamente significan que están ahí, pero no se puede tener una instancia de ellas por sí mismas. Tú seleccionas ir con auto. Podemos instigar son iniciados u otro coche aquí puedo simplemente llamar a auto cuando es una clase abstracta, no se puede simplemente llamar a esta entidad de dominio basada en entidad en cualquier lugar. No obstante, es bueno para fines de herencia. Entonces desde aquí fui a decir prop int id. saber que tengo este campo aquí. Puedo a todos los demás. Todo el que necesita ese campo ID para simplemente heredar de B son entidades de dominio. Cuando hago eso con modelo de auto, lo que te das cuenta es que esta identificación se enciende. Ahora, el mensaje que me va a decir es que esta propiedad aquí está interfiriendo con la heredada. Entonces está viendo un conflicto, no es un error, error. Simplemente te advierte que si pretendía heredar el valor de éste siempre va a tener precedencia del heredado. Pero el punto de que yo herede que no quiero verlo ahí. Cada vez que tengas campos, para que sean livianos más adelante en tu carrera, podrías empezar a hablar de auditoría, donde quieres almacenar quién creó una fecha de 10 vatios. Fue creado. Cuando tienes ese tipo de campos, solo pones todo eso en la entidad de dominio base y luego te aseguras de que cada organismo que es una clase de base de datos hereda de la entidad de dominio base que nosotros cada clase tendrá esos campos independientemente. Este nodo reducirá su repetición. Entonces la próxima vez que tenga otra clase, no tengo que pasar tiempo poniendo el tinnitus apropiado que heredan. Si hay cinco propiedades que la clase IVR debe tener o cada tabla debe tener en común. Acabo de ponerlas todas en el bajo. Todo el mundo lo hereda. Muy bien, así que sólo voy a hacer eso por todas las entidades de mi dominio. Entonces conjunto de autos, se establece modelo CAR, se establece el color y te hacen sentarte. Todos heredan de la base. Entonces si quisiera, como dije, sólo extendió prop. Entonces digamos que quería saber cuándo fue creado. Entonces prop, tiempo. Fecha de creación? No, puedo decir bien, sé cuando se creó este modelo, este MOOC fue creado cuando este auto fue puesto en el sistema, etcétera Estos son todos los bits importantes cuando se trata sistemas. Con estos cambios en el lugar. Saltemos a nuestra consola de Package Manager. Y sólo voy a añadir una nueva migración. Por lo que voy a decir agregó más tablas de datos de autos. Ese es mi mensaje. Me gustaría migración y cualquier mensaje describe toda esta actividad lo mejor posible. Y luego déjalo seguir adelante y generar esa migración construir campo. Sí, claro, habilidades para interferir porque todos mis puntos de vista que tienen modelo no van a gritar. Historia similar a lo que pasamos con nombre. Pero una vez más, es mejor hacer esto mientras estamos en la etapa de desarrollo, lugar de cuando estás en producción. Simplemente pasamos rápidamente por todos esos campos sin comentar que haya tenido una dependencia del modelo. Y voy a intentarlo de nuevo. Y esta vez obtenemos nuestra migración. Entonces veamos a través de la migración rápidamente. Estamos viendo que estamos soltando la columna para un modelo donde agregar la columna para la fecha creada y se agrega, siendo agregada a la mezcla. Estamos agregando el ID del modelo de auto a los autos, el identificador de llamadas y la fecha creada, todos ellos se están agregando a los autos. Y estaban creando las tablas adicionales. Y luego sentar esos índices y las claves foráneas que no estaban allí anteriormente. Por supuesto, la cúpula solo está deshaciendo todo eso. Deberíamos hacer una migración de remoción? Después de todo eso, fuimos a hacer una base de datos de actualización. Y si todo va bien, terminamos lo hecho. Ahora vamos a actualizar nuestros campos. Entonces volvamos a la Create. Crear ya no tiene modelo de coche. Ahora tenemos ID de modelo, ID de modelo, y tenemos validación para el modelo ID o lo siento, modelo de coche, Ese es el nombre del campo. Es la identificación del modelo CAR. Y entonces en realidad vamos a tener una lista selecta, solo que esto para los modelos. Entonces vamos a hacer mic, luego seleccionar modelo. Entonces nuestros artículos ASP no viene de mix va a estar viniendo de un campo llamado modelos que vamos a estar sentados en unos pocos. También necesitamos ampliar esta lista para tener una facilidad para nuestros colores. Del mismo modo que tenemos que poner en los modelos. Tenemos que poner en nuestro identificador de llamadas, identificador de llamadas, seleccionar color. Entonces esto vendrá de una lista de colores. Muy bien, genial. Entonces eso es todo para o crea. Y lo que voy a hacer sólo para que esto sea muy fácil una vez más, copiando y pegando nada malo en ello. Simplemente saltaré a la actualización y cambiaré ese pensamiento porque realmente será la misma dinámica. Eso es todo por la actualización para nuestro índice, podemos descomentar esto y luego poner la identificación del modelo de coche. Por lo que será el nombre del modelo CAR. En el índice. Esto queremos mostrar el año, el micrófono, el modelo de auto. Y digamos que queríamos poner en la imagen, lo siento el color también, sería nombre de punto de color. Verás la importancia de los campos de navegación. Y luego descomentamos. Entonces este es modelo de auto, nombre de punto, color, nombre de punto. Muy bien, por lo que esto sólo está extendiendo eso. Esta es una parte normal de cualquier proceso de desarrollo de software. Vas a hacer algo. Vas a obtener retroalimentación, y luego vas a tener que deshacer algunas cosas y rehacer algunas cosas, hacer cosas nuevas. Es sólo una parte normal del desarrollo de software. Por lo que hemos actualizado nuestro índice o actualizamos o creamos. Por lo que son sólo los detalles ahora solo vamos a actualizar eso. Podemos hacer los demás por los detalles. También. Saber al hacer esto, en realidad se me ocurrió que había una cosa que el cliente pide que no pusimos y ese es el número de matrícula. Ponemos en todo menos el número de matrícula, no en este punto. Una vez más, tienes dos opciones. O bien puede deshacer todos los cambios que hizo en la base de datos y luego poner en el campo faltante. Y luego. Rehacer la migración. No voy a pasar por todo eso. Lo que voy a hacer en cambio es C Número de matrícula pública. Voy a usar una corriente porque la matrícula, mientras se llama número, realidad no es un número. A veces es alfanumérico. Puedo mi país es alfanumérico. Y tengo una regla general que no uso int y double o cualquier tipo de datos numérico a menos que fui a usar este número para alguna forma de matemáticas. Simplemente agrego mientras se llama número y si bien puede ser estrictamente números en su país, no va a ser utilizado para ningún tipo significativo de colisiones. Número completo no almacenaría número completo como número en la base de datos. Lo guardaré como una fuerza porque hay alguien pone guiones o los corchetes y así sucesivamente, entonces ya no es solo un número. Si el número de matrícula viene con letras, solo durante una cadena de prueba no tiene consecuencia. Si se trata de todos los números son alfanuméricos. Estoy presentando ese nuevo campo y todo lo que voy a hacer es solo agregar otra migración diciendo que hice el número de matrícula. Sigo escribiendo nombre. Lo siento. Pero estoy consiguiendo un campo de construcción. Eso es porque todavía no tenemos estos. Entonces lo que voy a hacer es comentar estos hacia fuera en la migración se hace. Vamos rápido, intentemos eso. Migración de nuevo. Nombre del botón de la gente. No quiero nombre. Fui a quitar la migración y fui a corregirla y ver el número de la matrícula. Y luego obtenemos la migración donde está diciendo que solo está agregando el problema de la ley de columna. Podríamos ponerle validaciones. Así que a veces haces algo y luego estás como, oh snap, olvidé ese paso. Así que volvamos y solo lo hagamos. van a requerir números de matrícula. Y voy a sentarme una cuerda de diez. Eso es generoso en mi libro porque no creo que nadie realmente tenga un plan de lecciones número de estaño en mi país, son seis personajes tiempo suficiente que vas a reservar o bajar, son hasta seis, pero eso dice ponerlo a diez. Por lo que nadie debería poder escribir un ensayo en ese campo. Hagamos eso otra vez. Ahora tengo que quitar la migración y luego agregar migración. Es bueno que Microsoft no nos cobra cada vez que estuvimos en esta declaración, podemos hacerlo tantas veces como necesitemos para asegurarnos de que lo consigamos bien entrando en la base de datos. Entonces ves aquí es invar, char estaño musulmanes y no anulable. Eso está bien. Entonces puedo ver la base de datos de actualización. Eso se hace. Muy bien, entonces ahora tenemos nuestro número de matrícula introducido. Puedo volver a mis antebrazos y puedo poner esa entrada para la división de licencia. Muy bien. Por lo que puedo descomentar esto. Gordon, entra, asegúrate de que si se explica en Tiziano, poner en clases divide número en la forma. Entonces haz lo mismo para la actualización. Entonces descomenta todo esto e introduce el campo número dividido lección. Una vez más, estoy siguiendo el mismo formato. Entonces aunque si necesito un nuevo campo, solo voy a copiar esto, pegarlo, y luego cambiar lo que necesito para cambiar. Tenga en cuenta que todo eso se introduce. Lo que tenemos que hacer es asegurarnos de que estamos cargando las otras listas desplegables. Entonces en este momento tenemos mics. Necesito uno para los colores y otro para los modelos. Justo de la misma manera que tuvimos que cargar mix. Tenemos que cargar colores y modelos. lo que podemos simplemente hacer fácilmente ese por favor, sin duplicar el esfuerzo tanto en el GET como en el post, puedo hacerlo uno por favor y ver una carga de datos iniciales. Aquí. Sientan los modelos para ser context dot lista Models.swift. Todos son del mismo tipo de formato y eso es realmente modelos de autos. Lo siento. Yo no nombré. Eso está bien. Entonces tenemos colores de punto contextual y tenemos nombre de ID. Notarán que estoy recibiendo estos errores. Y si me puedes decir por qué me estoy sacando estas flechas, entonces los saludos que Steve ha estado prestando atención. Si no me lo puedes decir, está bien. El motivo por el que estamos recibiendo estos errores, déjame cambiar tan rápido. El motivo por el que estamos obteniendo estas áreas es que el contexto no sabe nada de modelos de automóviles o colores. Entonces estoy aquí tratando de acceder a tablas que el contexto no sepa por qué no se ve contextos ahora, mientras las ponemos en la base de datos y creamos una entidades, aún necesitamos poner el DB sentarse. Necesito ver. Por favor golpeó a esta entidad llamada modelo de automóvil contra una mesa llamada modelos de automóviles. Y color contra color. Ahora bien, este es un buen punto para señalar todos estos matices porque es fácil perderse estas pequeñas cosas. Y cometí estos errores deliberadamente sólo un punto o peaje ser consistente es muy importante. Recuerda que esto representa el nombre de la tabla diciendo DB set CAR modelo y modelos de automóviles. Si hubiera puesto esto antes de hacer la migración que la migración habría dicho que el nombre de la tabla son modelos de automóviles y el nombre de la tabla aquí es colores. Pero debido a que ya hice la migración, mira lo que pasa. El nombre de la tabla es modelo de automóvil, y el nombre de la tabla es color. Así que ten mucho cuidado con eso. Cualquiera que sea el nombre de la tabla está aquí, quieres asegurarte de que tipo de espejo que de este lado con el nombre que le das y luego ese tipo de parece desajuste para mí. Los autos, yo. Realmente no me gusta cuando es así. Una vez más, no nos cobran para ejecutar migraciones, hogar e inmigraciones orina. Eso depende realmente de ti y cuántos archivos de migración realmente quieres. Pero una vez más, a medida que practicas más, cometes menos errores como este y verás que lo hacen bien la primera vez. Y luego te das cuenta de que cuando lo necesitas para ejecutar cinco migraciones para hacer una cosa, acabas de escribir en más recta. Ahora que he puesto esto en modelos de autos y colores, puedo ir a los bolsillos de la consola Manager y ejecutar una migración. Y estoy viendo nombres de tablas cartadas, así que esa es mi migración. Cuando obtengo ese archivo de migración, también estoy viendo eso, solo soltando las claves foráneas, soltando las claves primarias, renombrando la tabla, luego las está agregando de nuevo. Hace todo un proceso paso a paso de cómo maneja incluso cambiar el nombre de la tabla. Puede parecer simple, pero nunca aprecié completamente lo que pasan las bases de datos en el backend hasta que realmente vi qué tipo de código de migración se estaba generando para lo que percibí operaciones muy simples, ¿verdad? Por lo que siempre es bueno dejar que las migraciones manejen este tipo de cosas. Simplemente agregas la migración cuando lo necesites. Por lo que sólo vamos a actualizar la base de datos. Y una vez hecho eso, y una vez más, si te encuentras con flechas, acabas de entrar en el código. Probablemente en la forma, por el formulario de actualización probablemente tendría algún código que causará problemas. Simplemente lo comentas, haz lo que tengas que hacer, y luego volvemos a ello. Así que de vuelta en nuestra Create ahora ves que todo el mundo está feliz. Podemos cargar datos iniciales. No hicimos esta carga datos iniciales en nuestra actualización, y yo sugeriría eso. Entonces solo voy a descomentar este código que estaba causando problemas. Necesitamos modelos y necesitamos los colores por aquí y fuimos a tener ese método privado. Todo lo que hice fue copiarlo y pegarlo. Después fui a contarlo, seguir adelante y generar propiedad para modelos. ¿ Entonces lo ves? Entonces adelante y genere una propiedad, cuatro colores. Ahora si miro a la parte superior ahí están. Utilizando Visual Studio como herramienta de productividad. Te está ayudando a concentrarte menos en las pequeñas cosas y simplemente hacer las cosas. Sólo que sé tener mis listas selectas. ¿ Qué necesito hacer? Necesito llamar a mi señor método de datos iniciales. Uno. Cuando estoy a punto de devolver la página, llamo cargar datos iniciales. Eso es asíncrono después de nuestro ponderado. Entonces si el estado modelo no es válido, entonces tengo que llamarlo de nuevo datos iniciales. Eso es todo. Muy bien. Con eso, hemos logrado mucho. E incluso entonces probablemente podrías abstraer esta funcionalidad integrada en un método ayudante que hace eso por ti. No voy a conseguir eso técnico y complicado todavía. Sólo te estoy dando las ideas, pero aún ves que tenemos que repetir este método aquí. Y en el crear y tal vez otras páginas donde pueda necesitar enumerarlas. Entonces, si quieres reducir la repetición y es entonces cuando empezó a ver, vale, ¿cómo puedo crear un archivo con el método que necesitan usar múltiples lugares? Entonces puedo llamarlo y tener todo el código en un solo lugar con todo eso dicho y hecho. No obstante, hemos logrado mucho haber extendido las mesas. El cuadro de autos que tenemos crea una nueva mesas y hemos facilitado para nueva lista desplegable de nieve. Cuando volvamos vamos a hacer los andamios para las nuevas mesas porque lo hicimos con micrófonos para que pudiéramos mantener la lista de mix. Tenemos que hacer eso por los colores y para los modelos. Y luego también veremos cómo podemos controlar qué modelo aparece cuando se selecciona un micrófono. 20. Mejora los formas y validaciones, parte 2: Hola chicos, bienvenidos de vuelta. La última vez que lo dejamos con solo poner nuevas mesas y ponemos en las listas desplegables, pero tenemos que poner en realidad las playas de la multitud alrededor de estas listas. Voy a hacer uno contigo y luego te voy a desafiar a pausar el video y hacer el resto por tu cuenta. Así que hagamos los andamios para nuestras páginas de modelos de automóviles. Y luego podemos agregar una nueva carpeta. Así que sólo voy a decir modelos de autos. Entonces en lugar de eso, fui a agregar una nueva página Razor, páginas de Razor usando el crudo Entity Framework. Y luego estamos modelando de modelo de auto. Adelante y pulsa Agregar y salvo cualquier error, que una vez más sería porque probablemente solo necesitas ir y retroceder a versiones anteriores que habrían funcionado. Puedes ver tus modelos de auto ha sido andamios. Te animo a golpear pausa o simplemente hacer lo mismo por tu cuenta para los colores. Si todo salió bien, entonces deberías tener una carpeta en tu página se llama colores. Y todas las páginas crud. Lo que voy a hacer es ir rápidamente al layout y agregar los nuevos elementos suficientes. Entonces voy a quitar la privacidad porque realmente no estoy usando esa privacidad vinculada. Entonces tenemos autos, tenemos modelos mixtos, tenemos colores. Por supuesto que acaba de cambiar el camino a la raíz del índice de barras de nombre desplegado. En otro reto que les daría chicos es si están interesados en extender de la misma manera que hicimos el borrado de los autos. Entonces recuerda en la página de índice hicimos la alerta de toda la suite y eliminamos el formulario en el jQuery para rellenar el formulario Delete y el manejador personalizado para la eliminación. Yo les animaría a que sólo traten de hacer eso en los demás. Ahí es donde entra la práctica en los modelos de automóviles. Cuando estoy mirando la lista de modelos de autos, ¿y si quisiera eliminarlos? Bueno, podemos poner en jQuery y todo y ponerlo en manejador personalizado. Y no necesitarías la Página Eliminar. Te estoy animando a probarlo por tu cuenta. Lo hicimos una vez, revisamos cómo lo hicimos y aplicamos los conocimientos porque así es realmente cómo se mejora como desarrollador. Pongamos a prueba adeudado o aplicación. Pasemos a modelos y estoy haciendo clic en modelos y no pasa nada. Y eso es debido al nombre de carpeta equivocado en el diseño. Así que mi mal Shun, refresco. Inténtalo de nuevo. Si voy a modelos Ahí estamos. Ahora estamos en los modelos de autos para esto, fui a sumar un nuevo modelo y esto sería un Sony para Nissan. Ahora, el aviso sí lo creó. No quiero que el usuario me diga cuándo fue creado. Esto es algo que debería ser automático, que quiero que eso suceda en segundo plano. No quiero que esto no deba estar en la pantalla para que el usuario vea y herramienta que necesita estar sucediendo en segundo plano. Así que ten en cuenta más adelante cuando empezamos a mirar los modelos. Porque cuando estamos utilizando los modelos de datos, esta es una de las limitaciones que necesitábamos para la base de datos o no lo queremos para la interfaz de usuario. Hay momentos en los que tendríamos que crear una separación entre lo que mostramos al usuario y qué almacenamos realmente. Esta es una de esas situaciones. No queremos mostrar al usuario este campo en absoluto, pero sí necesitamos almacenarlo en cualquier lugar. Sólo voy a proceder viendo modelo es Sony. Adelante y crea un ISI notas intermedias creadas se requiere. ¿ Por qué se requiere esto? Porque no pusimos su requerido sobre él. No obstante, el tipo de datos que utiliza es el tiempo, que al igual que el int, da un requisito automático. Solo estoy mostrando que sostienes la dinámica de todas estas cosas cuando ponemos las cosas. Si es necesario, para considerar el panorama completo por el momento, o cuando nos encontramos con este tipo de temas, cómo podemos trabajar los nuestros propios, son más a entender hacia trabajar los nuestros propios. Es por eso que hice requerido fecha creada lo siento, está siendo terco y diciéndonos que se requiere calor, así que eso está bien por ahora. Sólo para ir más allá de esta casa, por favor solo ponga en una fecha creada. Y ahí vamos. Para que podamos sumar algunas cosas. Spider, que es Ferrari, acaba de hacer que hoy Create. Y tenemos Toyota. Harrier fue el primero en nuestro sistema. ¿ Qué otro? Lo siento, no recuerdo cuál es la mezcla que tenemos, así que déjame solo mirar la mezcla. Tenemos a Nisan. Eliminé los extra, así que tenemos al menos uno a 2171 Ferrari. Eso es bueno. En nuestros modelos. Nosotros los tenemos. No, necesito algunos colores y sólo voy a mantener esto simple. Sólo voy a decir negro y azul. Y azul. Cuando voy a crear un auto, autos y digo Crear Nuevo. Recibo la lista desplegable para mí. Yo consigo el modelo de auto. Pero los estoy viendo a todos. Podría decir fácilmente Toyota spider. Después vemos el identificador de llamadas , negro y azul, el año, digamos 2020. Y el número de matrícula, como dije, en mi país, puede ser alfanumérico, por lo que podría ser 1234 AB. Ese es el formato general que creamos. Al menos vemos que está creado, pero no estamos viendo modelo, no estamos viendo color. ¿ Dónde estamos viendo el color moderno? Foto uno que acabamos de crear. No lo estamos viendo por la misma razón. No vimos el micrófono inicialmente porque en nuestra consulta cuando estamos obteniendo por el índice, así que déjame simplemente saltar al índice los autos en esa consulta. Tenemos que incluir. Por lo que tengo que asegurarme de que digo incluir. Lo que estoy haciendo es sólo romper líneas para que solo pueda controlar D en esto y conocer mi vida mucho más fácil. Trabajando más inteligente, no más duro. Cuando se obtiene los autos incluyen el micrófono, el modelo del automóvil, el color, y luego la última versión de Visual Studio Code, aplicar cambios de código. Adelante y golpea refrescar, y estamos viendo al menos con la reaparición del color. Así que vamos a depurar y ver por qué no estamos viendo el modelo. Por lo que hice todos los Incluye. Puedes seguir adelante y reiniciar si ya estás corriendo en modo de debug, pongo un punto de ruptura aquí para que cuando se carguen los datos se detenga y me permita entrar e interrogar a cinco autos. Cuando el auto que acabo de añadir tiene que hacer identificación, pero no tiene identificación de modelo de auto. Eso significa que algo salió mal con la forma entre el formulario que se presenta y que llegue aquí, algo salió mal. Eso está bien. Así que pasemos a Crear y ver qué podría faltar. Entonces ese es el problema. Wow. Copia NPS. Si bien es bueno. Sólo ten mucho cuidado. Todavía lo estaba vinculando al campo equivocado, por lo que debería ser mic. Guardo eso, refresco o Aplicar cambios de código. Vamos a intentarlo de nuevo. Adelante y carga el formulario Crear. Llegamos al bloque de araña 1990. Y solo reutilizaré ese número dividido de lección. Quitar estos puntos de ruptura. Por lo que sólo va adelante y carga y ahí vamos. Está viniendo botón o la encuadernación está sucediendo como esperamos. Eso es bueno. Eso es maravilloso. Batallas peleadas. Si vamos a Editar a ninguna parte viendo todo lo que teníamos a Putin. Si cambio esto de negro a azul y de Toyota a contratar porque se dan cuenta, oh, cometí un grave error y hago clic en Guardar. Entonces vemos, estamos de vuelta al cuadrado uno. Estamos a punto de cuadrar uno porque actualizé el create y uso el mismo código aquí en la actualización. La actualización aún tiene ese error. Las pruebas de regresión siempre son importantes en cualquier momento en que introduzcas cambios en su sistema, retroceda y asegúrese de que lo que solía trabajar acería. Así que permítanme volver a intentarlo. Ahorra y ahí vamos. No, la edición está funcionando, crea estos funcionando, todas esas características funcionan. ¿ Funcionan las necesidades? Vamos a revisar. Muy bien, así que todo funciona de la manera que levantamos. Es el siguiente elemento de ticket grande fue que cuando creamos, queremos asegurarnos de que solo exista el modelo respectivo relativo al micrófono. Eso significa que cuando creo un modelo, necesito hacerle saber a qué hacen que pertenece. Y luego herramienta cuando selecciono un micrófono al crear el auto, necesito asegurarme de que estoy cargando solo los modelos los que se relacionan con todos. Muy bien, así que eso es muy importante, eso es, fue muy importante. Destacaron aparte en la reunión. Entonces veamos cómo podemos hacer eso. Entonces lo primero que tenemos que hacer es introducir un ID de micrófono. Entonces necesitamos crear una relación entre el modelo y el mic y pensarlo conceptualmente. Porque, quiero decir, si tienes un auto y sabes que tienes ciertas marcas fuera de autos esa vez, ciertos modelos. Esa es nuestra relación. Entonces si fueras a hacer un crucigrama pausas, Laura, una de esas actividades de coincidencia de crucigramas donde las marcas en la cabeza, en los modelos del otro lado y debería coincidir las que relacionan el uno al otro. Será el mismo concepto una clave foránea cuando trates esa línea entre Toyota y Harrier o Nissan y Sony, que está utilizando que están relacionados. Para que esa relación se vea como una llave foránea, que es lo que hemos estado haciendo hasta ahora con el coche. Hagámonos. Salta fuera del modo de prueba y vuelve al modo de extensión, entra en el modelo de automóvil. Fui a introducir una llave extranjera. Ya tengo ese tipo de llave foránea aquí en make, ID y auto. Así que sólo estoy copiando eso, saltando al modelo de auto. Y luego fui a presentarlo. Ahora tengo ese campo para hacerle saber que debe estar relacionado con un mic. De la misma manera. Debido a esta relación, puedo ir a MIC y hacerle saber que tiene una lista de modelos de autos y ver cómo funciona eso. Entonces con eso hecho, estoy seguro que lo adivinaste, necesitamos una nueva migración. Entonces agrega migración, relación modelo, ese es mi mensaje. Entonces obtenemos el archivo de migración, que no está haciendo nada divertido. Por lo que ya sabemos que podemos mirarlo. Sólo sabemos que está bien, está haciendo lo correcto. Podemos actualizar la base de datos y cuando eso se haga, podemos movernos en la multitud para nuestros modelos, modelos de automóviles. Tenemos que ampliar el crear Peytchev, una lista desplegable para la mezcla. Y necesitamos y también el Edit, lo siento. Entonces ya tengo ese tipo de código. Una vez más, trabajar más inteligente, no más duro. Así que sólo voy a tomar esta forma grupo. Voy a saltar por encima de los modelos de autos y en realidad voy a quitar la fecha creada. Por lo que en realidad puedes simplemente quitar el campo. No quieres sentirlo en la página, lo quitas. Aquí. El encuadernación sería CAR modelo dot make ID fueron tomados de mix. Eso no parece existir, pero eso está bien. Fuimos a copiar esto también. Vaya a la pestaña de edición. No quiero que se cree la fecha. Necesito retener la puerta de identificación. Recuerda, siempre retener lo oculto. Pero no quiero eso sexual y solo quería hacer parte de la identificación. Muy bien, entonces voy a tener esa carga de datos iniciales para que esa consulta inicial que ejecutamos cuando tuvimos que llenar los datos para la página. Así que sólo voy a saltar a los modelos de autos. Fui a usar el método, fui a eliminar el exceso. No necesito esos dos. Sólo necesito los mics. Entonces fui a crear esa propiedad. Muy bien. Y luego incluir cualquier referencia que falte. Entonces aquí solo haré mi señor, llamada de datos iniciales. Y haré lo mismo antes de devolver la página. Y esto está todo en el crear un fregadero, algún tipo de exceso de velocidad a través de esto porque esto es cosas que acabamos de hacer y realmente solo estoy copiando y pegando el código que ya pasamos en detalle. Entonces no estamos haciendo nada especial en este punto. Es lo mismo. Sólo estamos reutilizando el código que escribimos y sabemos los conceptos de si hacemos eso para la consulta, tenemos que hacer eso también para la edición, que es Into tener lo va a poner aquí, sangrar y generar esta nueva propiedad. Y luego hacemos nuestra llamada, nuestra carga de peso, los datos iniciales. Hicimos esa llamada aquí también en las puertas antes de devolver el pH que estamos hechos. Ya hemos terminado facilitando make ID para nuestros modelos. Así que permítanme correr, saltar por encima a nuestros modelos crear. Y verás aquí estamos sacando la lista de micrófono. Tenemos el modelo teórico de capacidad, alguien a decir Sony. Y estás relacionado con Nissan. No quiero crear esa. Muy bien. Por lo que en realidad solo voy a eliminar todos los anteriores. Para que no haga clic medio en ellos, ábrelos en nuevas pestañas, elimine. Así que no lo he hecho, no he extendido estas cosas, la funcionalidad lead todavía. Eso no es problema sin embargo. Todavía funciona. Por lo que elimine. Muy bien. Oh, pensé que van a funcionar bien, no lo hacen éste está en el delete conflicto con algo y marido terminado. Y creo que eso es sólo porque estoy eliminando algo que no debería estar bien. Borrado. Este error de eliminación es realmente porque creamos un auto que tiene una relación con esta cerveza que está en la mía. Entonces permítanme señalar esto desde la migración. Como dije, cada vez que vemos flechas, no estoy patinando bordeando políticas flechas porque hay momentos en que aprenderás los conceptos sin ver ningún Arizona cuando llegues Arizona y mucho para hazlo, es bueno ver a los Arizona entenderlos. Cuando creamos las migraciones, la mayoría, si no todas las claves foráneas que se agregaron, se agregaron con lo indebidamente se está refiriendo a realmente restringir. Si no estás tan familiarizado con las bases de datos. Lo que pasa es que tienes la acción referencial que te permite decir cualquiera de las dos, cuando elimino el registro padre, lo que significa que ya eliminas un auto. No necesitaba como modelo de auto. Entonces eliminar todos los autos que tienen esa asociación. Si iba a borrar un color, digamos que elimino ese negro y agrego 50 autos en la base de datos como negro. Si lo quisieras. Cuando elimino el negro, eliminaría todos los 50 autos como bloque, entonces verías una cascada. Acción en cascada significa eliminar todo lo relacionado con este registro. Lo que nuestras migraciones nos dan las restringen, razón por la que estamos recibiendo esa flecha porque está diciendo que no vas a cargar herramienta, eliminar un registro que tenga 200 registros. Entonces algo está confiando en este registro. Por lo que sabré es confiar en el Aguilucho requerido que tenemos no puedo borrar Harrier hasta que elimine todos los autos que son transportistas. Entonces el Dr. Glenn borra todos los registros reales de autos que son contratados, luego remontada y densidad. Sí, quería hacer la llanta. Eso es básicamente lo que esto está diciendo. Es un error, pero no es realmente, realmente, realmente un error. Eso está bien. Simplemente seguiré adelante y agregaré otros nuevos. Me doy cuenta porque me quité la fecha creada, está incumpliendo una escritura. Entonces no me está diciendo que se requiere porque no está en esta pantalla pensar que se requiere, pero cuando no se proporciona nada a través de ella, obtendrá un valor predeterminado así, igual que dentro de T, si no se proporciona nada, será por defecto a 0. Esto sería araña. Y la araña es realmente relativa a Ferrari. Y el otro que teníamos, vamos a sumar otra barrera. Y éste es Toyota o déjame usar otro. Déjame usar lexoffice o supra. Ahí vamos. Por lo que supra Toyota crea, tenemos al menos tres registros que están directamente relacionados con mix. Uno que sigue siendo una especie de estatus libre. Entonces cuando voy a autos y voy a crear, la expectativa es que no debería estar viendo todo en la lista desplegable como esta. Si hago clic en Toyota, solo debería estar viendo que Toyota relacionado en si hago clic en Ferrari al menos interruptores y propiedad sobre los modelos Ferrari, eso es lo que espera el usuario. Obviamente eso no está sucediendo ahora, implementemos lógica para cumplir con eso suceda. 21. Agrega listas desplegables con JQuery: parte 1: Muy bien chicos. Entonces cuando estuvimos el año pasado, estábamos sentando nuestro formulario y estableciendo nuestras listas desplegables para modelos mixtos colores. No. El siguiente elemento de ticket grande es que quieren que cuando seleccionen el micrófono de la lista, automáticamente filtrará la lista de modelos para su visualización. Repasemos lo que tenemos en este momento. Tenemos nuestro formulario que tiene todos los micrófonos enumerados en todos los modelos enumerados. Así que no quiero arrancar un agujero. Cambio el micrófono. Seguimos viendo todos los modelos. Muy bien, entonces eso significa que cuando elijo al sol, solo debería estar viendo soleado en base los datos que hay en la base de datos en este momento, cuando elijo ferocidad, esta lista debe reconfigurarse y solo mostrar araña. Eso es lo que necesitamos implementar. Y la herramienta que vamos a estar usando es JavaScript o jQuery. Jquery tiene esta característica llamada ajax conjuntos de los que realmente hacen lo que llamamos llamadas asíncronas, dijo al código del lado del servidor desde el lado del cliente. Es decir, estaremos dentro de la sección HTML estática de caballo, pero estaremos golpeando servicio dichos mitos, cargando la consulta, obteniendo los datos, y luego llevándola bucal con el declive y dicho todo en tiempo real, vamos a empezar esta fiesta pasando a nuestra página Crear para los autos. Y lo que vamos a hacer es anular el valor id para los modelos. También vamos a sumar más al valor id para la mezcla. Ahora, una explicación rápida. Recuerda que el ASP dash four es ese ayudante de etiqueta que cuando la página se renderizará nos va a dar el atributo name así como el atributo ID. Ahora cuando tienes ese tipo de nombre de doble cañón como auto dot Manso ID. El ID en sí va a salir como subrayado del coche Manso ID. No quiero una identificación tan complicada, así que siempre puedo anularla con mi simple. Así que estoy agregando ID equivale a la mezcla a la lista desplegable de la mezcla. Id equivale a modelos a los modelos de lucha. A continuación, necesito agregar algo de JavaScript. Recuerda que lo que queremos logra que cuando cambies el valor de ID de micrófono, vamos a estar cargando o cambiando dinámicamente los valores que están disponibles en la lista desplegable del modelo. Voy a empezar en mis grupos de cumplimiento sexual con una etiqueta de guión. Recuerda que eso es lo que esta sección está dedicada para ello dime quería escribir JavaScript. Siempre crea esa sección. Y luego pones en tu etiqueta de script, y luego puedes proceder. Empecemos con nuestros manejadores de eventos. Así que estoy viendo un evento de cambio de valor en la lista desplegable mix. Hemos visto que podemos ver para un evento click en un botón. Por lo que más o menos puedes observar cualquier tipo de evento en cualquier tipo de control, el tipo de evento que elijas usar, el ISR relativo a cualquier operación que estés realizando. Quiero que cuando cambie el valor de ID aquí o el valor de ID Manso, que haga otra cosa. Estoy viendo. Cuidado con mi elemento con el hueso ID Sumer no querría un elemento por ID. Vemos un hashtag, luego vemos la mezcla de ID, ver cuánto más fácil es eso. Entonces el evento que estamos viendo es un evento de cambio, va a ver a ver cuándo se cambia el valor. Y luego especificamos que queremos ejecutar esta función siempre que eso suceda, función para obtener el giro rojo. Como dije, una cláusula de retiro al aire libre desde el get-go. Y así es que no lo olvido. Y luego romper algunas lentes y luego podemos empezar a escribir el código aquí. Lo primero que quería hacer en este evento es obtener el valor. Ha cambiado. ¿ Cuál es la nariz de valor? Voy a decir var make ID es igual a esto. Este objeto representa cualquier control que activó el evento, este valor de punto. Entonces quiero Sentar los valores predeterminados dentro del modelo. Entonces la mentira de codificado duro que lo que voy a hacer es en realidad solo sacarlo del selecto. Entonces no soy difícil codificarlo porque siempre vamos a estar cambiando los valores. Lo que sí quiero que el HTML ahí sea ese bit predeterminado de texto. Entonces voy a decir, consígueme el elemento por los modelos de ID. Recuerda, selecciona modelos ID, dame ese elemento y establece el HTML en ese elemento para que sea opción. Entonces esto se asustará, solo añada el HTML, sea cual sea el control. Simplemente agregará el HTML, lo que sea que pongas aquí con eso dentro de las etiquetas. Cada vez que quisieras manipular lo que hay dentro de una etiqueta, tal vez tenga un div vacío. Queremos poner otro elemento ahí sobre la marcha. Eso es exactamente lo que estamos haciendo. Ahora tenemos la lista vacía. Sí, es conseguir los artículos de modelos y podría dejar o quitar eso porque en la primera carga no quiero que se quiten ningún articulos que cada vez que esto se cambie, entonces debería por lo menos siéntate ese defecto. Etiqueta Html. Y luego vamos a ser el llamado Ajax para ir y Fitch los valores de la base de datos y traerlos de vuelta aquí. Entonces para hacer eso, fui a ver un signo de dólar dot conseguir JSON. Entonces este es un método jQuery Eso me permite llamar a una URL. Iba a poner comillas vacías están ahí para la URL. También me permite pasar los datos. Entonces en este caso, necesito obtener los modelos basados en el ID de micrófono, el nombre del parámetro. Eso es que voy a usar este id de micrófono colon. Y el valor y pasarlo es Manso ID. Entonces este es el nombre del parámetro. Este es el valor que noté cuando resalto esto, también resalta la variable. Este es el valor de cualquier valor que provenga del evento de cambio. Eso es lo que estoy pasando a este método. Entonces tengo una coma, y luego esta función básicamente dice, cuando tenga éxito, voy a hacer esto. Y se necesita, o tiene capacidad para tomar un parámetro llamado, lo estoy llamando datos. Los datos aquí representarían lo que regresara de la llamada del lado del servidor. Voy a dejar este caparazón de, de una función aquí. Dentro de esta zona es donde vamos a hacer con la magia de llenar la pendiente. Pero esta es la plantilla básica. Entonces tenemos una URL, cuál de ellas lo pone donde pasa por encima del valor make ID que se va a utilizar para filtrar la lista de modelos. Entonces cuando consigamos, pero luego ellos mismos modelos, vamos a estar implementando la acción en esa área. Fui a hacer una pausa aquí un rato. Y voy a saltar al archivo de código para este crear. Y lo que necesitamos poner aquí es un método que en realidad se llamará cada vez que ocurra el evento de cambio. Entonces recuerda que ajax nos permite hacer servicio. Tenía llamadas desde el código del lado del cliente. Aquí. Voy a poner en lo que lo llamaremos otro manejador. Entonces recuerda que estos métodos se llaman manejadores. Y éste va a ser resultados JSON. AyncTask pública devolviendo resultado JSON. Y esto va a estar encendido, en llegar. Así que recuerda que estaba diciendo que tienes en get, eso es una palabra clave en post, Esa es una palabra clave. Cuando queremos un 100 personalizado, voy a decir sobre Git. Y llamemos a esto modelos, o incluso puedes llamarlo un auto movilizado si quieres ser explícito. Así que en obtener modelos de automóviles, esto necesita un entero que sería Manso ID. Ese es el parámetro que estamos viendo que vamos a estar enviando. Necesitamos recibir ese valor dentro del parámetro ahí. Entonces este método necesita devolver resultados de un JSON. Entonces, ¿por qué necesitamos ejecutar la consulta? Y dos, necesitamos atender para hacer algunos resultados. Podemos hacerlo en una línea, lo haré en dos solo para mostrar los modelos VAR serían iguales a los modelos de autos de punto contextual. Y entonces es bastante fácil decirlo a la lista. Por lo que se ve que las dos listas asíncronas sólo va a devolver cada cosa en la lista, que es lo que hemos estado haciendo aquí, pero eso no es necesariamente lo que queremos. Queremos que se filtre. Entonces necesito inyectar lo que lo llamaremos una condición o cláusula de dónde. Tengo que decir punto donde. Entonces ponemos en nuestra expresión Lambda. Entonces q es mi token esta vez. Y fui a ver dónde coincide la columna de MC ID con el valor que se pasó a través del parámetro. Después de que lleguemos a todos esos, entonces solo voy a decir devolver nuevo resultado JSON con los datos de los módulos. Lo que esto hará es en realidad tomar todos los objetos de la base de datos, los datos del almacenamiento de la base de datos en lugar de modelos. Y entonces esto solo devolverá todo eso en forma de folk llamado JSON. Esto se queja porque necesito, esperaré la llamada a este método. No, tengo una idea del camino que necesito llamar para que los datos regresen al JavaScript, ahora puedo decir getJSON, tu URL, o la ruta a la que debes llamar. Sería slash autos, slash create. Supongo que eso parece familiar. Son flashcards serían los autos carpeta slash create sería nuestro Create file, pero nuestro Create file or create method que tiene el on Git y el on post también tiene en get car models. Y este es nuestro manejador de esa situación. Por lo que tengo que ver. A slash chicos slash Crear. Entonces pasaré una cadena de consulta en la URL para ver el manejador al que se espera llamar en la página Crear es igual a los modelos de automóviles. Observe la convención de nomenclatura por aquí. Se llama On get. Esa es una palabra clave, esa es una expresión clave que las páginas de Razor está buscando, pero el método en sí se llama modelos de automóviles. Estoy viendo que tu manejador es modelos de autos, así que no tengo que ponerme la guitarra, la parte OnPause. Sólo estoy viendo llamados modelos de autos. Después de hacer todo eso, tenemos el conjunto de URL y tenemos los datos, o al menos lo que necesita ser posible como parámetro que se espera obtener. Pero estos datos, lo que voy a hacer es recorrer los datos y llenar manualmente la lista desplegable. El motivo por el que habría puesto esta línea es que cada vez que hago realmente motor la lista desplegable mixta, quiero restablecer. Entonces con solo llamar a esta línea se va a vaciar todo el HTML y se va a sentar sólo lo que pongo aquí como el HTML. No, necesito tener ajuste a los datos. Pero en el resto del HTML, signo de dólar dot cada uno es una forma que voy a ver para cada uno en JavaScript. Y la recolección estaría viniendo de más variable aquí, datos. Por lo que los datos representarán el nuevo resultado JSON que se devuelve. Para cada uno. Básicamente los objetos en los datos ejecutan esta función donde obtengo una clave y llamémosla un valor, una clave y un valor. Y luego abrimos y cerramos eso y punto y coma. Así que no lo olvido. Entonces en este método forEach, básicamente solo voy a definir cómo debería ser una opción. Entonces la opción var es igual a y voy a ver opción de signo de dólar. Entonces signo de dólar, opción de corsé abierto, opción de entrañas abiertas al igual que la etiqueta. Entonces queremos esa etiqueta upsilon ahí. Voy a añadir un atributo. Entonces recuerda que un atributo que es muy esencial para una opción desplegable sería el valor. Estoy agregando este atributo y voy a decirle que es valor es el valor dot d. De acuerdo? Porque recuerda que cuando esto devuelva la lista de modelos o una tabla modelo nos va a devolver el ID cortesía de la herencia de entidad de dominio base también está dando nombre a vodka. Sí, se da sobre Manso ID y lista de autos. Eso está bien, pero sí necesitamos aquellos realmente necesitan el ID para el valor y el nombre para la pantalla. Puedo inferir que el resultado JSON, que acaba de devolver resultados de mismo a nosotros o resultado de un montón de objetos de la misma clase que acabamos de mirar. Definitivamente va a tener la sección de valor, un campo ID. Y luego fui a agregar punto txt sea el nombre de valor para cada opción, para cada valor o cada cosa que volvía a través de los datos. Obtener el valor. Después construye una opción donde estés poniendo el valor como el atributo y el texto, que será lo que estaba entre lo abierto y el cierre. El apartado que dice selecto modelo, que toma para ser un nombre válido. Después de haber construido una opción, lo siguiente sería anexarla. Solo voy a ver los modelos dot anexar a, pero solo anexar opción. Entonces anexar saber se sumará al final de lo que hay ahí dentro. Entonces cuando digo punto HTML, se vaciará Totalmente lo restablecerá a cualquier valor que quiera aquí. Si lo quisiera en blanco, solo podría decir que tu HTML no está en blanco. Tu isquio, no hay adopción. No obstante, en este caso, no quiero limpiar los baños. Ya está limpiado con el valor predeterminado. No, solo quería anexar las otras opciones, la predeterminada. Ahora con todo eso hecho, lo que voy a hacer es introducir aquí un pequeño método que uso para depurar llamado console.log. Siempre que estés tratando de hacer tu JavaScript o jQuery y no del todo seguro si lo que estás haciendo está funcionando o qué valores se están pasando se están estableciendo. Siempre puedes hacer un console.log que imprimirá en el área de consola de tu navegador, mostrándote lo que sea que estés imprimiendo. Así que fui a hacer un registro de consola para el Manso ID solo para asegurarme de que estamos recibiendo por el valor del carrito cada vez que hay un cambio. Y también voy a hacer el inicio de sesión de la consola en los datos justo aquí cuando la llamada JSON tenga éxito. Porque entonces verás cómo se ve realmente JSON si no estás del todo familiarizado. lo que estoy hablando cuando vea a Jason, digamos en cuanto a ser una aldosis para controlar F5 o más bien lo haré en modo de debug, establecer un punto de ruptura aquí mismo podamos ver exactamente cuándo ese método se llama. Podemos seguir adelante y obtener una mejor comprensión de cómo funciona Ajax. Muy bien, así que estamos en la página millenia, mira aquí uno, no hay nada en esta lista desplegable porque uno, quitamos nuestros ítems ASB de ella. Así artículos ASP, por lo que el mic, pero para los modelos No hay artículos ASP. Entonces a pesar de que llamamos a la base de datos en segundo plano y cargamos datos iniciales, no le dijimos de dónde debería estar sacando sus reactantes de entrada. También eliminamos la opción predeterminada de esta lista enlazada. Entonces estamos obteniendo una lista desplegable en blanco. Hacer está bien. Ahora cuando hago clic en Toyota, mira lo que pasa es saltar a mi punto de descanso. Eso significa que la llamada Ajax está encontrando con éxito al manejador. Sólo voy a saltar a la última línea que podamos ver lo que hay en los modelos. Ya ves aquí, eso es, en realidad tiene el único modelo Toyota que está en la base de datos. Eso es todos los datos que está devolviendo todo en la base de datos. Entonces podríamos refinar esto un poco más porque realmente no necesitamos todas estas cosas. Realmente solo necesitamos el ID de micrófono y el nombre. Muy bien, pero eso está bien. Vamos a seguir adelante y continuar o lo siento, sólo necesitamos la identificación y la rodilla. No necesitamos hacer ningún arrepentimiento si acabo de golpear a F5 y permitir que continúe. Ahora verás que el texto predeterminado se está cargando en. Uno sin cambios. Se siguió adelante y estableció el HTML. Y luego dos, hizo la llamada Ajax, que luego recupera estas cosas. Entonces eso significa bajo eso voy a ver supra saber cuando hablo de log de consola, si haces clic derecho ve a Inspeccionar Elemento o calentar si 12 y haz clic en Consola, entonces realmente verás la consola. Se mensajes que se imprimen aquí. Este es un error al intentar cargar las cosas impresionantes de la fuente. Entonces eso es minúsculo en este punto, lo que ves aquí que la consola está registrando las ideas de micrófono. Uno, si cambio esto a Nissan, ves que es Herramienta. Si lo cambio de nuevo a Toyota es cada uno. Entonces cada vez que hicimos el cambio, estamos registrando consola, podemos ver qué valor se está eligiendo. Debajo de eso. Te darás cuenta que soy mucho más complejo buscando constructo y esto es lo que JSON realmente se ve así. Si amplío esto, eso es lo que llamamos objeto JSON. Json es JavaScript Object Notation, que es un estándar muy, muy popular para transportar datos a través de la web, http en este momento. En este caso, lo que hizo fue tomar todos los datos de la clase y serializarlos en pares clave-valor. Entonces el nombre del campo y el valor que el campo tendríamos. Entonces por eso ves nombre con un valor de Manso ID con el valor make, etcétera. Entonces es el mismo tipo de restricción que acabamos usar aquí cuando estábamos haciendo la llamada, esa es ésta. Aviso clave o un parámetro de dos puntos. Y el valor justo desde que estoy usando una variable, pero en este caso surgió en los valores literales. Después de obtener ese objeto de la llamada ajax, somos capaces de saber simplemente acceder a los valores individuales o a los valores por sus claves. Es, es un objeto y también es como una matriz. Es una matriz de estos objetos JSON. Si tuviera múltiplo, dile que lo hace en el sistema. Así que déjame ir y crear unos cuantos más y modelos. Acabo de crear alrededor de dos Toyota más en el sistema. Entonces mira lo que pasa cuando te toco respondiste Nissan, pero estoy cambiando buck a la norma Toyota visto que hay tres Toyota en el sistema. No me detuve ni nada literalmente, acabo de pasar los creó. No hay en la base de datos. Cada vez que golpea la necesidad de ocupado, va a recuperar los valores más nuevos. Y hay objetos JSON. Entonces estamos viendo a cada uno de los autos en su propia representación JSON y siendo representados aquí mismo en la lista desplegable. Entonces eso es lo que llamaremos lista desplegable en cascada. Las personas que solicitaron esta función no sabían que querían una lista desplegable en cascada. Ciertamente no apreciarían el nivel de esfuerzo que se va a crear tal constructo. No obstante, como desarrolladores, siempre nos van a dar los requisitos y depende de nosotros encontrar la mejor solución. Entonces en este caso, jQuery fue la solución más fácil para algo que, como dije, jQuery o JavaScript. Eso no es algo que vayas a escribir siempre necesariamente, pero definitivamente te resulta útil cuando tienes ciertas situaciones que necesitan soluciones rápidas y limpias. Solo a modo de limpiar, lo que voy a hacer es simplemente eliminar estos registros de consola porque realmente son para fines de depuración. No quieres dejarlos en tu código. Porque cuando tu aplicación se hace pública o el castor podría verla y quería entrar información o información potencialmente sensible en su propio navegador, registros de consola para tu sitio web. No quieres eso. Después de que hayas depurado a Daniel, lo arreglaste y ya sabes, funciona. Siempre puedes seguir adelante y quitar tu console.logs. Eso es realmente. Entonces otra actividad de limpieza o unas cuantas actividades de limpieza, comenzando con el FID que realmente querría este defecto estuviera ahí en todo momento. Entonces lo que yo haría es también replicar esto. E incluso entonces podrías ponerlo en un método. Pero lo que haré es poner esto fuera de nuestra función de cambio de mezcla. Entonces eso significa en cuanto se cargue la página, siempre estaremos sentados esta opción. Esa es una opción. La otra opción es que simplemente lo devolvemos cuando se carga la página. Sólo tenemos la opción predeterminada aquí que dice select modelo. Pero por supuesto no tiene artículos ASP, por lo que está vacío. Esa es la única opción que estaría ahí. De cualquier manera cuando cambies, siempre ese valor antes que añada los valores provenientes de la base de datos. No, fuera de eso, otra limpieza que yo querría está en los datos iniciales del Señor. No necesito llamar a los modelos. Si los voy a estar cargando dinámicamente, entonces no necesito llamar a esta consulta cuando la página se esté cargando. Entonces esa es una consulta de lista por adelantado. Y eso sólo va a llevar a un tiempo más bajo más rápido. Hemos hecho todo eso en el Crear. Vamos a seguir adelante y cumplir con los mismos cambios en la actualización. Y entonces aquí es donde puede volverse un poco complicado de nuevo. ¿ Voy a repetir todo esto? Entonces en este momento, lo que sería, nos inclinaría a hacer es simplemente copiar esto, ponerlo en actualización y copiar esto, lo siento, este método de resultado JSON y ponerlo más en optimista. Yo estaría de acuerdo en que tal vez este método de resultados JSON necesite ser duplicado. De acuerdo, puedo aceptar eso. Pero cuando volvamos veremos la mejor manera de compartir realmente el código entre las actualizaciones y el create, tal manera que si hay necesidad de mantenimiento, una vez más, hay uno o muy pocos puntos de contacto y reduciendo así los esfuerzos de mantenimiento a largo plazo. 22. Agrega listas desplegables con JQuery: parte 2: Y estamos de vuelta. Entonces en esta lección, lo que vamos a estar haciendo es modificar nuestra actualización para poder hacer la lista desplegable en cascada. Y lo que no queremos hacer es repetir todo este código entre los dos puntos de vista porque vamos sólo muck camión. Tenemos demasiado baja la lista desplegable del modelo para repoblar cada vez cambia el valor de lista propio de la gota del micrófono. Eso se obtiene en la página Crear. Y eso también tiene que seguir para la página de actualización porque es más o menos la misma forma, lo mismo que se esperaba. Ahora el pH de actualización tiene un requisito adicional donde cuando vemos que tenemos el mic y ese valor ya se proporcionaría cuando seleccionamos un auto para actualizar o para editar, seleccionaríamos un auto. El pH o este formulario de actualización se va a cargar con todos los valores para el automóvil. Se va a cargar con un valor para el micrófono. Pero entonces esta lista desplegable por defecto va a estar vacía. Entonces recuerda que nos estamos moviendo, los artículos tendrán que cargarse dinámicamente. Y también quiero asegurarme de que esté cargada con la, sólo los modelos. Ese es nuestro relativo a cualquier micrófono que fue seleccionado. Entonces si esto era Toyota, entonces solo debería estar viendo los valores de Toyota cuando se carga la página de edición. Entonces esa es otra modificación que vamos a tener para asegurarnos de que contemos cuando escribimos nuestro código para cumplir con este script compartible. En primer lugar, vamos a tener que ponerlo en su propio expediente. Y discutimos que desde los primeros días cuando hablamos de frío para mí, el JavaScript compartible a través múltiples archivos o páginas, ¿verdad? Por lo que aquí se aplica el mismo concepto. Lo que haremos es ir a nuestro dub, dub, dub root. En nuestra carpeta JS, sólo voy a hacer clic derecho. Y voy a hacerlo, si tuviera un nuevo archivo JS, así que solo Agregar Nuevo Elemento. Y francamente, normalmente solo elijo algo aquí porque conozco la extensión de archivo que es a la vez. En lugar de tratar de encontrar exactamente el uno. Y solo puedes buscar por aquí y puedes ver JavaScript. Por lo que obtienes el archivo JavaScript. Eso está bien. Pero en última instancia lo que quieres es algo con la extensión dot js. Simplemente llamaremos a este guion de modelos en cascada. Adivina bromeando. Lo siento, permítanme obtener el script de la lista desplegable de mi modelo de cascada roja girando . Entonces estoy nombrando esto explícitamente porque quiero que quede muy claro lo que va a tener el archivo script. Script de lista desplegable del modelo en cascada. Presiona Enter, y luego generará ese archivo para nosotros. Esta última columna está vacía. Si los usas otra plantilla, solo limpia todo, altera más lejos. Lo más importante es que tiene el punto JS como extensión de archivo. Saber lo que voy a hacer es tomar todo esto, cubrirlo, y luego solo voy a pegarlo dentro de nuestros archivos GIS. Entonces eso es simplemente suficiente y saben que tenemos el archivo js. Lo que haremos en Los crea y las páginas de actualización será reemplazar la etiqueta script por el componente SRC. Simplemente dice que Script SRC es igual a una inteligencia te ayudará a llenarlo. Simplemente controlas específicamente no ves ningún aviso. Slash cascada Lista desplegable del modelo en cascada script.js. Simplemente puedes copiar eso y asegurarte de ponerlo en un lugar similar en la página de actualización. Nota, ya que la mayoría de los modos no estamos haciendo arte a Quito a la operación de actualización. Tenemos que asegurarnos de que el formulario de actualización se vea igual que el formulario de creación. Parte de eso es asegurarse que los mismos controles sean, los controles correspondientes tienen los mismos valores de ID que se ven en el formulario de creación. Una actualización asegura que la mezcla tenga ID es igual a mix. Y asegúrate de que el modelo tenga ID es igual a modelos. Acaba de hacer esas modificaciones. Y luego volvamos a saltar hacia el archivo JS y luego continuar o trabajar. Ahora algunas cosas a considerar. Uno, sí, cuando estamos creando, está bien porque lo hemos visto funcionar. Todo comienza con los valores predeterminados. Y luego cuando cambiemos la mezcla, se espera que siga adelante y Fitch los nuevos valores. Conoce el camino. Entonces no tenemos que cambiar el buffer porque ya existe en la página Crear. Las actualizaciones en realidad pueden simplemente llamar a esa misma ruta en todo el archivo JSON solicitudes u otras. Y eso debería estar bien. No tenemos que modificar ninguna de esas cosas concretas. No obstante, hay que considerar que cuando el formulario no está en blanco, como en el caso de una actualización, va a haber una ID de micrófono presente por adelantado. Con ese make ID, necesitamos asegurarnos de que rellenemos esta lista por adelantado. No podemos esperar a que el evento de cambio en una actualización tenga presentes estos valores. Eso es, esos son dos factores. Otro factor es que necesitamos asegurarnos de que el valor que fue seleccionado por el usuario al crear. El vehículo es el valor que se presenta. Entonces mientras estamos poblando todas las opciones, como si tengamos tal vez Toyota, tenemos cuatro opciones para Toyota. Sólo uno de ellos fue realmente seleccionado. Tenemos que asegurarnos de que esa sea la que les sea visible. Como hemos visto en la página de actualización, la lista desplegable siempre mostrará el valor que se seleccionó durante la creación. Entonces tenemos que asegurarnos de replicar ese tipo de lógica aquí con algunos retoques. Lo que haremos uno es tomar esta declaración de Manso ID. Voy a ponerlo por encima del alcance del evento. El evento sucede aquí, hace que no cambie la función. Esta función es nuestro evento. No voy a hacer que el ID sea global a ese byte. Entonces al hacer esta declaración en la parte superior del expediente sin aparatos ortopédicos son propiedad de ella ni nada porque nuestro alcance es realmente abierto y cercano breves que la disfunción del evento está dentro del ámbito de este cambio de evento porque el soporte se abre aquí y se cierra aquí y todo lo que está dentro de eso está dentro de su alcance. Entonces al poner este viejo conjunto de, no hay ámbitos que sean dueños de esta variable. Cada función y cada otro bit de código que escribimos pueden acceder a ella a voluntad. Así que eso está bien. Ahora que lo hemos hecho, lo que tenemos que hacer es también cumplir con este reutilizable. Por lo que en este momento está vinculado a la confianza del evento de cambio. No quiero que se llame sólo cuando hay un evento de cambio. Quería que me llamaran automáticamente cuando hay un evento de carga. Además, lo que voy a hacer es cortar esto. Y debajo del evento de cambio, voy a hacer una función personalizada, acaba de leer la función Lord. Y sólo vamos a llamarlo Lord modelos. Sólo le estoy dando un nombre. Puedes hacer lo que va a estar haciendo por nosotros. Y sólo vamos a decir Pegar. Ahora que esto está en un método, puedo llamarlo así de bien, así que puedo ver cada vez que hace que esto cambie, quiero cargar modelos antes de poder cargar modelos, sin embargo, tengo que obtener el nuevo valor de Meek ID. Así que sólo estamos retocando aquí. Recuerda que este objeto realmente se refiere a lo que haya desencadenado el evento. Ahora, esto está fuera de los eventos, así que no puede ser esto mientras estamos aquí. Entonces voy a copiar esta línea y ver cuándo se activa este evento , el valor de este control que lo activó, y luego todo lo demás puede fluir. No hay problema. No obstante, cuando es global y se está declarando después de decir manualmente consígueme el control con la mezcla de ID y consígueme los valores. Así que solo les estoy señalando en base a donde estás haciendo las mismas líneas de código, la forma en que accedas a él tendría que ser diferente. O sea, podríamos haberlo accedido así dentro del formulario mostrado, por lo que eso no sería un problema. Solo te estoy mostrando cómo puedes reutilizar la sintaxis de diferentes maneras. Entonces tenemos que acceder a ella por su nombre aquí, pero luego tenemos opciones dentro de nuestro evento click. Entonces con estas modificaciones hechas, no soy Lindsay ir más allá. Voy a ir a probar y asegurarme de que la creamos acería mientras la levantamos. Probando el Create, voy a cambiar el Toyota y sigo viendo subir Toyota, Ferrari. Entonces todo funciona en el Crear. Entonces con esos ajustes menores, tenemos rutina y toda la funcionalidad que nos habríamos quedado con la última vez. No hay problemas. Así que crear todavía funciona, limpió algunos de mis registros, especialmente aquellos con nuestros modelos financiados y así sucesivamente. Acabo de limpiar la base de datos de la misma así es volver a entrar en ella. Por lo que no, el objetivo sería que cuando hacemos clic en Editar, veamos a Ferrari acercándose. Pero lo que no estamos viendo nuestros dos modelos o el hecho de que fuera araña. Recuerda el bloque de araña Ferrari. Cuando hacemos clic en Editar, vemos por RT, vemos negro, pero no estamos viendo araña, no estamos viendo ningún valor aquí. Entonces necesitamos que eso suceda automáticamente. Por supuesto, cuando haga el evento de cambio, sucederá, pero no queremos tener que esperar en el cambio de n para que eso suceda. Modificemos el código en consecuencia. Y lo que vamos a hacer es llamar a Lord modelos. En arranques. En cuanto se carga el script, queremos cargar los modelos automáticamente entrar en uno, obtener el ID de Mecca. Entonces es automáticamente cuando se carga la página de edición, este script obtendrá el valor aquí. Entonces cargar modelos dirían, seguir adelante y cumplir con el JSON llamado política en la idea de Micaías y conseguir las opciones. Muy bien, así que déjame sólo distancia ver si eso marcó la diferencia. Acabamos de actualizar la página. Y si miras déjame simplemente refrescar de nuevo, construyendo esos refrescarse correctamente. Así que sólo estoy refrescante para Ari cargado y si miras, verás araña en la lista. Exister. De igual manera para el Toyota, si solo hago clic en editar mientras dice select modelo, sí tiene todos ellos en la lista. Entonces al menos esa parte está funcionando. No, necesitábamos asegurarnos de que estemos seleccionando la correcta al cargar la lista desplegable. Aquí hay una forma genial de que podemos pasar el valor que viene a través de nuestra vinculación y desde el lado del servicio a nuestro script del lado del cliente y luego usarlo para informar nuestra decisión. En esta etiqueta de script, podemos pasar parámetros de valor aquí mismo. Voy a decir que el ID del módulo es igual a. Y luego entre comillas salida para añadir signo, modelo dot auto dot auto modelo ID. Aquí mismo. Acabo de pasar por encima de nuestro parámetro cuando llamas a este script, cumple con este valor disponible para él. Y así es como se debe llamar. Agradable y genial. Entonces el al letrero una vez más, se utiliza como parte de la sintaxis Razor en cualquier momento que lo veas, Así es como podemos acceder a C-Sharp. Se puede usar eso al firmar y si las declaraciones aquí para sueltas, sea lo lo hemos visto múltiples lugares, pero así es como realmente podemos usarlo para nuestra propia ventaja. Queremos que sean los valores allí y lo estamos mezclando con la sintaxis estándar de JavaScript. Conocer el propio archivo JavaScript. Lo que puedo hacer es decir que el ID del modelo vd es igual al documento es una palabra clave estática que representa este documento en el que estoy, o el documento, que significa la página. Lo que siempre decimos document.ready cuando queremos inicializar nuestro JavaScript o jQuery, más bien, documentar dot script actual y obtener atributos. Entonces los atributos representarían este parámetro. llamamos por su nombre. Entonces estamos viendo ese atributo y estamos almacenando cualquier valor que fuera posible con ese atributo dentro del ID del modelo. Entonces debajo de la opción, fui a introducir una declaración if que dice si el valor dot ID. Así que recuerda que cuando estamos recibiendo todos los autos como los datos o de la llamada JSON. Esto ejecuta la consulta contra el Manso ID y luego devuelve todo en forma de los datos esféricos llamados. Entonces estamos iterando a través de datos y viendo darme cada par clave y valor. Clave sería el nombre y devalúa lo que realmente queremos. Crea una variable de opción que representa una etiqueta de opción HTML con el valor de atributo almacenado en el ID de punto valle. Y toma eso está presentando el nombre que vino con ese par clave de valor. Entonces estoy viendo si el ID de la opción actual que estás construyendo, si la idea del núcleo invitado que estás evaluando u otra parte es el ID del modelo. Entonces esa opción, agrega una propiedad, dale el nombre seleccionado y elige. Entonces prop, un ATTR o atributo puede verse muy similar. De alguna manera hacen lo mismo, pero solo te estoy mostrando diferentes formas en las que puedes escribir código similar. Aquí. Solo digo opción esa propiedad, Añadir Seleccionado true. Después seguimos adelante y lo anexamos. Con esos cambios realizados. Sólo voy a guardar todo y luego podremos volver a saltar a nuestra edición y vamos a identificar, actualizarlo, refrescarse y trabajar asientos. Fui a volver a List Toyota Supra. Cuando hago clic en Editar, super se carga automáticamente aunque la lista esté llena, supra es la que se selecciona. Si vuelvo por nuestra araña es tan dentro del, muéstrame araña. Por lo que se fue Fichte todos los modelos desde el JavaScript y luego los evaluó y vio que, que uno mucho el que fue seleccionado. Si acabo de hacer un elemento inspeccionar, ve en esa opción, seve en esa opción,tiene el valor comprado la propiedad se estableció para seleccionarla, así que por eso flotó hasta la cima. De acuerdo, entonces eso es básicamente todo lo que necesitamos hacer para nuestra lista desplegable en cascada funcione tanto para la creación como para la actualización en general, ese es el concepto detrás, supongo que dejarse caer en su en cualquier momento que estés utilizando un sistema donde seleccionas una opción y esa opción influye el resto de la forma o en el resto de las opciones. Esto es todo lo que están haciendo. Lo están haciendo es mirar para ver. ¿ Cambiaste el valor en esta lista desplegable? Éfeso lleva todos estos comandos. Estos comandos podrían estar ocultando partes, ocultando elementos de la forma. En nuestro caso, estamos reorganizando completamente los elementos de otra parte de la forma. Sea lo que sea que necesites hacer. Está justo aquí a tu alcance. Estas cosas están ahí, canada difícil de memorizar y si no lo usas mucho, posible que no necesariamente lo tengas en fuego rápido y rápido. Recordemos cada vez que necesites hacer algo que sea pero la realidad es que una vez que entiendas el concepto de JavaScript completo te puede ayudar a conocer páginas web dinámicas y sostener pueden traer hacia fruition su idea o una visión para una página o un formulario o lo que sea. Solo hay que ir allí e investigar HomeAway, hacer esto y descomponerlo en tareas más pequeñas. Sí, fue una gran tarea. Pensar en todo lo que se cayó sobre esto va a cambiar los riesgos de la misma. Pero podríamos detallar fácilmente y decir, de acuerdo, ¿cuáles son los escenarios que necesitamos tener en cuenta? ¿ A quién tengo cono para ese escenario? Escenario número uno, las opciones deben estar disponibles en todo momento. Para la edición. Y cuatro para crear, ambos confían en la misma pieza de código. En lugar de escribir estos dos lugares, acabo de ponerlo en un método y llamar al método dos lugares. Entonces algo cambia un agujero de perno vamos a formular o opciones o así sucesivamente donde solo tienes que conocer al Chines uno, por favor. Entonces estas son cosas que solo con práctica y exposición, se volverá natural y de segunda naturaleza para ti. 23. Arreglar pantallas de etiquetas: Muy bien, entonces nos estamos acercando al final de las partes básicas de la aplicación. Hemos configurado un crudo, hemos hecho algunas cosas geniales de JavaScript. No, realmente se trata de embellecer la aplicación. El primer embellecimiento portátil esta aplicación para mí sería fijar las etiquetas. Por lo que tipo de poner en algún esfuerzo para asegurarnos de que estas etiquetas estén colocadas correctamente en la lista de autos. Pero entonces si nos fijamos en modelos mixtos, los colores harán es sólo mostrar el nombre del micrófono. Y luego si miras a otros están viendo fecha creada así como en los colores. Entonces querría probablemente arreglar esto, hacerlo espaciado y más legible por humanos, o simplemente eliminarlo porque no creo que sean usuarios realmente necesitan saber en este momento cuando fue creado. fecha creada es más para una auditoría del sistema que para el consumo de usuarios. Podemos pasar y ocultar algunos de estos. Otra cosa que me gustaría priorizar sería en los foros para que Alice cree coche. Estábamos viendo que estamos viendo hacer IID de modelo de coche IID, identificador de llamadas. Ahora recuerda que estos valores de ID son más para este sistema luego para el usuario. Entonces el usuario va a venir aquí y preguntarse, qué hace eso ID, pero luego están viendo nombres. En cambio las etiquetas deben ver ver mansos o algo de color modelo de coche. En lugar de Manso ID, ese número de matrícula, eso para mí debería ser un poco más legible por humanos. Creo que sería bueno poner en alguna validación para asegurarse de que no hay dos vehículos obtener el mismo número dividido de licencia. Creo que eso es detrimento de la calidad de los datos. Tan pequeñas cosas como esa constituirían la actividad de limpieza. Empecemos con nuestras interfaces para el modelo y el color que han creado las escrituras. Eso es simplemente suficiente. Podemos simplemente saltar por encima a esas páginas son esas Es páginas. Entonces para el modelo, saltaré a la página de índice y acabaré quitar la columna que muestra la fecha creada. Voy a quitar esas dos columnas. Ir a hacer lo mismo por el índice de colores, eliminarlo creado, y eliminar. Eso. Se ve bien hasta ahora para mí. En ese punto esa actividad es buena y todo para el crear autos y actualizar o cuatro formularios para los autos donde teníamos una identificación de modelo. Ves aquí que dice Lear SP Sir etiqueta, ESP dash para auto modelo ID. Muy bien, entonces ya miramos cómo podemos cambiar el nombre para mostrar para el índice donde es un nombre para mostrar. Y dijimos que el nombre es encuestador mostrar como la palabra modelo en lugar de su nombre por defecto, nombre. Eso es simplemente suficiente. Todo lo que tenemos que hacer es en todas partes habríamos tenido ese valor de ID. Simplemente hacemos saber que se supone que me ve. Aquí cuando estamos creando el modelo, habríamos tenido la lista desplegable para el ID de micrófono, mismo principio. Simplemente le damos el nombre de visualización mic, para que la lista desplegable sepa LC MC en su lugar. Entonces si salto al modelo, acabo de hacer un tramposo y digo que esa es la actualización. La aplicación. Estoy corriendo sin depurar. Pero cuando voy a modelos y hago clic en Crear nuevo, ahí vamos. No está diciendo hacer en lugar de Manso ID. Entonces echemos un vistazo a los autos no se caracterizaron forma que dijo make id, identificación del modelo de coche, e identificación de color. Entonces lo que quiero hacer es ir a la clase de autos y sobre Manso ID, fui a ver tu nombre para mostrar es igual a MC. Para el color su nombre para mostrar es igual al color. Para la identificación del modelo de automóvil, su nombre para mostrar es modelo de automóvil. Entonces cuando guardo todo eso y vuelvo, se va a refrescar automáticamente y ya ves todo ahora se ve un poco más legible por humanos número de matrícula. Voy a darle un nombre para mostrar. Y ese nombre para mostrar va a decir espacio de licencia número de espacio dividido. Aquí. Si quisiera que fuera un poco más sofisticado que solo año, pude ver que su nombre display se fabrica aquí. Solo te estoy mostrando que cuando ves estas lindas interfaces limpias, esto es todo lo que están haciendo en segundo plano. Dotnet hace que sea tan fácil para ti cumplir con estos cambios en el fondo y tenerlo fabricando aquí. Hace que sea mucho más fácil para ti ser consistente a través tu interfaz de usuario con sus etiquetas y cómo se ve todo. Entonces eso es realmente todo para esta actividad en particular. La siguiente actividad importante para mí sería tipo de cambiar los botones o tener la consistencia con nuestros botones. Por lo que pasamos por esa revisión mayor con tarjetas donde configuramos estos bonitos botones de aspecto limpio para la creación, nueva, para la edición, para nuestra Crear, o un buck para listar para la página de edición, guardar o un buck para enumerar para los detalles, idiotas o un buck para enumerar, tenemos todos esos. Pero luego presentamos otras páginas que nos traerán de vuelta a las cosas por defecto. ¿ Qué pasa si realmente quisiéramos cambiar, sostener estos look, o más bien es bastante fácil cambiar o se ven porque lo hemos hecho. Vemos aferrarse a cambiar cómo se ven. Pero lo que tenemos que hacer es asegurarnos de que todos sean consistentes. La consistencia es clave. En diseño web. Quieres asegurarte de que todas tus páginas tengan ese tema común detrás de ellas. Lo que vamos a hacer es mirar todo el fin de semana estos botones y poner en foros más reutilizables. Porque si tuviera lo que sí tengo 1234 lugares diferentes con botón Crear. Por lo que tengo un botón Crear en la lista de autos, uno para estar en la lista de modelos mixtos y colores. Pero entonces y si quisiera cambiar el diseño general de un signo más a otra cosa o algo o en el botón, tendría cuatro lugares diferentes para cumplir con ese cambio. Cuando volvamos, veremos cómo podemos tipo de abstracto que es Alt y usar won templado en todas las páginas. 24. Clean la interfaz de usuario: La última vez que estuvimos aquí, estábamos tratando nuestras etiquetas en ninguna parte volver a limpiar los cuatro botones y el diseño general de todos nuestros pH's, las listas y cómo fluye todo. Estamos hablando de tener una plantilla general para secciones de agujeros o botones. Mira. En esta lección, estaremos viendo lo que tenemos parciales. Parcial es exactamente lo que sugiere el nombre. Es como una parte de una página. Ya estamos usando parciales porque nuestros puntos de vista, estas vistas PFAS son técnicamente parciales porque solo es parte de todo lo que se requiere para una página HTML. Y entonces lo que estamos haciendo es simplemente aleatoriamente o no aleatoriamente, lo siento, renderlos dinámicamente dentro de la sección particular del pH general que queremos. Entonces esta es nuestra página principal y aquí es donde establecemos todos los estilos globales y todo bien. Pero entonces estamos representando los parciales en base a donde estamos navegando, mostramos lo parcial para que parezca el cambio. En realidad, las páginas están cambiando cuando todo lo que realmente estamos haciendo es cambiar la sección dentro del cuerpo de renderizado. Ahora podemos traer que los conceptos no hagan un poco más a la página real. Y eso es lo que vamos a hacer para conseguir los botones de índice. En este momento, tengo completamente estudios botones de índice para la página de índice de autos. Es bastante fácil simplemente copiar. Saltar a los modelos de autos, ir a indexar, y reemplazó los botones aquí. Eso es bastante fácil. Entonces, una vez más, es bastante fácil hacer eso para cada otra página. Porque realmente y verdaderamente los botones necesitan verse iguales y nuestro enrutamiento es bastante consistente excepto el hecho de que usamos el andamio predeterminado aquí para la edición para los modelos de automóviles y todo else on donde cambiar eso para actualizar para el para la edición para los carros. En realidad voy a deshacer eso. Fue solo trayendo a casa el punto de que podrías cambiarlos. Cambiar el nombre de un archivo es bastante simple. Tendré que decir que se renombra el archivo superior, el archivo de código también se renombrará. Pero entonces otra consecuencia de eso es que me gusta seguir siendo consistente con el nombre del modelo en algún lugar para cambiar esto de modelo opiáceo para editar modelo y usar punto de control y hacer renombré refactorizar a través y a través. Y luego cualquier, cualquier ruta que hubiera llevado a actualizar que CSS HTML necesita llevar a head. Habría por defecto. Solo estaba diciendo eso para decir que si vamos a ser consistentes, necesitamos ser coherentes. No se puede nombrar una India, China, y otro es cambio y así sucesivamente. Hace que sea más difícil para ti ser realmente consistente con tu código. Vamos a estar cambiando los botones para todos los índices. Pero una vez más, no quiero copiar y pegar el código. Lo que vamos a hacer es en la carpeta compartida. Compartió el propósito de Shard es que los diferentes parciales sean accesibles a través de la aplicación. En la carpeta compartida. Sólo vamos a seguir adelante y sumar, voy a decir nuevo ítem. Y desde la escucha elegiría ver navaja. Si nos fijamos en la diferencia entre matrices de B-árboles de vista, la extensión es la misma dentro la descripción dice que hay una página viene con una página modelos. Entonces lo que hemos estado usando para conocer IRI. Entonces páginas donde llegamos a CSS HTML y el CSS HTML. No obstante, el aumento de vista sólo va a venir con el CSS HTML y eso está bien. A lo que voy a llamar a este parcial es partiales de índice de subrayado , lo siento, botones de índice. Al nombrar convención liderar con el subrayado. La consistencia es clave. Botones de índice de subrayado. Y es justo para que quede muy claro, se trata de un índice parcial de bonos, z parcial de dos tripulaciones, el subrayado líder y los fines financieros de la palabra parcial. Para que podamos seguir adelante y sumar eso. Cuando tenemos este aumento de vista, necesitamos especificar un modelo. El modelo básicamente representa cualquier dato o tipo de datos que regirá el tipo de datos que es accesible en este parcial. En nuestra facilidad de uso regular habría tenido modelo en el modelo San. Y verías que están usando algunos tipos de clase complejos. Y por eso podemos hacer algunas cosas maravillosas accediendo a los datos y manipulándolos. No obstante, todo lo que queremos en el pH son los botones de índice. Y todos los botones de índice realmente necesitan que contaran como datos dinámicos, sería el valor id que cada página tendría nuestra necesidad de generar para cada ítem. Entonces todo lo que voy a hacer es decir, diciendo modelo. Y lo estoy haciendo un entero porque estamos esperando un valor entero como el valor id. Los botones o el código que voy a usar para los botones vendrán del auto porque estos son los botones que ya hemos diseñado muy bien. Sólo voy a ir por aquí, copiarlos. Y estaba viendo que todo tiene que ser consistente. Por lo que hemos cambiado la edición, actualizamos a editar el enlace, y nos hemos asegurado de cambiar el nombre de la página también para que ya no sea actualización, no es editar que todos compartamos lo mismo archivos básicos o nombres de archivos prácticamente en todos los ámbitos. Alguien para copiar esto, póngalo en lugar de lo parcial. Entonces vas a empezar a ver líneas rojas apareciendo donde item.name DID era porque estaba viendo bien, no veo ningún elemento ni ninguna variable u objeto en el elemento con nombre Pease. No sé qué, pero recuerda que nuestro modelo es el entero que básicamente representa el ID delta del elemento. Por lo que sólo puedo decir en modelo de signo, porque el modelo sólo va a ser un entero. Esto estuvo cerca para mostrarte que cada vez que necesitas datos en tu página o un parcial, solo necesitas defender un modelo y usar tus tipos de datos a tu favor. Modelo y modelo. Editar detalles, eliminar. Todos esos están en nuestro parcial en la página que queríamos. Y fui a probarlo primero en el discurso del auto, donde queremos incluir el parcial, hay que decir en señal porque tenemos que leer algún C-sharp y vamos a esperar o ayudante HTML. Y tenemos parcial un fregadero. Así que en cualquier momento estamos usando una asíncrona, tenemos que preceder con un peso. Entonces este método toma dos parámetros o tiene varias sobrecargas que estamos usando sobre sobrecarga que va a tomar ganó el nombre de la parcial, que es botones de índice parciales. Entonces también le vamos a dar el modelo. El modelo es genérico. E puede ser cualquier cosa. No es hacer los supuestos que el modelo tiene que ser nada. Te estoy diciendo cuál es el valor que quiero pasar. Y lo averiguará cuando llegue al parcial real que está bien, el valor proporcionado es el tipo de modelo que está esperando. Si dije Interior y proporcioné una cadena, no se cargará si digo Juan tipo de valor de datos y ellos proporcionan otro valor de datos. Entonces si quiero, si digo que el modo es el tipo de datos, pero proporciono un valor de un tipo de datos diferente. No va a funcionar. Eso es solo hacerte saber es muy genérico pero lo suficientemente estricto como para saber que lo que me diste no es lo que esperaba. Hemos hecho esa modificación a la velocidad del auto. Si Control F5 y lo miro, estoy recibiendo 500 errores, así que estoy recibiendo una excepción no invitada y, ya sabes, no me alejo de las flechas. Quiero que veamos cuál es el error. En esta situación, estamos obteniendo alguna idea de dónde buscará un int, por un parcial. Por lo que estos son lugares legales se puede poner un parcial de tal manera que cuando acaba de ver que este es el nombre parcial, lo buscará en estos lugares. Está buscando en las páginas slash autos barra de índice botón parcial. No, no lo es. Los bordes de la terapia inclinan las páginas barra inclinada compartida allí y las vistas barra inclinada compartida el nombre. Sabemos con certeza que lo ponemos en páginas slash índice compartido, parcial. Pero entonces dije botón In parcial en el código, cuando llamo a los botones, ese es mi error ortográfico justo ahí. Basta con seguir adelante y modificar eso, guardar y luego volver y refrescar. Y en ninguna parte viendo dos juegos de botones. Entonces nuestro código está funcionando o parcial está funcionando. Por lo que ahora probemos aún más para que el parcial funcione. Entonces para modelos mixtos y para los colores, voy a tomar esa línea de código, una línea de código. Sólo voy a ponerlo en todos los demás índices. Entonces si ya está en autos, déjame ponerlo en el índice Para cuatro modelos, algo de madera para ponerlo en el índice, cuatro colores. Voy a ponerlo en el índice para mí. Entonces cuando guardo y controle, refresque cada uno de ellos, vas a empezar a ver aparecer estos enlaces. Cualquier cosa que no sea refrescante, es porque yo no salvé. Así que déjame volver. Ver botones nodales aquí arriba, botones nodales aquí arriba. Por lo que se ve con un esfuerzo muy mínimo, hemos esquilado estos botones. Déjame ver si todavía funcionan. Si hago clic en Editar, navega a la página de edición. Si hago clic en Detalles, navega hasta el detalle. Sp, hará eso para todos ellos porque una vez más, la consistencia es clave para la navegación. Las propiedades son las mismas en todas partes. Todos están buscando la ADA, mismo constructo o valores. Pero luego en relación con el mecanismo de enrutamiento interno a la carpeta para modelos de un automóvil y para automóviles y para cada uno de los otros. Sabe a dónde ir cuando se hace clic. Pero es un código de base. Lo que ahora puedo hacer es eliminar los predeterminados. Solo voy a pasar por cada uno de los índices y vas a ver un montón de limpios estos looks, estamos reduciendo tres líneas de código repetido. Y en el caso de las cartas, aún más carriles. Y acabo de quitar esa línea comentada. Y eso se ve mucho mejor. Conoce que todo el mundo está en la misma página con los botones. Saber antes lo habría dicho, te animan cuando estamos haciendo la otra herramienta cruda, intenta replicar toda la funcionalidad de eliminación y el botón de borrar con el click en el formulario y todo a través de todas las demás páginas. Saber si queríamos compartir este bit de código a través de las páginas, ¿qué tendríamos que hacer? Bueno, realmente no podemos compartir el formulario. No recomendaría intentar esquilar el formulario. Y definitivamente no podemos compartir el manejador, pero podemos compartir el guión. Así que sólo voy a crear un nuevo archivo JS. Nuevos elementos, lo siento, y busca JavaScript. Y este nuevo archivo JavaScript va a ser índice delete button script. Entonces podemos poner el, déjame simplemente volver al código aquí. Toda esta función, acabaré de cortar eso, colocarlo dentro del script del botón de eliminación de índice. En este punto, en realidad sí tenemos unas cuantas oportunidades disponibles para nosotros porque no dije que compartimos un formulario, pero permítanme evaluar déjame simplemente cerrar todo lo que no necesariamente se necesita en este punto. En la forma, estoy siendo muy específico cuando digo que el nombre es identificación del coche. No es necesariamente identificación de coche. Podría haberlo llamado fácilmente ID de registro. La idea de registro en este punto es un nombre mucho más genérico que solo auto. En lugar de mirar hacia adelante, solo el automóvil IBM fue a buscar un ID de registro. Y voy a decir Sit the record ID para ser igual a los identificadores de datos en el botón. Así que recuerda que todo el mundo está usando la misma plantilla de un botón. Entonces una vez que hagan clic en el botón, va a tener ese ID. Podemos usar el mismo formulario, sentarnos eso en un fin de semana, sólo tiene que enviar ese formulario de eliminación. Ahora puedo crear otro parcial. Ya ves, así que déjame, antes de crear ese parcial, Déjame ver SRC es igual a G slash index button Eliminar dot js. Sólo asegurándome de que tengamos eso. Este formulario en realidad puede entrar en un parcial porque lo estoy poniendo en un parcial porque no quiero copiar este formulario a través todas las páginas y si algo cambia con el formulario, tenemos que hacerlo todo otra vez. Entonces es mejor simplemente ponerlo en un parcial y pesado a un lugar en este año y fui a tener otra vista de la maquinilla de afeitar. Así ve a agregar nueva vista de navaja. En cuanto lo vea. Ahí vamos. Y en la partitura eliminar formulario o índice, eliminar formulario, parcial, suma, nombrarlo lo suficientemente bien como para que pueda ver el nombre más tarde y figura, oh sí, para eso fue. Este parcial no necesita tomar ningún conjunto de datos. Ni siquiera necesito darle un modelo. Siempre va a tener es este formulario de eliminación que está buscando un manejador en cualquier página en se llama delete está pasando por encima de algún registro nombrado con nombre. Llámalo un ID de registro o una variable con nombre llamada Record ID. Eso es todo esto parcial es cuatro. En la página de índice, tengo otra forma de incluir parciales, que es una forma mucho más sencilla donde acabo de decir que nombre parcial es igual y el nombre del parcial a mano. En lugar de escribirlo escaneos alternativos para el error. Acabo de hacer clic en él, presiono F2 para cambiar el nombre de copiar el nombre y pegar que está funcionando más inteligente, no más difícil. Entonces puedo tomar esta cuadra. Y mientras está en la página de índice de autos, puedo ponerlo en cualquier otra página de índice. Cuarto de usabilidad. Por lo que ahora el antebrazo está aquí y el guión está viendo el botón eliminar de nuestros botones. Así que sólo puedo seguir adelante y poner eso en cada página de índice. Muy bien. Nos estamos acercando allí se acercaban. Una vez más, estamos promoviendo código, reutilización y plantillas. Queremos poner en todo este esfuerzo por adelantado. Es posible que tardes mucho saber, pero a la larga es por una buena causa. Sepa que tenemos el Foro Eliminar y todos están viendo el ID de registro. Déjame ir al código detrás para autos, ya que aquí es donde todo empezó y luego fuimos a controlar y motor hace colapsar todo. Y luego tenemos nuestra eliminación de unpause tomando identificaciones de automóviles. En cambio, fui a ver un ID de registro porque recuerda que esto es a lo que se va a vincular el nombre. Solo estoy tomando el ID de registro y acabaré de cambiar el nombre de refactorizador a lo largo del método. Y éste está buscando el auto y luego va a intentar quitarlo y redirigir a la fama del pH. Puedo tomar este método y este método ES, nos encantó. Se repite este método a través y a través. En teoría podríamos hacer una página de resultados que tenga todos estos métodos genéricos y los recuerden. Entonces como incluso con los autos para obtener el resultado JSON, en lugar de tener que repetirlo en la creación y actualización, podría ponerlo en un manejador genérico que solo nos aseguramos de llamar a ese camino desde todas partes. Pero eso está bien. Ya sabes, si bien suena como una buena idea y suena lógico, puede haber límites a cuánto quieres hacer todo lo que eres de ingeniería utilizable. Y a veces tu contexto determinará si necesitas ir tan lejos. R-naught en este contexto, no voy a ir tan lejos con este método en particular. En cambio, voy a dejar que cada página de índice retenga su propia implementación de los borrados porque diferentes las diferentes páginas o registros pueden tener diferentes requisitos para nuestra eliminación, ¿verdad? Entonces como por ejemplo, modelos, si fuera a borrar un modelo, entonces probablemente tendría que Elite todas las cartas relacionadas con el modelo antes de poder eliminarlas modelo. La lógica dentro de esto podría ser ligeramente diferente. En esta situación, el delete aquí necesita mirar los modelos de automóviles y eliminar los modelos de automóviles. Así que cualquier cosa que esté en auto, acabaré de cambiar el nombre del modelo del auto. Eso es implementación. Ese delete está presente en la página de modelos de automóviles dondequiera que esté en los autos ya. Entonces en los colores, es el mismo principio, solo agregamos eso y el ID de registro sigue siendo el mismo. Renombro esto a color. Y estamos buscando en la tabla de colores a través y a través. Y luego hacemos lo mismo. Pero de ninguna manera menos para mí, donde cambiamos la mesa para mezclar cualquier cosa que dicho color o cualquier otra cosa que pudieras haber estado copiando y pegando todo este tiempo. mezclan narices, conoce que cada página de índice sabe que tiene el método delete buscando un ID de registro. El ID de registro viene del formulario que acabamos de poner en un parcial. Entonces cada uno de ellos estaría buscando ese formulario de eliminación y sentado ID de registro al valor. Y una vez más, el guión no es esquilado en todos los ámbitos. Entonces déjame seguir adelante y probar esto. Seleccionamos un micrófono todavía a ambos. Lista no está poblando, eso es sospechoso. Así que vamos a seguir adelante e inspeccionar elemento, mirar a la consola y luego estamos viendo esta CPRE no puede leer propiedad, obtener atributo de alma nula. Creo que ese error tiene que ver con el hecho que estamos pasando, en nuestro caso, estamos consiguiendo que el ID del modelo sea lo que sea este atributo cuando se pasa en la página de actualización. Seguro, para el ATPase, más bien, estamos pasando esos atributos, pero no lo hicimos en la página Crear. Lo que he hecho es introducir ese atributo en ese script en el Create pH donde paso en el ID del modelo es igual a 0. Eso es de muy pocas consecuencias considerando que en su momento se estaban creando uno, no se presentan datos. Entonces por eso no puedo usar auto dot auto modelo ID porque auto está vacío, no lo es. Por lo que terminaríamos con la misma excepción de conocimiento justo debajo de C lado agudo. En cambio, solo le estoy dando un valor predeterminado de 0 porque realmente no lo necesitamos. Ninguna extensión de eso va a, o una extensión de los requisitos de modificación pasa a nuestro guión. Si volvemos al guión, vamos a evaluar exactamente lo que está sucediendo. Cuando el guión se carga por primera vez, está recibiendo la atención médica que se presenta. Carga modelos, y luego obtiene el atributo, y luego realiza el JSON. Pero mira esto. Cada vez que vamos a estar cambiando la mezcla, vamos a estar llamando a los modelos de carga, que luego va a intentar obtener los atributos de nuevo y luego hacer lo mismo. Realmente no necesitamos el atributo más de una vez. Realmente solo necesitaba la primera vez que se cargaba el pH. Porque después de eso, realmente no nos importa lo que podría haber sido seleccionado. Lo que debo hacer es atrapar esto y poner este script global se está ejecutando, conseguir el micrófono, obtener el ID del modelo, luego modelos Lord. Entonces hace eso. Cuando las mezclas cambiaron, llegamos a hacer IID. Reiniciamos los modelos HTML y cargamos modelos, que hace el Fitch. Esto realmente sólo necesita arriba en una sola vez. Entonces ese es otro reflujo para que probablemente quieras considerar porque creo que este error habría roto la hoja de estilo en cascada de puerta por cada vez que se cambie el valor. Si ves esa antes que yo, entonces kudos significa que hiciste más pruebas que yo. Estos cambios realizados, vamos a saltar de nuevo a nuestra aplicación web e ir a intentar o crear para el auto de nuevo. Y luego hago Toyota, y luego veo, De acuerdo, Nissan y Ferrari hokey están en cascada hoja de estilo es Buck. Permítanme pasar a la edición y asegurarme de que las fijaciones al peor si cambio la molestia y viene para nuestra columna vertebral. Bueno. Estamos en proceso de pruebas o crudo bloque Toyota Corolla. Este es un 2001 menor que el número dividido, y acabo de agregar otros tres solo para acelerar el proceso de adición de herramientas. Voy a probar el delete. Por lo que queríamos asegurarnos de que la funcionalidad de eliminación aún funcione en nuestras velocidades de automóvil. Así que eliminar, estamos recibiendo alerta a nuestras suites, eso es bueno. Si hago clic en Ok, se borra. Eso funciona para nosotros. Eso es bueno. Ahora si voy a las otras páginas, voy a crear una prueba aquí porque dirijo las otras. Así que eso crea todavía funciona, Eso es bueno. ¿ Funciona la eliminación o mira eso? acerca la misma alerta de suite. Y si hago clic en Aceptar, es llamar a la granja de eliminación y redirigir a la página y todo perfectamente. Ahora vemos cómo podemos ponernos. Seguro que codificaremos a alguien para que elimine lo más alto de la lista de módulos que funciona. Después fui a crear un nuevo color. Todavía tenemos la escritura creada, por lo que esa es otra actividad de limpieza que habría pasado por alto donde necesitamos eliminar el campo de entrada para escritura creada en algunos de ellos. Pero tenemos la prueba y las obras de Borrar. Así como eso. Habríamos configurado algunos parciales para asegurarnos de que los botones luzcan consistentes. Para que ese mismo concepto se pueda extender hasta el botón Crear libro o Crear aquí con un signo más. A pesar de que esos se ven limpios, pero ¿y si quisiéramos que todos se vean de la misma manera? Entonces, en lugar de crearlo o cualquier enemigo en este estilo para el botón crear no es el más bit de código, pero una vez más, es cuestión de agujero. Quieres reestructurar tu aplicación tanto como sea posible. En esta situación, probablemente, probablemente solo comas clave y contenido con solo copiar y pegar el botón Crear tal vez de diferentes ideas para las diferentes mezclas Cree en las diferentes páginas. Pero en última instancia, probablemente intentaría poner eso en algo que es reutilizable, sobre todo porque éste no necesita ningún dato. Es sólo un botón o una etiqueta de anclaje que tiene ese top kill Partisi ASP, pitch dash. Dividimos por delante e hice la edición yo mismo. No quería pasarte a través de cada uno porque como dije, todo granularmente conseguir con la plantilla y los botones y compartir capacidad. Eso depende de ti en tu tolerancia para tal actividad. Yo seguí adelante y lo hice y te voy a guiar a través de él por si acaso es algo que realmente, realmente estaría interesado en hacer. Independientemente. Solo voy a cerrar todas las pestañas y podemos simplemente mirar a través del sitio compartido, creado otras adicionales. Entonces hicimos este juntos, botones de índice parciales, sabemos lo que sabemos y entendemos que pasamos en los datos como un entero y podemos acceder a esos datos a través o módulo de palabras clave. Ahora, para el botón Crear parcial ya permanecerá la etiqueta p con el botón crear. Y esto viene de la que hicimos juntos por los autos. Y luego en cada página, acabo de hacer la otra forma de hacer referencia a lo parcial, que es ver nombre parcial es igual a eso. Entonces, debido a que no hay datos que se necesiten para el botón Crear, no tengo que poner en ningún modelo ni nada por el estilo. También puedes incluir parciales como éste. Son como HTML estático. Y en términos generales, cuando necesitan datos, hay que hacerlo así. ¿ Está bien? Entonces este HTML estático buscando Target, acabo de poner eso en los modelos de autos. Pongo eso en el índice de autos dondequiera que lo necesitara. Yo solo lo pongo dondequiera que crearan. ¿ Qué fue lo que acabo de poner el parcial. Una vez que consigo si quería cambiar el diseño, solo voy y cambio el diseño un lugar y por todas partes se ve afectado. Ese es el crear. Lo hice por los detalles y todos los botones de detalles habrían tenido este div con la etiqueta ancla para ir a la página de edición. Y habría tomado el ID de ruta en forma del ID de registro. Y luego agregamos el buck al botón Lista. Es por eso que éste requirió un modelo en cualquier página de detalles que se usara parcial? Hubiera tenido que esperar. asíncrona parcial llamó parcial al botón de detalle, y luego solo paso el ID según sea necesario. Otra parte de la limpieza fue que eliminé los campos de fecha creados de los foros de creación y del índice y así sucesivamente. Entonces esa fue otra parte de la limpieza que como que hice fuera de la cámara. Pero una vez más, ser libre de ser creativo. Siéntete libre de ser creativo porque es tu aplicación, lo sabes mejor, y tus clientes son la voz que debes seguir. Entonces haz lo que creas que es correcto y puedes hacer limpiezas que, o hacer modificaciones a tu interfaz que no estoy considerando que le están haciendo a la mía. Entonces el otro habría sido los botones Editar, que son directos, estrictamente HTML. Estos serían los botones Editar al final del formulario, el que se va a guardar, el que volver a Lista. Entonces en cualquier formulario de edición, solo vería botones de edición parciales, parciales. Simplemente pon eso y recuerda que el grupo de formularios acabo de hacer todo el div, los botones y poner dentro de este parcial. Por lo que solo puedes encajar en esa parte de cualquier formulario de edición. Todos y cualquier formulario de edición pueden obtener ese parcial. Una vez más, la consistencia. Ya miramos ediciones. Tenemos índice, eliminamos y eso es todo. Esos son todos los parciales que tengo. Esos son todos los modos que hice. Y francamente, la interfaz de usuario se ve de la misma manera. Un usuario nunca sabría que en realidad hicimos todo esto en segundo plano. Todo está renderizando y funcionando como se esperaba. Hay botones en la página de detalles y nuestra eliminación funciona como sabemos, debería hacerlo. Muy bien. Acabo de notar en la página de detalles de autos que está bien. Entonces algunos DTA o no regresan. Así que vamos a arreglar eso mientras estamos aquí. Por eso estamos aquí después. Muy bien, así que vamos a saltar de nuevo a nuestro detalle de la tarjeta, escuela atrás y creo que eso tiene que ver con el hecho de que no estamos incluyendo suficientes datos en nuestra consulta aquí. Sólo voy a saltar a indexar y pedir prestado el código que hace el incluye. En lugar de escribirlo gratis desde cero. Y sólo voy a colocarlo aquí. Y ahí vamos. Entonces estamos haciendo nuestros autos, incluimos todo y luego consigue el primero o por defecto por ID. Y salva eso. Volver atrás y refrescar y conocer los detalles están mostrando algo bueno. Simplemente pinchamos y mirando botones. Y bueno, ese apareció, ¿verdad? Entonces si vamos a cualquier página, vamos a ver el mismo tipo de dinámica. Ahí están los botones, todos de la misma manera. Y eso tomó, no limpié éste. No hay problema. Por eso estamos aquí. Así que déjame saltar a los colores. Despegue la fecha creada. Muy bien. Creo que eso es todo por esta actividad. En realidad, probablemente puedas probar si te interesan los botones de crear porque ves que crean botones aquí, no te parezcas como si quisiéramos que se vean ahí está en los autos. No hice los botones de crear para los otros. Entonces si es que compras en todos los botones parciales y teniendo todo reutilizable, siéntete libre de probar ese por tu cuenta. Muy bien chicos, así que en ninguna parte al final de otro hito, hemos puesto en algunas mesas adicionales. Y está resultando ser una aplicación maravillosa. Hemos mirado más JavaScript y jQuery. Nos fijamos en cómo hacer alguna causa avanzada hotel ella. Este lado del servidor y el lado del cliente hablan entre sí mientras la aplicación está ejecutando en la que se manifestó en forma de la lista desplegable en cascada. Miramos cómo podemos compartir plantillas a través de múltiples páginas usando parciales. Hay mucho más por hacer y hay mucho más que aprender. Pero los pasos del bebé y la práctica es lo que vamos a llegar en verde. Entonces en este punto lo que vamos a estar haciendo en nuestro repositorio de GitHub, Oliver cambia todas nuestras migraciones y entidades y todos los cambios que hemos hecho con la base de datos o scripts. No se va a sumar todo a nuestro repositorio. Acabamos de poner en un buen mensaje que al menos nos da sinopsis de cuáles son los cambios. Y luego vamos a comprometernos todo y nos hundimos. Cuando eso se complete, podemos proceder al siguiente módulo. 25. Configuración de repositorios de acceso: Muy bien chicos, bienvenidos de nuevo. Por lo que ahora queremos tipo de evaluar dónde estamos en el proyecto. Establecemos algunas características para poner, eso está bien. Pero en este momento sí necesitamos asegurarnos de que vamos a estar poniendo en algunos conceptos fundacionales para que cuando extendemos nuestra aplicación, no hagamos tanto daño como tenemos el potencial de hacer si no hacemos bien la fundación. Quiero enfocarme ahora mismo en nuestro uso del B2B es contextos directamente en nuestras páginas? No, sí, funciona. Y fue diseñado por Microsoft, por el equipo Entity Framework Core para permitir inyección directa del contexto en la página. Y eso sería en lo que llamamos monitor de esculpir, significa para la vida útil de una solicitud, durante toda la vida útil de este código que se ejecuta en obtener su instancia de contexto única. Muy bien, así que cada vez que llega a esta página, se obtiene una nueva instancia y puede hacer su trabajo y luego desaparece. Artistas automáticos, abre una conexión, hace la obra y estrecha conexión. Recuerda que los costos de la base de datos son caros, por lo que querían asegurarse de que eres lo más eficiente sobre una base de datos llamada como sea posible. Y sí, han hecho un trabajo maravilloso de ello. El asunto sin embargo, es que a veces te darías cuenta de que empiezas a repetir consultas. Entonces, por ejemplo, cuando tenemos que hacer esto, déjalo caer en éste, tenemos que conseguir modelos mixtos y colores de autos más bien. Si tenemos que conseguir los mics en más de una página es áspero para repetir esta línea de código. Entonces sí, la repetición sucederá. Pero una vez más, ¿cuál es su tolerancia al riesgo o posee esta repetición? Porque tenemos que conseguir esta lista selecta dentro de la, ésta para los autos. También tenemos que hacerlo por un auto modelos. Y estamos consiguiendo los modelos, ya sea que estemos creando nuestra edición, sí tenemos que ir y yo esa misma llamada de consulta. Algo podría cambiar. ¿ Y si tuviéramos mix? Teníamos algunos de ellos que no somos demasiado activos o algunos criterios propios, cuáles queremos. Entonces podría correr el riesgo de tener que mantener. Si algo cambia con la forma que obtienes la mezcla de la base de datos, vas a tener que cumplir con más de una pulgada clave en más de una grata. Y si olvidas una de estas cosas, entonces podrías correr el riesgo de no mantenerte en aplicación tan fácilmente como podría haber sido mantenido. Hay una serie de cosas que fue que estoy recibiendo que realmente es la razón por la que la gente construye lo que llaman rapero o un repositorio alrededor las operaciones de base de datos que puedes tener 1 de referencia para operaciones generales. Y puedes tener unos específicos por mesa. Pero entonces sigue siendo 1 de mantenimiento, 1 de contacto. Por lo que es más fácil de mantener a largo plazo. Entonces para empezar esta actividad, configurar repositorio es lo que vamos a hacer en nuestra solución es agregar otro archivo en otros proyectos u otros, y va a ser una biblioteca de clases. Tengo las mías en mis plantillas recientes donde siempre puedes buscar plantillas y queremos una biblioteca de clases C-Sharp. Haces clic en ese clic en Siguiente, y luego lo vamos a estar llamando carbo King up dot repositorios. Entonces pegué a Next y queremos que sea, podemos dejarlo como a.net cinco, eso está bien. Y crear. Una vez que tengamos este nuevo proyecto, podemos empezar a diseccionarlo configurando algunas carpetas nuevas. Acabo de borrar el archivo predeterminado que venía con él. Y la primera carpeta va a ser contratos. Y el otro sería Repositorio. Pausa los tories. Técnicamente hablando, lo que queremos hacer aquí es seguir el concepto de segregación de interfaz. Ese es el yo en sólido. Sigo hablando de sólido. Es un acrónimo con viejo diciéndote todas las letras que las he estado rompiendo no lo hacen. Y cada vez que estamos implementando uno de ellos, sí te apunto hacia la derecha. Entonces hemos mirado la separación de preocupaciones, que es la S. Hemos mirado la inyección de dependencia, que es la D, ninguna parte mirando al ojo, que es la segregación de interfaz. Entonces por eso tenemos contratos y tenemos repositorios. El concepto de contrato de proveedor es que eres, estás firmando un contrato para hacer algún trabajo. Aún no has hecho el trabajo. No obstante, el contrato es esa declaración de que vas a estar haciendo el trabajo y esto es lo que vas a estar haciendo. En ese punto, vamos a llamar a esas interfaces porque la interfaz tiene las declaraciones de lo que es posible, esa será la redacción en el contrato. Entonces el repositorio real, o lo que llamaremos la implementación, heredará. El contrato o la interfaz y ser el trabajo real. Por lo que habrías firmado el contrato. El contrato es un dictado de lo que vas a hacer. Pero luego más tarde lo estás haciendo y lo estás haciendo por la guía del contrato. Entonces esa es una especie de esperanza que la analogía tuviera sentido para ti, pero te verás exactamente a lo que me refiero ya que esto llega a buen término. Primero empecemos con la creación de una interfaz en esta carpeta Contracts. Y entonces vamos a llamar, va a ser lo que estoy usando la clase aquí, pero realmente sólo vamos a llamarlo yo repositorios genéricos. Así que nombrar convención sabio, cada vez que tenga una interfaz, generalmente se pone en un capital I y luego lo que sea que se va a llamar, Viendo la IA un repositorio genérico. Y esto va a ser una interfaz pública, no una interfaz pública de clase. Este repositorio genérico va a tener las funciones base que cada tabla de base de datos dondequiera que lleve a cabo. Hemos visto que podemos agregar, eliminar, eliminar, editar y actualizar, básicamente usando o repositorio o usando el contexto de la base de datos. Entonces esas son las mismas operaciones que debemos permitir nuestro repositorio genérico eucariota, excepto que vamos a estar escribiendo el código una vez que fui al complejo contable genérico es que nosotros lo estás escribiendo para que pueda suceder contra cualquier mesa que se pase. Por lo que ahora vamos a entrar en lo que llamaremos genéricos en c-sharp. Para hacer algo genérico, lo que haces es usar ese tipo de corchetes. Entonces esos son los corchetes angulares o el mayor que y distanciamiento. Y luego dentro de esos paréntesis vas a darle alguna ficha. Así que sólo lo estoy llamando , por favor síguelo. Por lo que este sería tu genérico Tolkien. Hablar generalmente usando personas usadas como t o t modelo o entidad T, alcohol, las entidades T. Entonces el TI simplemente significa que es un genérico. ¿ Qué es genérico? Cuál es el tipo genérico que espero es algo de tipo entidad. Entonces veré una entidad donde t he estado diciendo dame el repositorio genérico y es relativo a algún genérico llamado la entidad. Y luego fui a especificar dónde está la entidad T. Podría decir clase, podría decir int, sea cual sea el tipo de datos que especifique aquí. Básicamente se está diciendo que esto es genérico en la medida en que coincide con este tipo de datos que estoy buscando. Si digo clase, eso significa equidad literalmente pasar cualquier clase en que no necesariamente es lo que quiero hacer. En lugar de decir clase, veré objeto de dominio base. O lo es, recuerda solo por camiones. Recuerda que tenemos más bien la entidad base. Lo siento, dije objeto. Debe basarse en una entidad. Ahí vamos. Déjame una entidad. Toda entidad que se encuentra en nuestra base de datos debe por lo menos ser la entidad de dominio de la bestia. De esa manera. Nos aseguramos de que siempre vamos a estar consiguiendo algo que en realidad sea una entidad de base de datos. No quiero ninguna otra clase a menos que sea una base de datos entidades. Entonces eso es lo que estoy especificando aquí. Líneas rojas porque no tengo ninguna referencia a este proyecto. Entonces, ¿recuerdas cuando estamos sentados con Bridget, dónde agregar una referencia al proyecto de datos? Bueno, hay repositorios institucionales los cuales van a tener una dependencia del proyecto de datos. Por lo que necesito añadir esa referencia. Simplemente puedo agregar referencia y se agregará la declaración de uso para mí y todo. Y entonces esa línea roja desaparece. Muy bien, luce bien. A continuación, queremos tener los métodos que sabemos que vamos a necesitar. Una vez más, esta es la interfaz o simplemente el contrato. Entonces esto es sólo una declaración de lo que es posible. No es el código real. El primero que vamos a tener es que sólo vamos a estar usando mis terminologías asíncronas. Entonces es una tarea que estará devolviendo una lista. Fui a llamarlo éste, conseguir todo. Queremos conseguir todo en la base de datos que vemos, conseguir todo. No hay problema. No creo que tenga que hacer nada más con éste. Simplemente dejémoslo en eso si necesitamos ampliarlo más tarde y fin de semana lo hizo en absoluto, lo siento, esto debería estar devolviendo una lista de entidad tipo T. Entonces lo que sea, sea lo que sea, lo pasamos como un objeto de dominio base a la entidad T, entonces este método devolverá dinámicamente lo que T NTT esté obteniendo todo. Entonces el siguiente básico será conseguir, uno, va a querer un registro fue a decir int id Así que queremos llegar a un registro por ID. Y luego voy a seguir adelante y llenar el resto de ellos para que puedas hacer una pausa, replicar eso. Pero en última instancia solo queremos agregar otra tarea con devolver un booleano para decir que el registro existe y pasamos en el ID. Queremos que algo inserte entidad T, algo que eliminar cuando se obtiene el ID. Y no lo sé, no quiero actualizar cuando tenga entidad D. Esos son los métodos generales que esperamos llevar a cabo contra cada mesa. Una vez más, este es el genérico. Próximo paso. Necesitamos configurar una clase que vaya a implementar este comportamiento genérico. Dentro de la carpeta de repositorios. Voy a agregar una nueva clase esta vez, y se va a llamar repositorio genérico. Entonces adelante y agrega eso. Y luego este repositorio genérico de clase pública. Y tiene que ser genérico también. Entonces es relativo a In NTT. Lo pone en arte que corchetes entidad y hereda del repositorio genérico. Muy bien, así que recuerda que una vez más tenemos el contrato y luego tenemos la implementación. Firmamos que este es el trabajo que vamos a estar haciendo. No se inicia ningún trabajo. Esta es la herencia donde estamos viendo, vale. Sea lo que sea que el contrato dicho tendría que hacer. Necesito seguir adelante y hacerlo. La herencia I repositorio genérico. Y luego solo seguimos adelante y controlamos punto a los usos. Vamos a tener que por supuesto especificar que esto es genérico a t entidad donde t y t es de tipo dominio BCE no es decir entidad. Similar a lo que acabamos de hacer excepto solo un poco más de ley de matices porque se ven al de colon es la herencia inicial y delta uno es sólo la misma decoración que tenemos que hacer sólo para asegurarse de que todo el mundo lo sepa. Básicamente significa entidad es lo que debe representar la entidad. Entonces la razón por la que podemos usar base, permítanme una entidad una vez más es que está siendo utilizada por todas las entidades. Así que técnicamente, mientras que cada entidad su propio tipo de datos en su base, realmente son el mismo tipo de datos en forma de entidades de dominio de abejas. Entonces esto es como un identificador único para cualquier cosa que sea una entidad aquí, añada una nueva clase mañana que sea una entidad. Simplemente conviértalo en la entidad heredada de b asumiendo, y automáticamente todos comparten la misma identidad. Ahora esta línea roja aquí va a ser porque está diciendo que necesito implementar. Entonces, una vez que tengas una interfaz que tiene métodos ahí, necesitas implementar. Por lo que firma el contrato y todo lo que necesitas para empezar a hacer el trabajo. Sólo tengo que hacer Puntos de control. Y dice implementar interfaz, presione Enter y mire eso. Acaba de generar cada método stub relativo a las declaraciones y hecho aquí. Si hago algún cambio en lugar del contrato, entonces necesito asegurarme de que cumpla con el cambio relativo aquí en la implementación. Antes de empezar con nuestras implementaciones, lo que tenemos que hacer es inyectar. Entonces si necesito una conexión a la base de datos, necesito hacer algo parecido a lo que habíamos estado haciendo en nuestras páginas donde nos la inyección puerta de nuestro contexto y todo eso se generó para nosotros. Explicé lo que estaba haciendo, pero esta vez se generó para nosotros. No hay izquierda y derecha genéricos para decirnos a nosotros mismos. Así que empecemos en ese nulo. Para empezar, solo puedes escribir un CT O presionar Tab dos veces. Usted consigue su camino, usted llama al constructor. Entonces necesito inyectar en una copia de mi auto reservando hasta el contexto DB. Sólo voy a decir que reserva auto arriba el contexto DB. Y esto está dentro del parámetro fuera del constructor. Sólo voy a llamarlo contexto. Muy bien, estamos acostumbrados a la palabra contexto. No cambiaré el nombre aquí. Entonces acabo de hacer Conducto de control. Y puedo ver crea un campo de asignación contextos aunque cuando hago eso, ves que se ve de la misma manera que se veía en nuestras páginas. De hecho legible privado, es solo que puedes quitarte el exceso, sea lo que sea. De acuerdo, si estás usando el vapor de Visual Studio y las necesidades están de acuerdo, deja que eso significa que en realidad es opcional porque ya tienes el espacio de nombres. Eso es todo lo que realmente está sucediendo allí, pero es lo mismo, carbocación, un contexto, contexto y luego lo inicializa. Ahora nota que utiliza un subrayado aquí, pero no nos dio un subrayado en general. Y así personalmente, prefiero usar el subrayado porque me gusta ver los campos diferentes de las otras variables regulares o propiedades a través de eso en la partitura, tiendo a usar subrayados. Yo lo reemplazaré aquí. Punto de control. Y hagamos el refactorizador de Visual Studio a cualquier otro lugar es igual a ser utilizado. Esa es la única razón por la que verás el subrayado y nazis en la plaza de los de un mes para ti. No tienes que hacer esa es mi convicción personal realmente. Echemos un vistazo a otra línea donde tenemos que inicializar la DB sit. Tan privado, de sólo lectura. Así que los campos de solo lectura, disruptivos como el nombre es, un campo de solo lectura significa que una vez que establezcas algo como no lideramos solo se puede establecer dentro del constructor y en ningún otro lugar. Una vez que se llama a este archivo, se llama a discutir, se llama al constructor. Estos campos de solo lectura se inicializarán y luego no se pueden cambiar después. Entonces si escribes código, lo cambias inadvertidamente, solo te daría un error durante el tiempo de ejecución que T está tratando de hacer algo que es ilegal. Es posible que el compilador no te lo diga, pero la aplicación definitivamente se estrellará porque no es posible. Hacemos un DB privado de solo lectura sentarse en relación con la entidad t0. Entonces recuerda que la entidad D representa la entidad para la clase, para la base de datos más bien, y solo vamos a llamar a eso un dB. Por lo que el conducto de control. Y estoy agregando la declaración de uso para problema Entity Framework Core. Y luego en lugar del constructor, el único lugar en el que puedo establecer el valor, voy a inicializar esto a C. B B es igual al punto de contexto. Y podemos llamar a este método llamado sit. Sit crea un conjunto de base de datos relativo a la entidad t0, no hay problema. Set. Y T entidad. Estoy recuperando la base, la conexión. Entonces esta es la conexión a todo el contexto de la base de datos. Y luego dB sería la conexión a la tabla específica relativa a cualquier tabla que esté solicitando una acción en contra. Eso. Así es como todo se conecta. Así que empecemos a implementar estos y esto no tomará demasiado tiempo porque generalmente estamos familiarizados con el código que hay que llevar o rasgar en la eliminación. Veamos la operación de eliminación que habríamos implementado en nuestras páginas. Recuerda que tenemos algunas páginas de borrar. Alguna vez podrías moverlos si quisieras. Pero habíamos hecho nuestra propia eliminación en el índice de todos modos. ¿ Y qué hizo? En primer lugar, lo telefoneó y luego se aseguró de que no fuera nulo y luego lo eliminó. Eso es lo que el delete generalmente tiene que hacer una prueba para encontrar el registro y luego dice que elimine el registro. Entonces es lo mismo en esta implementación. En primer lugar, diremos var entidad es igual a, podemos ver punto bajo DB. Ahora db dot significa la tabla exacta en la que estoy. Y usted nota que tenemos todos los métodos disponibles para nosotros. Entonces diremos encontrar y solo usaremos un Para asíncrono donde configuran esto como nuestra tarea. No hay problema. Entonces encuentra asíncrono por ID. Entonces decimos subrayado DB dot, quitamos la entidad. Está bien, se ve bien. Entonces en este punto se está quejando porque encontrar asíncrono, no soy una espera. Y en un momento nuestros pesos, va a empezar a quejarse de nuevo. Déjame poner eso ocurrió, por favor. Variable ese peso. Y va a empezar a completarse de nuevo debido a que el método no es asíncrono segundo punto de Control de Enfermedades y lo convierte en AC para mí. Eso es un hueso y unos pocos para ir. El siguiente arriba es existe. Lo que existe parecía, creo que en la edición teníamos que hacer algo con un existe donde dicho retorno contextos salpican la tabla con esa condición. No hay problema. Así que en realidad solo voy a copiar este código y podemos cambiarlo para arriba solo para ver por qué se ve ligeramente diferente. Entonces sí, vamos a volver. No estamos devolviendo el contexto dot nada esta vez. En cambio estamos devolviendo bajo DB porque eso representa la salida, la tabla específica esta vez, lo que entonces significa que no necesito esos modelos de autos porque realmente no lo sé en qué tabla estoy hasta que golpea esta implementación e inicializa la BBC hizo el supuesto de que se trata de contextos, no modelos de autos, puede ser cualquier cosa. Entonces DB representará que cualquier cosa. Pero entonces cualquiera sigue siendo el método que necesito usar. De hecho, no hay ningún asíncrono. Ahí vamos. Y luego mira la condición. Cualquier aciando esto necesita esperar y luego Controlar puntos para conocerlos a flote asíncrono, y todos están contentos. Muy bien, reuniéndose agradable y decir Ve cómo se ve muy parecido el código. Pero entonces una vez más, es genérico porque aquí definitivamente está buscando modelos de autos. Y tal vez no necesariamente sepamos con qué entidad a dónde se trata en su momento. Continuemos con nuestra implementación para que podamos hacer y llegar a ser relativamente simples. Todo lo que tenemos que hacer aquí es decir var entidad es igual a o, se encuentra un fregadero. Lo que estoy recibiendo algunos errores aquí. Uno, porque esto es un error mortal. Esto no debería estar regresando, al menos conseguir que todos devuelvan la lista te hace que solo devuelvas uno que no es problema. Tener que cumplir con el cambio tanto en la interfaz como en la implementación. Así que get no debería tener lista ahí, solo debería devolver la tarea T entidad. Muy bien. Entonces solo podemos modificar eso aquí. Porque si subimos, vemos que esta quejándose estacional porque las dos paradas del método no se parecen cuando hice esa corrección, ya no es quejarse. Muy bien, siguiente arriba, control punto para hacer el método asíncrono. Y entonces todo el mundo debería ser feliz. Pero esto está diciendo que no todos los caminos devuelven un valor. Por lo que en realidad podría simplemente cambiar la frase, digamos retorno. Sí, ahí vamos. A continuación, tenemos algo parecido para que consiga todo. Así que sólo voy a decir volver. En lugar de db.find a sink, sería db dot para enumerar una sincronización, una vez más, asíncrona, pero las inclusiones, inserción y actualización de McCoy tendrán código similar. Insertar, solo estamos diciendo dB en asíncrono y estamos agregando la entidad que se pasará y viendo así usa tu oh, espera, hice el método Async y aire vacío. No están devolviendo nada como sólo una tarea. Esta es nula. Por lo que no hay métodos asincrónicos de actualización real. Y eso es por toda la concurrencia o potencial concurrencia que habíamos discutido en los primeros días. Porque no quieres arriesgarte a actualizar las operaciones en el mismo registro, en el mismo hilo o en diferentes subprocesos más bien. Por lo que la programación asíncrona creará un hilo diferente. Es por eso que puedes tener múltiples operaciones de anuncios, múltiples operaciones de recuperación al suceder simultáneamente, pero luego una actualización es un poco delete es un poco arriesgada. Notarías que estas dos no son necesariamente películas asíncronas, no las asíncronas. Y no hay nada asíncrono, el doble del apego aquí. Esas tienen que suceder uno a la vez, garantizar la consistencia. Por lo que ahora tenemos todo nuestro repositorio, repositorio genérico creado. Sólo voy a hacer una construcción Control Shift y B solo para asegurarme de que todo esté construyendo correctamente. Ahí vamos. No, no voy a ir más allá. Creo que esas son mucha inflamación para absorber. Por lo que solo puedes revisar todo y ver cómo todos estos puntos se conectan entre sí y cómo todo está empatado. Lo último que voy a hacer, sin embargo, es agregar una referencia para nuestro nuevo proyecto a nuestro proyecto de búsqueda de carburadores. Eso va a tener que reorganizar las dependencias porque voy a agregar un proyecto o herramienta de un amigo, repositorios uno. ¿ De acuerdo? Y entonces lo que pasa es que los repositorios se han referenciado a los proyectos de datos. Entonces si elimino la referencia de datos y luego hago una compilación, entonces vemos que seguirá teniendo éxito. Entonces en este punto, no necesitamos una referencia directa de nuestra aplicación web a nuestro proyecto de entidad porque está hablando con los repositorios. Los repositorios tendrán esa herramienta de referencia director, esos datos. Y luego el proyecto de datos tiene las referencias de terceros a Entity Framework, Core y tal y así sucesivamente. Por lo que la jerarquía sigue intacta. Si miras, verás que ninguna de nuestras cuotas está realmente rota. Pero en última instancia lo que queremos hacer es no tener este contexto DB directamente inyectado en nuestras páginas. Cuando volvamos vamos a estar reflejando nuestro código de tal manera que será uno ni un barco y registrar el repositorio que hemos creado. Y luego intercambiaremos el código para usar el repositorio. Y luego para operaciones más complejas que las que requieren incluyen en algunos de los campos y así sucesivamente. Vamos a mirar todo. Necesitamos modificar nuestro repositorio en nuestro código para facilitar esas situaciones especializadas. 26. Agrega el primer de repositorio: Chicos, bienvenidos de vuelta. Entonces lo que acabamos de lograr fue configurar un pequeño envoltorio alrededor del contexto de la base de datos de revisión y eliminar algunas de las referencias directas antes entre nuestra aplicación web y la base de datos. Entonces hemos puesto en este oído medio, que algunas personas describirían como la capa lógica empresarial. Porque si tenemos algo especial que hacer, cualquier operación especial, no querría escribir el código innecesariamente en la aplicación web. Solo queríamos llamar a un método y luego dejar que ese método cumpla con las decisiones y haga cualquier cosa que deba hacerse que sea de naturaleza elegante por falta de un poco de expresión. Entonces eso sería lo realmente representa nuestra capa de repositorio. Saben, este Lear puede crecer. Sólo hemos obstruido muchas de las operaciones en dos expedientes en este momento. Pero hay potencial de crecimiento y verá que tendrá que extenderse en base a algunas de las operaciones que tenemos que realizar para que los repositorios estén disponibles para inyección de dependencia en nuestra aplicación web. Al igual que lo que podemos hacer con el contexto DB. Lo que tenemos que hacer es saltar hacia adelante o startup y registrarlos como servicios de esculpir. Entonces en los servicios de configuración, recuerda que lo habíamos modificado para agregar el contexto DB que tiene que quedarse. Pero lo que podemos hacer es decir servicios. Y podemos ver sumar scoped entre paréntesis. Voy a decir tipo de repositorio genérico con corchetes vacíos. Entonces le estoy haciendo saber que donde ves la interfaz, se implementa por el repositorio genérico y también con los corchetes apretados. Por lo que podrías ver código similar escrito manera diferente donde realmente dices agregar ámbito, tipo de soporte abierto y su implementación. Pero debido a que estamos usando genéricos, así es como se tiene que hacer. Y es sólo otra forma. Es básicamente el mismo tipo de código. Más tarde cuando tengamos repositorios específicos y verás el otro estilo de escribir esta línea. Pero por ahora, solo agregamos scoped. Por lo que en realidad hay algunos tipos de modelos de inyección. Modelos de inyección que significa servicios de agujeros se inyectan en su vida emoción a lo que llamamos nuestra solicitud o garganta, el tiempo de ejecución de la aplicación. Para el contexto, hemos sumado scoped. Por lo que tuvimos que sumar scoped en la escuela. Significa que para tu llevar a cabo una operación hasta que termines esa operación, usarás una instancia de esta, sea cual sea lo que nos estamos dando. En este caso, se utiliza una instancia del repositorio genérico durante el tiempo que esté realizando una operación o un conjunto de operaciones en una página. Transitorio significa que cada operación con la que vas a empezar siempre te dará una nueva. Por lo que añadir transitorio está bien si lo estás haciendo con servicio de escolta. Debido a que el contexto DB tiene alcance y el repositorio genérico se basa en el ámbito, podríamos encontrar fácilmente el repositorio ya sea transitorio o esculpir. No hay problema. El otro es singleton. Singleton, lo que significa que voy a ser una instancia para toda la aplicación. Hay momentos en los que querrías que tal vez como con un archivo de configuración, algo que nunca ha cambiado. Nunca esperaba ser dinámico. Lo haces una sola vez. No tienes que cambiar que cada vez que pasa algo o cada vez que el doctorado y el GCF para obtener una nueva instancia de la misma. Eso es más para nuestras operaciones de base y ciertos otros tipos de servicios como un servicio de correo electrónico, definitivamente querrías que eso sea transitorio porque si se necesitan enviar varios correos electrónicos una vez, quieres múltiples objetos o incienso, él está fuera de eso. Y deben cerrar en cuanto estén terminados. Se puede mezclar y combinar. No necesariamente tienes que recordarlas a todas y simplemente averiguar cuál todo el tiempo soy negro. Pero ciertos principios se pueden utilizar para averiguar cuál es el mejor para qué tipo de servicio. Y esta base de datos servicios definitivamente mejor como Sculpt. Si quisieras una pista, si pasas el cursor sobre el contexto de agregar DB, en realidad verías que te dice que tiene un alcance predeterminado. Cualquier cosa que dependa del contexto de la base de datos, solo hazlo esculpir yo, deberías estar bien. Ahora que hemos incluido nuestro repositorio genérico, veamos cómo funciona. Entonces voy a saltar a uno que sea muy sencillo. Empecemos con micrófonos. Yo en nuestra Create Page four mix, lo que voy a hacer es en lugar de inyectar el contexto DB directamente en, voy a cambiar la sal, así que solo voy a eliminar el contexto DB de la inyección. Y voy a decir que dame un repositorio genérico de para incluir referencias faltantes. Y puedo ver herramienta relativa. Sé que estoy en mezcla, tan relativa a la clase media. Entonces puedo llamarlo así. Acabo de pensarlo repositorio y luego Controlar puntos. Que se inicialice un campo creado. Entonces puedo eliminar las referencias al contexto y repositorio en el repositorio de partituras, simplemente renombraron eso. No, se renombra en ninguna parte usando repositorio en lugar del contexto. Y como era de esperar, tenemos unas flechas que aparecen bien. No, esta fue una operación de creación. Entonces eso significa en lugar de ver context dot mix dot agrégame, puedo saber ver repositorio dot insert. Y luego fue asíncrono después de nuestro peso. Esto es muy importante que no implementamos un Guardar Cambios en nuestro repositorio. Entonces recuerda que cada vez que aumentamos los datos tenemos que llamar a guardar cambios. Si saltamos por encima y solo puedo hacer Control F12 para saltar a la implementación del método. Observe que no hay cambios de guardado sucediendo en ninguna parte, ¿verdad? Entonces estamos actualizando donde insertando, estamos eliminando nuestro no ahorro. Entonces levantamos ese onenote. No hay problema. Por eso es bueno coger estas cosas de. No. Sólo voy a seguir adelante y voy a hacer ésta una tarea que devuelva un int. Y va a ser guardar cambios. Y eso lo hizo porque si los cambios por defecto generalmente devuelve un entero de todos modos, así que solo estoy representando eso. Bueno, esto es como nuestra función superior. Entonces si salto a la implementación, se quejará, Hey, método Union Avenue, por favor implemente control dot enter. No es implementado. Y entonces todo lo que realmente tenemos que hacer es devolver contexto. Por lo que hemos subrayado contextos. Pensamiento Guardar Cambios es hundir. Es asíncrono, así que tengo que esperar, por supuesto, Control dots MC método Asíncrono y eliminar el exceso de espacio. Ahí vamos. No, podemos ver si GNG no es un problema. Lo que podemos hacer es en lugar de llamar a los cambios de Guardar cada vez que llamo, hacemos el inserto aquí y luego tenemos que llamar al Guardar Cambios en una línea separada. Sabemos que estos métodos necesitan para guardar los cambios. Es bastante fácil para mí ver solo después del inserto, después, si agregas, luego adelante y llama a tu método local Save Changes. Ese es nuestro peso. Esto reducirá el número de veces que yo, verás los cambios de Guardar por toda la aplicación porque sabemos que quiere hacer un inserto, los tintes necesitan ser guardados a través todo aquí. No hay problema. Y entonces todo estaría funcionando en el mismo contexto. Entonces, no importa cuántas operaciones hagas usando la instancia del repositorio WAN, siempre guardará los cambios al final de la d. Así que vamos a esperar, ver si g y g, Así que la inserción, y lo de guardar siempre los cambios con la actualización. Y luego mira esto, uh, guardaríamos los cambios con la actualización, um, porque no es asíncrono, así que no hay problema que podamos reflexionar a medida que avanzamos. Y el delete tampoco es asíncrono, pero éste fue asíncrono porque hizo algo asíncrono. Por lo que ahora podemos sacar la actualización de ser vacío Puntos de control. Podemos hacer el método Asíncrono. Pero en lugar de hacer eso, lo que fui a hacer es modificar la interfaz y convertirla en una tarea. Simplemente dejar eliminar es una tarea, entonces eso lo haría más consistente. Por lo que sólo podemos ver la tarea asíncrona Actualización. Y entonces todo el mundo está feliz conociendo nuestros crea. No necesitamos esta línea porque una vez que hagamos el inserto, sabemos que la inserción y el ahorro de cambios ocurrirá. Eso es todo en una línea. Si necesitamos hacer un cambio a un conjunto se hacen insertos. Tenemos 1 de referencia. Si hubiera múltiples lugares en la aplicación, que hacer este tipo de operación. Y quería que en todas partes fueran consistentes. En lugar de hacer cambios de código en todos los lugares, tenemos 1 control de 121 de referencia a mí, esos cambios. Alguien que te muestre algo sin embargo. Y si Por cada vez que necesitaba salvar el cambio, recuerda que habíamos añadido hechos creados y déjame volver a la bestia. Quiero decir, entidad que habíamos dicho hecho creado. ¿ Recuerdas eso? No. No. No. No hemos hecho ninguna modificación para facilitar lo creativo ya que yo mismo lo he estado quitando de la interfaz porque lo vieron como un obstáculo. Porque realmente y verdaderamente los usuarios no deberían poder verlo ni interactuar con él. Es realmente para nuestro sistema interno. No obstante, quiero asegurarme de que cada vez que grabo estos siendo creados, desvalorizar, ¿está bien? Volviendo a lo que dije, en lugar de hacerlo en múltiples lugares y por todo lo que puedo conocer. Todo sucedió en lugar de repositorio NIH. Entonces me da un poco más de control sobre las operaciones. Dicho esto, modificemos nuestro método Save Changes para agregar más datos, manipular los datos o lo que sea que queramos hacer antes. En realidad va al contexto de la base de datos y guarda. Aquí, podemos conseguir que las entradas que son un barco se salven del contexto diciendo sólo para pagarlo. Entonces no sé cuántas cosas se van a salvar que este punto porque podríamos haber hecho múltiples operaciones, sea cual sea. Así que sólo voy a guardar para cada entrada en el punto contextual. Y luego está esta cosa llamada camionero de cambio. Por lo que esto en realidad es así Entity Framework es en realidad camiones que cuando te dieron una entidad, en realidad está viendo ¿ modificaste esta entidad? ¿ Ha cambiado algo sobre esta entidad? Por eso, ¿no haríamos la actualización? Estamos viendo adjuntar y luego cambiar los estados para modificarlo para que Entity Framework sepa que esto fue modificado. Entonces cuando veas si los cambios aquí golpean, sabrá automáticamente qué tipo de declaración generar con base en el estado de la entidad. Entonces T instructor es lo que se está utilizando como ese registro para ver este cambio. Este no hizo éste éste no cambió. Instructor es puedo decir consígueme las entradas y luego esta es una colección para que pueda usar corchetes no, para analizarlos en algo específico. Entonces cuando digo algo específico, puedo decir que me den todas las entradas. Ese es nuestro auto. Consígueme todas las entradas de modelo de auto, pero no sé qué se está salvando. Esto es genérico. Entonces en cambio voy a decir cualquier cosa que se esté guardando que sea de tipo entidad de dominio base, que podría ser cualquiera de nuestras entidades que tengamos. Ya ves, solo usar ese poquito de herencia nos permite hacer maravillosas cosas genéricas, ¿verdad? Un poco de código para servir muchas mesas y simplemente ser flexible. Estoy diciendo consígueme cada entrada que esté en la estructura de la cadena que a menudo es mejor para mí una entidad. Y entonces puedo extender esto para decir que estamos estamos sentados actualizados creados. Sólo quiero los que tienen el estado de entidad como contextos modificados estados de entrada. Puedo verlo Ahí es donde Q lambda expresión Q punto estado es equivalente. Y luego las entidades señalan que nos es dado por Entity Framework Core. Y aquí están todos los estados potenciales sin cambios, agregados, el toque modificado, eliminado. Muy bien, así que quiero que cuando se esté agregando, quiero todas las entradas que cuando se están agregando, pueda ver entrada dot Entidad. Entidad aquí es maravillosa. El genérico y los organismos basados en esta entidad de dominio. Dot que creó es igual a punto de tiempo. Entonces todo se está uniendo. Entonces una vez que hago eso, me permite no necesitar sentarme y ambos estamos sentados esa fecha creada en cada disco o cada vez. Algo es capaz de ser lo suficientemente creativo como para ir a cada crear código Bij para ver antes de enviarlo a través de McDonald creado es igual a d tiempo no, y descendientes, y sólo lo he hecho un lugar. Una vez que se crea algo, esto sucederá. Entonces se guardarán los cambios. Y se puede extender esto a la de ambas cosas porque podríamos haber tenido una fecha modificada. Por lo que se podría decir fácilmente, Tráeme donde se agregue o modifique el estado. Si se agrega el estado, el nuevo conjunto, esto si es modificarlo usted dijo que no modificó, etcétera aún vuelan. Entonces solo te estoy mostrando que esto es maravillosamente flexible. Entonces en este punto sólo voy a hacer una construcción rápida y vamos a saltar y probar nuestra mezcla y ver la diferencia, ¿verdad? No, Los únicos cambios que hemos hecho es crear Pj. Eso está bien. Así Crear Nuevo. Y voy a decir probar nuevo repositorio. Este no soy yo. Pero vamos a seguir adelante y golpear Create art. Por lo que todavía hay obras. Veamos en la base de datos y veamos qué vinieron los dioses se sientan para el periodo de fecha. Y así perforando hacia abajo a la base de datos y ya a ser la carbocación clubbed arriba. En nuestra mesa de mezclas, el registro más reciente debería tener el deet y ahí vamos. Cada otro tenía la fecha predeterminada, este problema en los datos del carrito, la marca de tiempo exacta de cuándo fue creado. Eso fue lo fácil que fue saber si cambiamos toda la cotización de crear y te voy a desafiar a que hagas eso de la misma manera que modificamos aquí el modelo Create. Para mí, te voy a desafiar a ir y hacer lo mismo por los colores, hacer lo mismo por los modelos de autos. Debería ser bastante fácil hacer lo mismo para los autos. Sí, porque el CTO lo suficientemente sencillo. Amigo que apoye todos los crea y si te sientes a la altura, adelante y haz lo mismo por la edición. Porque es más o menos lo mismo dondequiera que tuvieras contextos que la seguridad depende del contexto, el amor hacer cosas. Aquí está ese mismo adjunto con las entidades estado modificado Cmd, G, y G. Eso es todo lo que hicimos en nuestro método de actualización. Dondequiera que tengas esos, intenta cambiarlos por el código del repositorio. Entonces lo voy a hacer y cuando volvamos podremos comparar lo que se hizo. 27. Refactoring Páginas: Bienvenidos de vuelta chicos. Entonces, cuando estuvimos aquí la última vez, tuvimos una asignación donde debíamos completar otras páginas. Espero que lo hayas intentado por tu cuenta. Y si te encuentras con temas en el camino, que no sería sorprendente, no te sientas como si no estuvieras haciendo el trabajo correctamente o así sucesivamente. Hay ciertas partes de ella que necesitarán un poco más de explicación que algunas. Pero en última instancia, espero que lo hayas intentado y espero que entiendas lo que estamos tratando de lograr aquí. Lo que voy a hacer es revisar lo que hicimos la última vez. Y luego vamos a caminar por cada uno de los cambios generales. Y hay algunos cambios que requieren un poco más de código para ser escrito. Así que hagamos eso juntos. Empecemos con revisar lo que hicimos la última vez que estamos lidiando con micrófonos y hemos modificado la página Crear, ¿verdad? Entonces hicimos la inyección del repositorio en nuestra Crear página relativa a mí, eso es un repositorio genérico relativo a mic. Entonces podríamos reemplazar todo ese código elegante de conseguirlo y cambios de historia y densidad por una línea de código. Sólo el inserto. Vamos a seguir adelante. Por lo que configuré mi página de eliminación. Sabemos que no necesitamos borrar bits. En realidad solo voy a eliminar la página de eliminar ahí mismo. Y luego veamos los detalles juntos. Entonces los detalles hacemos lo mismo, hacemos nuestra inyección. Por lo que reemplazamos la inyección de contexto por la inyección genérica del repositorio. Y luego donde habríamos estado haciendo el primero o por defecto conseguir eso. Acabamos de reemplazar eso con nuestro repositorio de pesos dot obtener ID dot volume. Si me estoy moviendo demasiado rápido o aún no lo has hecho, siéntete libre de hacer una pausa y replicar a medida que voy, pero por favor asegúrate de que estás internalizando las explicaciones del código a medida que avanzo. Echemos un vistazo a la edición. Misma inyección. Estoy seguro de que empiezas a darse cuenta de nuestro tema común a través del centro comercial. No, todo lo que tenemos que hacer es inyectar nuestro repositorio relativo a qué entidad donde un barco utilizar en la página. Entonces para el on consigue esta línea básicamente él nosotros como los detalles conseguimos la misma línea. No cambié ninguno de los trimestres por defecto en los cheques. Todos ellos siguen siendo necesarios. Solo estoy reemplazando el código con respecto al contexto luego en el post, lugar de cambiar el estado para modificarlo y luego guardar los cambios, solo pongo la actualización ahí. Porque en la actualización, se va a seguir adelante y ver si g y g es de todos modos. Entonces no tenemos que preocuparnos por nada malo en eso. Todo lo que hacemos es cambiar eso para actualizar dentro de un try catch y todo debe operar de la misma manera. Otra slash gestionar el cambio habría sido con los existentes. Existe no era asíncrono, solo era privado bool make existe y se obtiene el ID. Así que lo cambié para decir, esperaré, repositorio que existe con el ID que hizo del cargador de mitos el asíncrono. Entonces, al usar el punto de control, se anexó automáticamente asíncrono al nombre del método. Ningún problema lo hizo asíncrono, no hay problema. Entonces otra cosa que tendrías que hacer es asegurarte de que llames un peso en ese método. Llama a la parte superior aquí. Los nombres y todo sería capaz de, quieres usar el IntelliSense, pero solo tienes que asegurarte de que pongas en esa línea. Esos cambios prácticamente los mismos cambios para las mismas páginas, para los colores porque esas dos páginas o estas dos entidades no tienen dependencias. Colores, lo mismo excepto que estamos inyectando nuestro repositorio listo para tener que colorear. Y luego usamos la misma línea ahí para una necesidad lateral la eliminación. Por lo que voy a quitar eso para los detalles. Tenemos lo mismo. Donde acabamos de obtener los detalles del color para la edición, tenemos la misma inyección donde obtenemos el color. Y luego más tarde actualizamos el color cuando sea necesario. El índice. Me salté el índice para el mic, también índice tanto para la Meca como para el color. Bastante simple. Participar o inyectamos o repositorios. Lista será obtener todos. No hay problema. Creo que esto debería ser mezclado. Podría haber leído eso. Si no, entonces puedes seguir adelante. Hice ese cambio. Entonces eso es hace que te consigas todo y luego ON delete, todo lo que tenemos que hacer es llamar al delete. Si Record ID es igual a saber que vamos a no telefonearnos. De lo contrario simplemente llamamos a la eliminación pasando en el ID de registro. Eso es todo lo que hay a ella. Agradable y simple y consistente. Entonces mira, no quise decir que esté escuchando los colores. No hay problema. Hagamos eso juntos una vez más. Y literalmente solo voy a copiar esta línea porque es básicamente el mismo código. Y puedo reemplazar todo esto con esa línea de código. Porque todo el mundo está siendo llamado repositorio y se puede conseguir específico si lo desea. No digo que tengas que llamarlo repositorio y todo el mundo necesita tenerlo llamado repositorio. Es posible que desee obtener específico y llamar este repositorio de color, hacer repositorio, etcétera No hay problema. Pero al final del día, el código base y la forma en que se ve, la estructura siempre va a ser consistente. Lo hemos hecho por los colores. Lo hemos hecho por mí, no hace ningún problema. Echemos un vistazo a los modelos de autos. Y también un auto modelos es un poco más complicado en que tenemos que cargar datos iniciales. Por lo que ves hice algunos de los cambios y dejé algunos desconocidos. Sólo piensa que él es aquí es donde estabas. Y si no, entonces siéntete libre una vez más también, pausa y replica lo que ves en mi pantalla. Ya hemos reemplazado el código de inserción en el método post. Es repositorio insert car model, bien, pero luego necesitamos obtener la lista de mix, lo que significa que necesito un repositorio que me pueda conseguir la mezcla. A pesar de que bajo repositorio las cárceles es relativa al modelo de automóvil no se mezcla. Aquí es donde probablemente querrías conseguir específico con el nombre del repositorio. Entonces en este caso, me gustaría llamar a este repositorio de modelos de autos y acabaré de cambiar el nombre, y simplemente copiaré, pegaré tres, usaré este nombre y renombraré en consecuencia sono. Todo el mundo sabe que se trata de un repositorio de modelos de automóviles. Por lo que el repositorio modelo de coche inserte eso. Necesito un repositorio que sea relativo a la mezcla. No hay problema. Puedo ir fácilmente aquí. Sólo voy a copiar este bit, que dices que yo repositorio genérico relativo a mí. Y fui a llamar a este repositorio de mezcla. Aquí es donde el nombrarlo específicamente entra en juego y luego Puntos de control le permiten crear un campo asignado. Y ocurre la inyección. Por supuesto que usamos nuestro subrayado. Y después de hacer todo eso, no, solo puedo saltar aquí abajo y verme x es igual a una nueva lista de selección. Espera el repositorio mix dot llegar a todos. Mira eso. Todo el mundo está feliz. Eso es todo. Para que puedas tener más de un repositorios en la misma página. Por lo que tengo un repositorio que habla con la mesa modelo de autos. Y tengo repositorio hablando para hacer supongo que lo que ambos son la misma base de código. Eso es realmente todo lo que necesitaba hacer para la creación. Por lo que tengo que repetir esa hazaña para el editor. Por supuesto que sabemos lo que hacemos es crear dos básicamente después de replicar con edit. Sólo voy a copiar y pegar como casi nunca ******. Fui a hacer esto aún más rapido. Solo voy a tomar todo esto, apareció y reemplazar todo eso en el Editar, y luego simplemente cambiar el nombre campo constructor o el nombre del constructor. Mi repositorio, ¿qué fueron los repositorios? No hay repositorio modelo de coche. Y luego repositorio de automóviles de motor de nuevo. Y entonces este sería nuestro repositorio mixto de peso. Dot consigue todo. Factoring puede ser tedioso, pero hay formas de acelerarlo cuando copia NPS, cuota similar, sabes exactamente qué cambiarlo. Veámoslo. Me tardé unos segundos en conseguir edición y crear hasta cero. Voy a quitar la página de borrar por mí. No lo necesito para los detalles. Ya cambiamos todos los detalles porque todo lo que necesitamos es un modelo de auto. Pero luego hay algo más que puede necesitar mirar, que es la grasa que el modelo de coche tiene mezcla. Por lo que necesitaríamos incluir los detalles de la mezcla en las tablas de modelos de automóviles. No creo que lo hubiéramos hecho antes. Me cambié al repositorio. Pero eso es algo que definitivamente vamos a tener que implementar para la página de detalles muestre el micrófono correctamente. Por lo que nunca modificamos la interfaz, por lo que nunca tuvimos que modificar los datos que regresaban. Realmente y verdaderamente, este debería ser CAR modelo dot dot name porque queríamos ver, y este es el modelo de auto y este es el mic. Está relacionado con ese punto. Definitivamente necesitamos modificar cómo obtenemos los datos porque nuestro Getty acaba de obtener los datos. Pero ya vimos que cuando queremos conseguir con los detalles de registros relacionados, tenemos que hacer un includes y así sucesivamente. Y no sabemos qué incluir el genérico porque no puedo comer solo incluye algo sobre la mesa porque diferentes mesas tienen diferentes propiedades que se incluyen. Así que definitivamente estamos después en algún código personalizado para un modelo de automóvil en ese escenario. Y luego por extensión, vamos a tener que extenderlo para el índice también porque cuando obtengamos la toda la página del índice, probablemente queríamos no sólo mostrar el nombre, al igual que con los detalles, probablemente querías mostrar el micrófono también. Quiero decir, eso depende de ti. Éste es probablemente opcional. No voy a extender el índice para mostrar el mic, pero tendremos que hacer eso por nuestros autos. Así que no he terminado de ver todos los autos es, y se puede ver aquí tengo algunos de ellos están mal tipos de datos. Hizo alguna refactorización, alguna refactorización global que mezcló una serie de cosas. Pero cuando miras esto, ves que estoy consiguiendo un repositorio de autos. No he cambiado mucho por el código aquí. Pero entonces tenemos el mismo tema donde necesitamos la mezcla, los colores, los modelos que sospechadamente faltaban. Sí necesitamos traer esos. Entonces eso significa que necesitaría una mezcla re-realizar o leer antes de modelos y nuestro repositorio para colores. Sí, nos deshicimos de un SEO tomando todos los contextos porque conceptualmente los contextos nunca deberían interactuar directamente con el controlador o la página. Pero luego creamos un modelo donde creamos tal delineación entre los tres tipos de datos que tenemos que inyectar tres instancias diferentes del repositorio. Como siempre se ve, hay momentos en los que haces algo porque tiene sentido, pero luego importa cuán granular necesitas conseguir en base a tus objetivos. No aguantar eso. Vamos a seguir adelante y conseguir esos repositorios adicionales. No quería aburrirte si me ves hacerlo, pero esto es básicamente lo que parece y solo voy a criar las líneas. Se puede ver dónde comienza y se detiene cada línea. Sólo di que es muy, muy claro. Simplemente seguimos adelante e inyectamos repositorio por tipo que necesitamos. Seguimos adelante e inicializamos esos campos. No, en relación con cada llamada, vamos a hacer uso de la cesta repositorio ella. Entonces aquí voy a decir subrayar al pirata. Entonces este es el repositorio de autos. Este es el Create, por lo que insertos y estamos pasando en el auto. De acuerdo, cualquier analítica que la inteligencia siempre te guíe en cuanto a ver necesidad del tipo de datos es necesaria en base al repositorio o comido. Ahí vamos adelante e insertamos nuestro auto. No escuches. Lo estamos haciendo en modelos de autos. Por lo que sabemos que se trata de un área de lista desplegable en cascada. Entonces en este punto definitivamente necesitaría algún código personalizado. Porque cuando obtenemos r consigue todo, estamos obteniendo todos los registros una vez, pero luego nos estamos basando en ID. Obtenemos uno requerido basado en el ID de clave principal aquí. Estamos haciendo ninguno de los dos estaban consiguiendo que todos los modelos de autos fueran una fila completamente diferente es igual a unos valores diferentes. Así que definitivamente necesitamos tener algún código personalizado para eso, pero aún no estamos del todo ahí. Vamos a asegurarnos de que todos nuestros métodos comunes sean iguales. Entonces para la mezcla, así que fui a ver en un repositorio mezclador de puntuación dot obtener todo. Entonces solo puedo reemplazar cada uno de estos. Simplemente copiaré y pegaré un nombre de la industria, este auto modelos. Soy uno de esos repositorio y este fue Colors. Colores. Colores. ¿ Tenemos color? ¿ Color? Déjame sólo copiar y pegar en lo insensato. Ahí es un lento. Muy bien, por lo menos estos son fijos. Ahora voy a hacer una pausa ahí mismo. Y si miras la página de detalles y miras la página de índice, y como dije, para la página de edición e incluso la Create donde tenemos las listas desplegables en cascada, tenemos que asegurarnos de que están buscando las cosas de la tarjeta en el momento actual. Entonces, cuando volvamos, veremos cómo podemos extender nuestros repositorios. 28. Repositorios completos: Muy bien chicos, así que somos buck y lo que vamos a hacer en esta lección es sentar algunos repositorios personalizados. Déjame hablar de repositorios de clientes. Hay momentos en que para ciertas entidades o ciertas operaciones, necesitamos tener código personalizado que no pueda ser genérico. Entonces caso en punto sería para nuestro crear donde tengamos nuestra lista desplegable en cascada. Definitivamente necesitamos algunos métodos personalizados aquí para facilitar el hardware mirando los modelos de automóviles en esta situación particular. Entonces eso significa que voy a tener que ampliar o modelos o modelos de automóviles para tener su propio repositorio con sus propios métodos personalizados. Otro ejemplo de por qué esto podría ser necesario sería como cuando queremos mirar los detalles o incluso la lista de los autos, tenemos que incluir estos detalles específicos para el auto al buscar en el modelo de detalles. Y cuando estamos leyendo sobre la lista en el índice, definitivamente necesitamos los Incluye también. Esas son razones para ampliar tu código. Esto es no, este no es realmente un término oficial en programación, pero lo llamo pain Driven Development. Cualquiera u otros desarrolladores con él. En Desarrollo Impulsado, lo que significa que haces lo necesario para el objetivo en cuestión. Y te pones fantasía cuando ve requerido, pero no solo empiezas los fondos porque podrías exagerar algo que es muy simple. Entonces en este punto vemos la necesidad de este refactor. Así que sigamos adelante y lo hagamos. Lo primero que vamos a hacer es volver a nuestro proyecto de repositorios. Fui a hacer clic derecho en contratos y luego voy a agregar un nuevo elemento y elemento en forma de interfaz. Este lo voy a llamar repositorio de modelos de autos. Sabemos lo que necesitamos para que sea interfaz pública I repositorio de modelos de autos. Entonces ahora, ¿qué hace este contrato? ¿ Cuál es el trabajo que este contrato necesita implementar? Bueno, fui a decir que necesitas implementar un método que es una tarea que es devuelve una lista de modelos de autos, alguien que lo llame obtener modelos de autos por manso, y se necesita un parámetro int make ID. Ahora con eso, ese contrato en su lugar, necesito una implementación a la que voy a llamar un repositorio de modelos de automóviles. Y ese se creará en la carpeta de repositorios. Y acabo de darme cuenta que escribí repositorios mal en este punto. Siento mucho eso. repositorios que sabe quién ama algunas ramificaciones debajo utilizandorepositorios que sabe quién ama algunas ramificaciones debajo, pero eso está bien. Podemos crearlos fácilmente. Así que adelante y crea ese nuevo archivo. Simplemente seguiré adelante y arreglaré el, arreglaré este error de ortografía por así fuera. Entonces saber cuándo tienes tu clase de implementación, bueno, tenemos que hacer es heredar de la IA, un repositorio de modelos de automóviles. Entonces eso es bastante fácil, pero esto va a tener que ser una herencia WE porque para uno, este repositorio de modelos debería poder llevar a cabo todo lo que el genérico pueda hacer. Debe ser capaz de hacer todo lo que genérico pueda hacer, así como cualquier cosa personalizada. Nuestro nuevo contrato está reservado para operaciones personalizadas relativas al modelo de automóvil. Pero entonces todavía necesita poder llevar a cabo todo lo que el genérico puede hacer, que es guardar cambios y esto y aquello y aquello. Lo que tenemos que hacer cuando tenemos nuestra implementación es heredar del repositorio genérico lo relativo al modelo de coche. Muy bien, entonces estamos viendo la implementación del repositorio para nuestro modelo de automóvil. Quiero heredar de eso, incluir cualquier referencia que falte, así como mi contrato de vestuario. Entonces cuando veas esto ahora, y yo hago Control dot implementa interfaz, solo implementará el trabajo prescrito por este contrato. No obstante, trabajan en aplicado por el repositorio genérico también está ahí en segundo plano. Oh, me está quejando de que no hay argumento dado que se corresponde con si estoy heredando de algo que tiene un repositorio genérico de inyección, tiene una inyección para el contexto. Si hago un llamado al repositorio de modelos de automóviles, que está heredando de eso, entonces el repositorio de modelos de automóviles necesita proporcionar todo lo que la clase base necesita. Tan larga historia corta, y no fue constructor el que va a tomar los contextos CMDB o simplemente incluso copiarlo. Contexto DB reserva de automóviles, seguir adelante e insertar cualquier referencia faltante, pero también crea un asignado el campo. Entonces voy a tener que proporcionar el mejor método. Con una instancia del contexto, es casi como una cadena de margarita es como una entrega. Por lo que Albert llamando al contrato para i modelo de coche, sabrá que su implementación es esta. Cuando eso se llama, va, se obtiene el contexto del contenedor del COI y dice, Ok, base, que es nuestro Repositorio genérico. Aquí hay una copia del contexto que tengo. Entonces ambos están en el mismo hilo contextos, ¿verdad? No. Y luego también tengo la implementación del costo de los métodos para el repositorio. En este punto, consigue modelos de autos por micrófono. Ni siquiera voy a hacer mucho trabajo duro. Sólo voy a saltar de nuevo a la crear recorridos que en autos. Tenemos el método create que tiene todos estos. Sólo voy a copiar todo esto. Vuelve a mi repositorio de modelos de automóviles. Voy a pegar todo eso. Por lo que los modelos VAR serán iguales a nuestros pesos, los contextos o al cambio de nombre. Vamos a cambiar el nombre de eso en los contextos cuadrados. Así que espero los modelos de autos de punto contextual donde todo eso, y luego solo voy a devolver modelos. Estoy recibiendo este error porque no es el asíncrono, haz que el método sea asíncrono. Y ahí vamos, Todo no es bueno. Por lo que ahora tenemos un repositorio de clientes que nos puede dar la funcionalidad personalizada para esta consulta SQL personalizada. Ese punto en el crear otra división y ver si todo, todos los cambios que le hacemos siempre presionando Control S en este repositorio. No necesito tener el repositorio genérico para un modelo de auto porque esto se va a utilizar más de una vez. Este modelo de auto sí, repositorio de modelo de coche se está utilizando para conseguir que nuestras necesidades se utilicen para obtener toda la lista de modelos de automóviles así como conseguirlos relativos para hacer identificación. En realidad puedo reemplazar el ojo genérico con repositorio de modelos de automóviles AI. Éste no es el genérico, éste necesito el método costal, consiguiéndolo por los mansos. Y entonces no puedo simplemente ninguna línea roja porque todavía tiene acceso a bien. Estoy recibiendo una línea roja y creo que eso es porque fallé en heredar. Pido disculpas, debería haber heredado del repositorio genérico en este punto relativo al modelo de automóvil. Muy bien, por lo que de la misma manera que la interfaz heredaba o la implementación heredó del genérico. El interfacing se hereda del ojo genérico, para que pueda ver todo el trabajo que el genérico puede hacer así como darle su propio trabajo. Y luego permítanme simplemente acercar de nuevo a la implementación. Aquí no hay errores porque ya estoy haciendo referencia a la implementación, que básicamente la idea es interpretar ahí es donde el trabajo para que se ponga alto y todos los demás para la R genérica, así como los métodos personalizados definidos por el contrato personalizado aquí se implementaránla R genérica, así como los métodos personalizadosdefinidos por el contrato personalizado. Cuando salto de nuevo al Crear. No, La línea roja se ha ido. Ahí vamos. Muy bien, así que por esta parte de ella, en realidad puedo simplemente devolver nuevo peso. Mi repositorio de autos dot get car models by Meek, dándole el Manso ID que entró como parámetro. Lo cual elimina todo este código. No necesito ese código. Ya verás una vez más, si ese código cambia, solo tengo un lugar para cambiarlo o simplemente me mira, esto se ve mucho más limpio que tener el, todo el código de contexto escrito nota en lugar de la página. Esto se ve mucho más limpio. Una vez más, si funciona, es bueno. Es sólo cuestión de cuáles son tus objetivos y ¿ necesitas y mantenible hasta cierto punto o cuáles son los problemas que estás tratando de resolver? No lo hagas solo porque conoces el patrón y necesito aguantar para hacerlo, hazlo porque está resolviendo un problema que tienes. Ese es nuestro ajuste a los modelos de autos. Para crear BH más bien, nota que un coche genérico modelos porque tenemos este nuevo repositorio que es personalizado y necesita ser inyectado en. Necesito dejar que la aplicación que tengamos otra que se pueda inyectar. Hice esculpir para lo genérico, recibiendo un error aquí porque eso cambia el espacio de nombres, no hay problema. Pero entonces también necesito agregar alcance para que nazca el nuevo cliente , ¿verdad? Por lo que fui a decir Agregar soporte tipo escuela, modelo de auto, repositorio de modelos de autos, coma. Y la implementación de este será repositorio de modelos de automóviles. Esa es la diferencia en cuanto a dimensiones. Entonces debido a que éste es genérico, que consigue después en un diferente, pero en términos generales, es como verás la interfaz o contrato e implementación meta de peering cuando se están registrando en el contenedor COI. Muy bien, entonces eso es realmente lo tenemos que hacer para asegurarnos de que funcione. Volvamos a los detalles parte del auto. Bueno, los detalles partes de los modelos de autos tienen una historia similar donde en cualquier lugar tengamos el modelo genérico de auto, en realidad podríamos simplemente usar nuestra clase específica que acabamos de definir I repositorio de modelos de autos. En lugar de lo genérico. Esto es lo que estamos usando en cualquier momento que estamos tratando con modelos de automóviles porque métodos personalizados como conseguir el modelo de automóvil con los detalles no es necesario. En este repositorio. Lo que voy a hacer es volver a saltar a nuestro contrato. Y voy a crear otro método que va a decir volver sólo el modelo de auto. Y fui a ver conseguir modelo de auto con detalles. Entonces tenemos que darte la idea del modelo de auto que queremos recuperar con detalles. Ahora una vez que he hecho esto y poner estas pequeñas pestañas aquí para que pueda navegar fácilmente a archivar. Entonces si no tienes esas tinas que acabo de mostrarte, puedes ir a Herramientas, Opciones, ir a C toma editor, luego C-sharp que avanzado y garganta todo el camino de abajo a abajo. Y dice mostrar herencia Marzo, y es experimental. Entonces lo he visto funcionar para algunas personas y no para algunas personas. Eso es sólo para que puedas habilitar eso. Por lo que hace que la navegación entre las clases padre e hijo en cuanto a la herencia va mucho, mucho más fácil. De acuerdo, por lo que ahora hay un nuevo método a implementar. Sólo voy a controlar implementado. Y entonces voy a ver aquí que si lo estoy consiguiendo con detalles, lo que se necesita para regresar es mi contexto. Modelos de autos Dot, dot find no son encontrar modelos de autos que incluyan y fui a incluir mi propiedad de navegación para el mic. Muy bien, luego al final de toda esa LLC la primera tienda impagos. Expresión Lambda donde el ID en el registro es igual a la idea que busco. Entonces cada vez que llamaríamos a esto, sabemos que están garantizados para conseguir buck los modelos de autos con cualquiera incluye. Si lo llamamos los gets, el regular obtiene su genérico, están molestos Tod's. Eso es todo lo que podemos poner una vez más en métodos específicos para el repositorio específico, por una razón específica. Vamos a saltar de nuevo a los detalles ahora. Y puedo reemplazar esto por obtener modelos de autos con nuestro modelo actual con detalles. Sé que cuando regrese el modelo de auto, definitivamente va a tener la propiedad de navegación para el tipo de leche incluida. Por las tarjetas. Tenemos un problema similar. Necesitamos métodos personalizados para que el repositorio de autos pueda recuperar aquellos con detalles. Y para el índice necesitamos incluir los detalles ahí. También. Lo que vamos a hacer es repetir o pies. Vamos a tener un contrato personalizado y nuestra implementación personalizada en nuestro proyecto de repositorios. Entonces así es como va a verse el contrato . Yo autos repositorio una vez más, heredando del repositorio genérico relativo al auto. Entonces tenemos nuestra tarea. Coche podría conseguir auto con detalles. Y la implementación de NOR va a decir autos repositorio heredando del repositorio genérico relativo al auto y al contrato. Entonces todo se inyecta igual que lo hemos estado haciendo hasta este punto. Y luego tenemos el método conseguir auto con detalles, por supuesto que lo hice asíncrono y un peso y el mismo código que estaba en la página de detalles, solo lo corté y lo pego aquí mismo. Pesé el contexto dot cars incluyen todos estos detalles y obtengo el primero o por defecto. Buck en nuestra página de detalles, podemos empezar ya no inyectando el contexto, pero ahora podemos inyectar un repositorio de autos o un repositorio de autos. Esto sería, sólo puedo llamar a éste. Repositorio sigue siendo sólo uno allí. No hay problema. Repositorio. Incluir referencias faltantes, seguir adelante y crear la NSA y el campo. Elimino todos los rastros del contexto y luego agrego el subrayado solo por mi tranquilidad donde estamos consiguiendo, solo digo repositorio dot get car con detalles y darle el valor id dot. Si no lo expliqué antes porque es pequeño, múltiple, tengo que ver id dot value. Y por supuesto después de eso. Y como dije, hice algunas refactorización en Visual Studio cambiar demasiadas cosas ahí a la 1. Entonces algunos de mis tipos de datos están equivocados. Pero después de arreglar eso y estoy seguro que no tuvo ese problema. Verás aquí todo está bien con nuestra página de detalles. Y esto se ve mucho más limpio. Entonces tenemos que hacer algo así para el índice. Ahora, digo algo así para el siguiente porque esto es múltiple, esta es toda una lista con los detalles. Necesito otro método aquí que realmente me esté dando la lista. Fuera de coche. Fui a decir conseguir autos con detalles. Y no obtendrá ningún parámetro. Y eso debería ser lista. Iremos a buscar la lista de autos con detalles. No hay problema. Implementación Kohlberg a aquí, lote controlado implementar interfaz. Y sólo voy a repetir esa declaración de retorno aquí. Por lo que regresa contexto de autos con todo lo incluye lista de puntos. Y tiene que ser una cosa tan controlada hasta hacer método asíncrono y con punto y coma y eso está bien. Entonces en nuestra página de índice, todos estos no pueden ser Repositorio y por supuesto necesito actualizar el constructor y la inyección. Así que sólo voy a atajarlo. Simplemente copia una similar, cambia las pocas flechas. Y entonces puedo notar un repositorio dot obtener tarjetas con detalles y cerrar eso por supuesto después de 08. Y eso es básicamente parece faltar los tipos de datos mezclados y deberíamos estar bien para ir. En otros lugares. Vamos a tener el on post delete, no hay problemas. Entonces no tengo que encontrar nada. No tengo que comprobar si autos no. En cambio, si el registro NO ES nulo, veré repositorio. Y por supuesto tendré que esperar este repositorio Dot Delete y le damos el valor de punto ID de registro. Eso es todo. No hay código agradable y limpio que realmente nunca quiso codificar detrás de eso mientras que las declaraciones y todas las operaciones complejas y así sucesivamente. Quieres abstraer esa ALT. Todo esto debe hacer es llamar a un método, conseguir puerta en los mitos, hacer el trabajo duro. Yo llamo al método y esperando la respuesta. Haces todo el trabajo y solo diciéndome cuál es el resultado. Fui a este punto, construir solo para asegurarme de que he hecho todos los cambios necesarios. Y tengo una flecha porque en mi startup tengo el espacio de nombres mal escrito, pero sí necesito asegurarme de que tengo. Antes de que yo repositorio de autos, te voy a mostrar qué tipo de error verás si no agregas la falla al registrar tu servicio. Por lo que sólo va a Control F5 para ejecutarse sin depurar. Conseguir esta otra flecha porque había renombrado manso para mezclar. Muy bien, así que déjame intentarlo de nuevo. Control F5. Y nuestra aplicación está buscando colores y modelos de mezcla solo para asegurarnos de que estamos viendo los datos. Entonces vemos aquí que están trabajando nuestros repositorios. Si hago clic en Editar, hacer un cambio y luego guardar, vemos que los cambios se guardaron con éxito. Por lo que sabemos que los repositorios trabajando en ese sentido, si miramos a los demás que ven todos ellos volviendo. Entonces si hago clic en los detalles para los modelos, verás que el micrófono está llegando, los detalles están regresando. Ahora si hago clic en autos, cerremos todos estos y hagamos click sobre autos. Ahora mira esto que estás viendo incapaz de resolver el tipo de servicio para el repositorio de autos i mientras intentas activar los modelos de puntos de índice. Así que esa es sólo una manera elegante. Ya voy a ver. Olvidaste poner el registro en el archivo de inicio porque no hicimos esto. Te das cuenta que todo funcionó bien para los modelos. Todos ellos funcionan bien para modelo. Es el mismo concepto. Entonces porque no nos registramos es decir auto, así que voy a decir que yo repositorio de autos se implementa por repositorio de autos. Incluir cualquier referencia faltante o lo siento, Eso son autos. Sigan olvidando eso. Eso es repositorio de autos. Ahí vamos. Simplemente puedo hacer una compilación y la refrescar la página o reescribirla en D en, sin depurar y hacer clic en la página del curso. Sé que se está cargando. Ves que sacas esas cuadras de un error. Si olvidas tu registro de servicio. Y por extensión, mira eso. Estamos viendo todos nuestros detalles. Si vas a Editar, estamos viendo todos los detalles. Si vamos a crear o una lista desplegable en cascada con todavía operar como esperamos que lo haga. Muy bien, entonces esos son pequeños cambios que quieres hacer nuestras propias vacaciones de duda. Esa es la llave poco limpia. Pero una vez más, no porque tengas un martillo, todo debería parecer un Neil. Muchas de las veces aprendemos un patrón y la nave estamos viendo la cosa, hemos usado este botón. Algunas aplicaciones son lo suficientemente simples como para que no tengas que agregarle ese nivel de abstracción y complejidad. Pero al final del día vemos a dónde va definitivamente. Un cortafuegos, se incrementa Cómo mantenible la aplicación. Va a serlo. 29. Conclusión de la sección de repositorio: Muy bien, Así que si giras otro hito y vamos a hacer check-in hacia repositorio de GitHub. Así que vamos a hacer un resumen rápido de lo que pasamos en esta sección. En primer lugar, habíamos identificado que queremos reducir parte de la repetición trimestral y aumentar la mantenibilidad general y la testabilidad de nuestra aplicación. Entonces el paso número uno para hacer eso fue crear o repositorios. Entonces creamos lo que llamamos el repositorio genérico que tenía muy, lo que debo decir, no, genérico para uno pero formas muy abstractas de declarar la forma básica mostrada es que cada uno de los elementos de base de datos necesitarán para llevar a cabo. Al hacer eso, pudimos utilizar dos archivos para compensar muchas tablas de bases de datos. Entonces entre el repositorio genérico, bajo repositorio genérico, tenemos suficiente cobertura de código para casi cualquiera de los escenarios básicos para cada una de nuestras tablas en la base de datos. Por extensión, somos capaces automatizar ciertas cosas que habríamos tenido que hacer en un monitor personalizado o haciendo una serie de lugares. En cada vez que creamos un elemento, pudimos automatizar eso independientemente de qué elemento se esté creando o sabemos cómo bajarlo a la entidad de dominio base, cual será cada elemento. Toda entidad u otra será. Y cuando se está agregando, podemos seguir adelante y modificarlo todo antes de que realmente lo comprometamos con la base de datos. Entonces esas son operaciones muy claves en lo que estamos haciendo. Después de tener nuestros repositorios genéricos, también nos dimos cuenta de que había ciertas operaciones que necesitaban un toque personalizado. Entonces en lugar de tocar las cosas genéricas, nos metemos en la cabeza y lo extendimos. Entonces poder extender una clase sin modificar la clase principal, ese es el principio Liskov y ese es el L en sólido. Estamos mirando la inyección de dependencia porque en ninguna parte creando objetos que se puedan inyectar a voluntad, estamos mirando en seco, que es no repitas tú mismo. Estamos mirando la segregación de interfaces, razón por la cual tenemos todos estos contratos y sus implementaciones. Número de principios que entran en el cuatrienio. Entonces, ¿qué queremos extender? 104 ya implementaron repositorios y vieron sin la superposición, modificándolo y viendo bien, repositorio genérico, cosas domésticas específicas a otra cosa. Creamos nuestros específicos, yo un repositorio modelo de coche con solo operaciones relacionadas con el modelo de automóvil que requieren poco toque personalizado. Tenemos la implementación y también tenemos el repositorio de autos. Yo sí dije de, creo que nuestro modelo anterior que estaría bien cuando estamos agregando un auto para ver si existe la división de licencia y si lo hace, no lo añadas, sí recuerdo ver que sería agradable de hacer. Nunca llegamos a hacerlo. Veamos cómo se vería eso. Una vez más, cualquier disfraz que necesites, lo pondrás en el repositorio relativo. Entonces en este caso, sólo voy a duplicar esto. Lo siento, ese es el modelo de auto que quería en autos. Entonces voy a duplicar este método. Esto sólo va a devolver un booleano. Boolean va a ver conseguir coche es lección dividida existe. Esto llevará el número de placa extrema. Sólo voy a decir que juega el número. Ese es su parámetro. Una vez más, si tenemos dentro de la interfaz, pasamos a la implementación. Y luego se va a completar y vamos a Control dots, dejamos que implemente la interfaz. Y entonces puedo devolver contexto. Por favor mira en la mesa de autos y dime si hay alguno. Y por supuesto usamos nuestra asíncrona. Cualquier número de matrícula de q-dot asíncrono siendo igual al número de placa que se acercó. Aunque debido a que son una cadena, probablemente querrías poner todo a bajar porque mayúsculas es diferente de minúsculas es bajar. Otra cosa que querrías hacer es probablemente recortarlo de cualquier especie que pueda estar en el altar. Alcanza. Con esos dos hechos a lo que hay en la base de datos, también lo querías a cualquier valor que sea posible. Todo será minúsculas y todo se recortará de todos los espacios en blanco. Y luego comprobaremos para ver si hay alguno. Por lo que tengo que esperar este control de puntos. El método Asíncrono. Ahora eso está extendido, agradable y fácil. Si quisiéramos incorporar ese nodo check en nuestro Create y por extensión, la operación de edición. Lo que puedo hacer es hacer mi propio cheque aquí para ver si puedo ver en el repositorio de partituras o puntos del repositorio de autos. Apenas empiece a escribir clases divididas hasta que lo vea. Lo cual no soy, no estoy viendo nada porque esto sigue siendo el genérico. No hay problema. Estoy usando mi disfraz. Yo autos repositorio y puedo reemplazar eso en todas partes para que la inyección funcione correctamente. Ok. Todo el mundo está bien. Sono manera. Si miro hacia atrás, vería que tengo acceso a los métodos personalizados es menor que split existe. Y luego pasaría en el auto puntos número de matrícula que viene del formulario. Si existe. Lo que quería hacer es hacer inválido el estado modelo porque no hay matrícula presente, es válida. Quiero que sea inválido. Esto está en su lugar así que puedo decir estado modelo, dot add error, error de modelo. Y esto toma dos parámetros. Dice cuál es el campo que quieres que agregue la herramienta de error y cuál es el error para el campo? Puedes usar una cadena, pero luego te mostraré el peligro o uno de los problemas que usan la corriente así. Eso está bien. Quiero que se añada a este campo. Y el mensaje debería decir, número de división de licencia ya existe. cuando termine agregar el error del modelo y llega a esta declaración va a ver que no es válido porque hay un error. Yo lo hice. Y luego volverá a cargar el pH mostrando el error debajo del campo. Se puede experimentar con eso. Realmente no voy a probar eso. Ese no es el punto que estoy tratando de empujar. Lo que estaba diciendo sobre el campo es que por fuerte mecanografía y si es un caso donde terminamos cambiando el nombre de este campo, tendríamos que recordar que tenemos que actualizar la cadena. No cambiaría automáticamente. Entonces para mantenerlo fuerte deseo a lo que hacemos es ver nombre de pasamos en el nombre directo de la variable. Por lo que sólo lo convertirá número de matrícula y saber que esa es la mujer de campo. Este es el mensaje de error. No hay problema. Solo estoy mostrando lo fácil de saber simplemente extender la funcionalidad. Ya está inyectado. Todo lo que hice fue cambiar el tipo de datos, que es una operación de una sola vez. Como necesitas extenderlo, solo pones otros métodos y los usas para voluntad. Eso es todo lo que se habría requerido para extender esta funcionalidad para que puedas seguir adelante y probarla. Como dije, tenemos que hacer eso en el Edit también. Así que déjame hacer eso y asegurarme de que tengamos cobertura completa. Antes de esos puestos. Tenemos que hacer eso. repositorio de Kiara una vez más es el genérico. Por lo que tengo que decir por aquí, yo repositorio de autos. Muy bien. Cambia esto. Creo que los repositorios podrían tener su propio espacio de nombres, pero lo arreglaré. Eso está bien. En ese punto. Eso es todo lo que realmente necesitamos hacer para asegurarnos que nuestros contratos y todo sean extensibles. Para que puedas seguir adelante y probar eso. Lo siento, sólo estoy tratando encontrar lo que necesitaba para cambiar. Qué son los demás. Incluir su repositorio de autos. Disculpas. Muy bien, entonces IQR es repositorio y entonces todo debería estar bien. Se usará declaraciones necesarias, todos los errores se han ido y el mismo tipo de validación está sucediendo cuando editamos. Esto es lo fácil que es agregar validaciones personalizadas debido a nuestros métodos de base de datos personalizados. Con nosotros. Eso es todo, ya he terminado. Vayamos con buenos cambios. Una vez más conseguir los cambios deben ser a la sociedad. Si no, vas a ver y sacar la ventana, obtener cambios. Pondrás en tu mensaje de compromiso. Y entonces solo puedes comprometerte todo y hundirte. Eso empujará tus cambios a GitHub, derribar cualquier cambio que hagan tus compañeros en consecuencia. 30. Configuración de la autenticación de usuario: Chicos, bienvenidos de vuelta. Entonces en este punto, tenemos mucha funcionalidad trabajando para nosotros. Y a pesar de que puede no parecer tan elegante, has llegado a la realización o compra saber que todas las aplicaciones están haciendo, están leyendo desde la base de datos, actualizando datos, poniendo datos ahí, o eliminación de datos. Eso es todo lo que realmente está ahí. No importa lo complicado que parezca. Todos los fondos comen pueden parecer. Eso es todo a lo que se reduce. Si quieres ampliar esta aplicación para hacer más cosas, poniendo más mesas, quiero decir, se llama reserva de autos. Y nosotros hoy es todo lo que estamos haciendo es meter en los autos. Si quieres poder poner en la reserva real que ningún problema. Veamos hacer eso. No obstante, antes de ponerle en esa funcionalidad Beta, quería asegurar la aplicación en cierta medida, por lo que no necesitamos una. Tenemos que ser capaces de saber quién está haciendo qué en nuestra aplicación. En este punto, cualquiera puede simplemente ejecutar la aplicación y empezar a agregar autos, agregándome modelos emocionantes. Queremos restringir ciertas cosas a un usuario registrado que conocemos. Y para más adelante miramos cómo podemos sentar niveles entre los diferentes usuarios que son capaces de hacer las cosas en nuestra aplicación. Vamos a empezar ampliando nuestro contexto DB para poder manejar operaciones relacionadas con el usuario. Eso es en realidad más simple de lo que suena. Todo lo que tenemos que hacer es en lugar de decir contextos DB, decimos identidad, contexto DB. Identidad es el marco o la biblioteca que nos da dotnet core para empezar a agregar operaciones relacionadas con el usuario a nuestra aplicación. Entonces al ver el contexto DB de identidad para la herencia, Controlo los puntos. Verás que necesito incluir algunas bibliotecas nuevas. Estamos utilizando NuGet fin de semana para decir instalar paquete, encontrar e instalar brotes. Recuerda que tuvimos algunos problemas de versionado con el Entity Framework Core y la versión de la biblioteca. En realidad es más seguro usar NuGet manualmente. Entonces voy a hacer clic derecho ir a Administrar paquetes NuGet. Y para nuestro instalado, sabemos que estamos trabajando con 5.8 en este momento. Entonces voy a ir a los bros y voy a buscar identidad. Solo digo que he sido identidad, núcleo de identidad y luego vemos Microsoft.asp.net Identidad básica a Entity Framework Core. Entonces ese es el que queremos y luego estamos lidiando con 5, eso. Así es como usas NuGet package manager para asegurarte de que todas las versiones estén en el mismo hígado. Entonces pegué Instalar, permitir que haga lo suyo, acepto cualquier problema que surja. Cuando eso se hace, puedo saltar de nuevo a mi contexto DB e incluir la declaración de uso que falta. Ahí vamos, y todos están contentos. Muy bien, luce bien hasta ahora. No. En nuestra se inicia archivo. Veremos que tenemos un pequeño error aquí donde estábamos agregando los contextos DB. Y está diciendo que necesitamos las declaraciones de uso. Así que sólo voy a Controlar puntos. Y dice instalar el paquete referencia que datos o simplemente agregó una herramienta de referencia. Sólo voy a sumar la referencia. Más bien solo usaré una versión local. Así que solo usaré la versión local. Y esa es otra fortaleza de la gestión de paquetes. Nos permite asegurarnos de que no lo somos, que todas nuestras versiones estén en el mismo nivel. Así que sepan que el error ha desaparecido y siempre sigue en la startup. Y lo que tenemos que hacer es hacerle saber a la startup que estaremos utilizando servicios de identidad en la aplicación. Por lo que fui a decir servicios dot add debería ver identidad predeterminada. Si no, entonces en identidad, ahí vamos. Para que puedas agregar núcleo de identidad. Al agregar conocimientos básicos de identidad, dirán qué tipos de usuario, el tipo de usuario predeterminado se obtiene con identidades, usuario de identidad. Y nos fijamos en cómo esto se puede extender en unos pocos. Pero sólo vamos a agregar con usuario de identidad poner en las declaraciones que faltan usando, y luego podemos pasar en opciones si queremos. Entonces cuando digo que puede pasar en opciones, puedo ver opciones con una expresión lambda, opciones. Y podemos explorar diferentes opciones que queremos ir por nuestros usuarios. Y hay conos. Por ejemplo, lo que vamos a hacer es ver opciones en un inicio de sesión requieren confirmado un cono para saber como cuando te inscribes en nuestra página web y te envían los Tolkien para decir, por favor confirme su colon de, lo que es hasta la fecha de vencimiento. Realmente no se puede iniciar sesión. Bueno, eso es lo que podemos hacer cumplir aquí. Puedo ver requerir cuenta confirmada. Por defecto, va a ser requerido. Así que en realidad sólo voy a decir es igual a falso. Sólo porque es una aplicación interna, probablemente no voy a estar pasando por los rigores fuera pedir a nadie que confirme sus conos de todos modos. Pero solo te estoy mostrando lo que es posible. Por lo que tienes un montón de opciones a tu disposición. Y si necesitas establecer múltiplo, solo puedes hacer eso usando un bloque de objetos. Y terminas cada línea con un punto y coma y agregas tantas opciones como necesites. Estamos agregando núcleo de identidad relativo al usuario de identidad, que es una clase de usuario predeterminada que nos da por marco de identidad o núcleo de identidad otro. Y entonces podemos decir agregar reglas. Si queríamos usar reglas, podemos decir que quiero usar reglas en la clase fila. Hay uno por defecto en la regla de identidad. Una vez más, podemos personalizar eso. Generalmente no personalizo ese, para ser honesto, suelo usar una regla predeterminada. Entonces al final de eso tenemos que decirle a Add Entity Framework tiendas. Entonces necesito decirle dónde estamos almacenando nuestra información de usuario? Por lo que realmente sería pedir nuestro contexto DB. qué contextos debo usar para inferir qué base de datos necesito almacenar las tablas relacionadas con el usuario. Ahora lo que pasa es que a algunas personas les gusta usar la misma base de datos para aplicaciones y cosas relacionadas con el usuario. Algunas personas los separan. En esta actividad, lo voy a mantener simple y voy a usar el mismo contexto tanto para las cosas regulares como para las cosas de los usuarios. Una vez más, algunas personas se separaron. Entonces, si quisieras separarlo, crearías otro contexto DB. Al igual que todo lo que tenemos este aquí. Lo que podrías hacer es dejar éste como solo heredar de contextos de DB y crea otros contextos de DB que hereda de contextos de base de datos de identidad. No necesitaría ninguna mesa porque verás cómo la herencia de justicia nos dará las mesas que queremos. Y entonces estarías bien. Y por supuesto que tendrías que tener la otra cadena de conexión aquí. Y configuras tu contexto DB en consecuencia, o tu contexto de identidad en consecuencia. Se necesitan algunos bits de configuración, pero una vez más, la ruta simple usando una base de datos, ya tenemos el contexto. Sólo necesitamos estas tres líneas. Y luego podemos agregar la aplicación de tienda de Servicios de Identidad. Y sabrá que debe estar buscando este contexto de base de datos para todas sus necesidades de conectividad. Muy bien, así que con todo eso hecho, podemos ir a nuestra Consola de Administrador de Paquetes. Y cuando tenemos eso abierto y funcionando, podemos cambiar el proyecto predeterminado como sabemos. Lo configuramos en datos. Y voy a decir añadir Mi acuerdo. Hice mesas de usuario. Ahora nota que no hice nada. No creé una nueva entidad. No lo hice Lo único que hice al contexto DB para hacer cambiar la herencia. Pero mira el archivo de migración que es un barco para generarse. Entonces estamos recibiendo una migración migra. Mira toda esa gran agregación. Por ahora, deberías estar familiarizado con las migraciones parecen. Simplemente señalaré qué mesas se están creando. Conseguir uno para las reglas, uno para los usuarios. Y se ven todos los campos que se generan para el usuario. Y todos ellos son relativos a los usuarios de identidad. Así que con solo ver al usuario de identidad aquí, estamos obteniendo todos estos campos estaban recibiendo reclamos rove, reclamos de usuarios y un montón de otras mesas con un montón de cosas. Algunos de ellos es posible que ni siquiera realmente use cualquier crea los índices y cualquier clave foránea. Y luego por supuesto, no sólo deshace todo eso. Eso es lo que acaba de cambiar la herencia de contextos VB, ese contexto DB de identidad, eso es lo que resulta el cambio. Dentro de la consola de Package Manager. Si lo hago actualizo base de datos y permitirle tener su camino con la base de datos, lo que notarás es en la base de datos obtenemos un montón de tubo nuevo diremos si acabo de hacer una rápida actualización y miro en la base de datos y las tablas que tenemos. Verás que tenemos todas esas nuevas tablas que se agregan a la base de datos. Sólo deja que eso justo ahí. Estás poniendo en tus mesas de usuario. Sabe dónde almacenar la información del usuario y no tuvo que sentarse y escribir ningún código personalizado. Y cualquier código personalizado que estés a punto escribir es realmente debido a las necesidades de tu negocio. Porque quería arreglar en la mayoría de estos, pero fuera de la caja, las bibliotecas de identidad se encuentran con esta alma Paul comida y tan fácil. Entonces cuando volvemos, lo que miramos es extender tabla de nuestro usuario porque en este momento los usuarios estables, sí , tiene muchas columnas, pero notarás que no son necesariamente columnas útiles en de como un entorno de negocios o ideas. Tenemos una identificación, sí o no. Yo uso un nombre y un correo electrónico pero no sabemos el nombre de la persona. No sé qué lo usa. Esto solo se basa en su nombre, FirstName, LastName, incluso fecha de nacimiento, cualquier cosa que quieras almacenar tanto al usuario como solo imagina esta aplicación como una aplicación se utilizará en acompañar a cualquier empresa en la que te encuentres. Tú, ellos quieren saber quién eres cuando inicies sesión. No quieren poder ver toda la información. Bueno, aquí es donde comienza a almacenarlo. Cuando te crean en este sistema, suelen poner en orden. Ahí es cuando volvamos, veremos cómo podemos extender la mesa a voluntad. 31. Extende la tabla de usuarios: Muy bien chicos. Por lo que la última vez que estuvimos aquí, estábamos mirando a configurar las tablas de identidad en nuestra base de datos. Ahora necesitamos saber cómo podemos extender esas tablas para asumir diferentes campos. Vamos a empezar con el usuario de identidad. Cierra algunos campos, lo que quiero más campos. Una forma fácil de hacer eso sería en los datos, solo crea nueva carpeta. Veré identidad para que sepamos que algo en este hoyo esté relacionado con la identidad. Entonces tengo clase, así que puedes nombrar cualquier cosa a la clase. Por lo que el nombre más popular que verías su usuario de la aplicación. Pero una vez más, ¿cómo se llama? Depende de usted y de su operación y de su objetivo. Digamos usuario de la aplicación. Es una clase pública que va a heredar los rasgos de carácter de un usuario de identidad. Usuarios de identidad, el usuario predeterminado, voy a decir, bien, bueno, tienes todo lo que tiene un usuario predeterminado. Pero también lo tienes, aquí es donde podemos empezar a poner en String nombre, apellido. Si quisieras poner una identificación de empleado, siguen siendo vuelo o algo único para esa persona. Entonces voy a parar en nombre y apellido. Fecha de nacimiento, creo que sumar la fecha de nacimiento sería una buena actividad. Fecha de nacimiento. Muy bien, eso es todo. No, necesitamos que el usuario de la obligación sea la clase de usuario predeterminada cada vez que estamos haciendo nuestras operaciones que tengamos acceso a los campos adicionales en el lado del código, pero también necesitamos extender la base de datos que realmente se almacenará en estos campos. Entonces una startup, necesito cambiar AD Identity core de solo ver usuario de identidad para saber ver el usuario de la aplicación en cuanto a código cada vez que estamos haciendo algo de usuario, relacionado con el usuario, más bien, estará utilizando este tipo de datos y nos dará acceso a esos campos. Para la base de datos, necesitamos volver a nuestro contexto y posterior contexto DB de identidad ni por corchetes de ataque que debería estar usando. Y si miras los corchetes de tipo dicen dame el usuario t. Si intentara tarjeta, auto Let's IV funcionaría. Solo están queriendo una clase si usara coche, no, los cambios de época, él decía que no se puede usar como parámetro de tipo para el usuario t. Eso es lo que decía. Recuerda cuando estamos hablando genéricos y de los tipos de datos, dice usuario T, donde el usuario es de tipo usuario de identidad. Por lo que tiene que ser alguna entidad que sea de tipo identidad usuario, como el usuario de la aplicación que acabamos de dejar heredar. Para que pueda saberlo, poner al usuario de la aplicación ahí y todos están contentos. Sepa que el contexto DB sabe que estoy usando el usuario de la aplicación si hago una nueva migración. Entonces fui a decir que hice usuario, hice más campos de usuario como mi migración. Va a reevaluar saber y decir, está bien, estoy lidiando con un nuevo tipo de datos. Y este nuevo tipo de datos tiene columnas que no contabilizé, como fecha de nacimiento, FirstName y LastName. Por favor, siga adelante y agréguelos a la base de datos. Se está agregando esa columna a la tabla de usuarios de ASP NET. Esas columnas. Cuando hago la actualización, termina con éxito. Y luego si miro hacia atrás mi idea de estar estable, después de una actualización rápida, sabré ver mis nuevos campos muy bien mostrados en la tabla de usuarios de ASP NET. Nombre, apellido y fecha de nacimiento. Así es como puedes extender tus clases cuando estás tratando con las operaciones relacionadas con el usuario. Sólo para verlo, podríamos haber extendido la regla de identidad. ¿ Y si las reglas estables no tuvieran suficiente información o tanta información como te hubiera gustado. Todo lo que tiene es un ID de usuario. Lo siento, esa es la equivocada. Tú roles, roles que son hace reglas ha nombrado nombre normalizado, sistema de órganos crónicos. No sé qué más probablemente querrías agregarle, pero solo te estoy mostrando que de la misma manera podemos extender el usuario de la aplicación por la herencia y luego usarlo en su lugar. Off es de la misma manera que se pueden extender roles o cualquier cosa que tenga la identidad del prefijo más o menos delante de él. Entonces todo lo que hemos hecho es solo configuración. Cuando volvamos veremos cómo podemos configurar nuestra página de registro y dejar que los usuarios accedan. 32. Configuración de la página de registro: Chicos, bienvenidos de vuelta. La última vez que estuvimos aquí, estábamos hablando de realmente dejar que los usuarios se registren y que los iniciaran sesión. Así que sólo voy a colapsar todo lo que vamos a abrocharnos o a qué proyecto voy a cerrar todas las pestañas que no se necesitan directamente. Y dentro de nuestra app, puedo hacer clic derecho, ir a Agregar. Y voy a ver nuevo artículo regañado. Ahora bajo este cuadro de diálogo, verás que hay una categoría que dice identidad. Cuando haga doble clic en Identidad, lo hará es que va a chequear. Y luego pasa a evolucionar hacia la pantalla donde dice Agregar identidad. Puedes anular todos los archivos. Entonces la cosa es que cuando obtienes el archivo de plantilla es en realidad una especie de, simplemente están algo escondidos de ti porque ninguna parte vimos ninguna página de inicio de sesión o registro, están algo escondidos. Pero cuando queremos sobrescribirlos, podemos decir fácilmente que queremos anular como o podemos cereza escoger los que queremos anular. En esta situación, me gustaría anular la página de registro y el contexto que debe ser relativo a su auto reservando hasta el contexto DB. No necesito agregar la clase de usuario ni nada más por no, todo lo que quiero es el registro. Y luego puede seguir adelante y golpear Agregar. Tomará un tiempo hacer el andamio. Por supuesto. Cuando se hace, obtenemos este archivo README. ¿ De acuerdo? Realmente no necesitamos eso, pero si miras, verás que tenemos una nueva carpeta llamada areas. Y si profundizas, ves páginas de identidad y luego obtienes algunos nuevos votantes. No hagas este archivo de registro. Y si te das cuenta, esta también es una página de Razor. Por defecto, estos uber es un PHS independientemente de la temperatura del proyecto que utilice. Entonces veamos qué registro nos da el CSS. Html5 nos da un formulario donde obtenemos una entrada para correo electrónico en senderos donde querían confirmar la contraseña. Sabemos que tenemos otros campos que necesitamos, por lo que siempre podemos extender esto como sea necesario. En el código de registro detrás de él, notarás que se está inyectando. Sí, nos pide el contexto DB, pero observe que no está inyectando un contexto DB. En cambio se está inyectando lo que lo llamamos gestor de inicio de sesión y un gestor de usuarios. Son relativos al usuario de la aplicación. Sólo te estoy mostrando que todo está conectado. El razonamiento para ver usuario de la aplicación y no usuario de identidad está en el inicio. Nosotros le dijimos que cuando añades identidad, cualquier cosa relacionada con la identidad, usa usuarios de aplicaciones. Por lo que ningún código degenerado sabe que no es el voltaje de usuario de identidad es usuario de la aplicación. Observe que esto no dio una flecha porque podrían usarse indistintamente. No obstante, no voy a ir en contra del código generado y mirar el hecho de que tenemos el gestor de inicio de sesión así como el gestor de usuarios. Por lo que estas son bibliotecas integradas que nos da la biblioteca central de identidad. Eso es lo más bajo, el mango de firma de operaciones relacionadas y cualquier cosa básicamente operada por el usuario consigue relacionado con el usuario, lo siento, operaciones, conseguir un usuario, cambiar algo sobre el usuario, etc. Entonces todo aquí está siendo inyectado y verás que hay un remitente de correo electrónico. Aún no hemos implementado ningún servicio de correo electrónico. Esto es realmente sólo un titular del lugar que se puede sobrescribir más adelante. También obtenemos el registrador de ojos, que es relativo a la página en la que estamos. Si te das cuenta en la parte superior tenemos este atributo que es su permitir anónimo. Entonces nos fijamos más en los atributos más adelante cuando estamos discutiendo cómo podemos permitir que Auth0 autenticado frente a ciertas partes de la aplicación versus cómo podemos bloquear ciertas partes del aplicación. Así que sigamos adelante. En este modelo que se generó para nosotros, se ve que tenemos comprando propiedad por encima de esta entrada. Entonces este es un patrón que hemos visto antes. Si miramos en nuestras páginas, vemos que para el Create, habíamos hecho algo ya, generó algo parecido a esa propiedad sobre todo el modelo llamado auto. No obstante, en esta situación, notarás que el modelo es en realidad el monitor de entrada está definido aquí dentro de la página, una clase dentro de nosotros patrones de buff ugandés, pero solo los estoy mostrando a ti que a pesar de que se ve ligeramente diferente, es lo mismo. Tendrás una clase. Y esta clase tiene los mismos atributos que habíamos puesto requeridos. Esta es la dirección de anemia, este es un nombre para mostrar que queremos habíamos usado todos los antes y es sólo una propiedad llamada email donde ver algunos otros, pero son las mismas cosas. Tenemos la verificación de longitud de cadena y esta es una contraseña, y luego esta está diciendo que es una contraseña y debe compararse con contraseña arriba arriba y mostrar ese mensaje de error si no coinciden. Eso es todo. Por eso solo tenemos tres campos en el modelo de entrada, que se está utilizando en el formulario. Es por eso que el formulario es vinculante a entrada de correo electrónico dot input dot pass o ella. Punto de entrada confirmar la contraseña. Entonces fuera de todo eso y conseguir, solo toma una URL de retorno, podemos deshacernos de algunas de estas líneas de código como esta, inicios de sesión externos y así sucesivamente. No necesariamente los necesitamos. Al menos no los vamos a estar configurando en el ámbito de este curso. Pero después de que se presente el formulario, aquí vemos que si el estado modelo es válido, es válido es relativo , una vez más, todos estos atributos arriba. Creamos un nuevo usuario de la aplicación pasando a detalles provenientes del formulario y nombre de usuario y dirección de correo electrónico. Y luego creamos. Entonces aquí está nuestro gestor de usuarios. Dot create Async, un nuevo usuario usando la contraseña que se ingresó. ¿ Conocer B2B o contraseñas sin importancia es que nunca almacenas contraseñas en texto sin formato en la base de datos? Sí, el usuario sólo puede escribir la palabra cuando estás escribiendo en pastor es el único tipo en las palabras y los números como los conoces. No obstante, si fueras a ver lo que se almacenaba en una base de datos, nunca deberías reconocerlo nunca. Es decir, Esa es la defensa número uno contra los hackers. Hash tus contraseñas. Conoce lo bueno de estas bibliotecas que al llamar a este método, todo eso se hace por ti detrás de escena. Por lo que en realidad ni siquiera tienes que preocuparte por la seguridad del almacenamiento de contraseñas una vez que usas este método para crear el registro de usuario y darles la contraseña tal y como ingresó el usuario. Si la persona fue creada con éxito, usted acaba de registrar eso y luego generamos el código. Entonces cuando hablemos de confirme tu dirección de correo electrónico y te enviaremos el correo electrónico. Este es el código que genera ese tipo de conversación detrás de la consulta LINQ está vinculado para confirmar. Muy bien, así que por favor confirme sus conos haciendo clic aquí. Así es como se ve ese correo electrónico de confirmación. Una vez más, no tenemos ningún servicio inmunológico funcionando, ¿verdad? Y también podemos pasar por alto ese bit por no. Y luego dicen si, y luego aquí está, requieren cuenta confirmada. ¿ Eso se ve familiar? Porque recuerda cuando lo configuramos núcleo de identidad, dijimos que no, no tenemos que requerirlo. Aquí. Estamos viendo si las opciones decían que debería ser requerida. Después leemos en la página de confirmación de registro, que es como una página de shell para fingir como si estuviera haciendo clic aquí en el mismo enlace. De lo contrario, basta con seguir adelante y firmarlos. Entonces eso es lo que está firmando asíncrono es cuatro. Entonces obtenemos todos los errores. Si no pudo crear al usuario, obtenemos los errores y luego los enviamos de vuelta en el estado del modelo a la página. Eso tiene múltiplo. Solo quería que entiendas lo que está haciendo este código porque puede parecer abrumador, pero tenemos que prestarle atención. Verás que todas las variables, todo el código está escrito de tal manera que si acabas de leerlo,en tal manera que si acabas de leerlo, realidad puedes seguir junto con lo que está sucediendo en cada punto. Pongámonos a prueba o una página de distribución. Lo que haré en nuestra página de maquetación compartida. Oh, me di cuenta de que también tenemos este login parcial. Extrañar ese punto. Este inicio de sesión parcial vino con la actividad de andamios y este login PowerShell tiene la herramienta de enlaces. Ver aquí es registrarse o iniciar sesión. Iniciar sesión parcial es en realidad solo darnos los enlaces que necesitamos para el inicio de sesión o registro. Y si estuvimos iniciados sesión, dirá hola, usuario iniciado sesión. Y por favor cierre la sesión. Lo que voy a hacer en el diseño se utiliza ese parcial en la barra de navegación. Ir al interior de este div que ya tiene la barra de navegación. Y todo lo que tenemos que hacer es complacer la intrusión parcial, nombre parcial igual a login parcial. Muy bien, debajo de eso, se seccionará. Vamos a decir esto para un control de giro. Si lo primero se acuerda me es una era de embarcaciones, no hay tipos de servicio que como un error de inyección. Y es soluble a gestor de firma para usuario de aplicación saber que el gestor de inicio de sesión se está utilizando en el parcial para iniciar sesión. Se dice que esto no ha sido registrado. Saber volver a la startup, lo que he ido a hacer es modificar la biblioteca o la función que estoy usando aquí, estoy usando el núcleo de identidad AAD. Pero si acabo de escribir identidades o CDF, Identity versus AD Identity core yoduro en TTX dos parámetros de tipo, y lo configura como la identidad predeterminada, mientras que los conjuntos de núcleo de identidad de ciertos cosas. Pero creo que lo que pasa es que con núcleo de identidad, hay que registrar su lista de identidad a la carta con solo registrarlo todo. Mientras que con identidad donde tengo que decir, bueno, el núcleo de identidad de la USU y también quiero este servicio y que, ese servicio, en lugar de complicado en la configuración, sólo voy a Tick identity core y use AD Identity también sacó la línea que agregó las reglas porque la entidad yoduro quiere un usuario y nuestro tipo de rol en los corchetes de tipo. Entonces así es como va a lucir. Esta línea no es ningún servicio que agregó entidad t usuario. Entonces si nos fijamos en los sobrecargados, algo de usuario tipo T y algo de regla tipo T. Entonces al usuario sería usuario de identidad, nuestro usuario de aplicación en este caso. Y fila de identidad para la regla t de tipo. Con todo eso hecho, déjame controlar F5 e intentarlo de nuevo. No u obligación se está cargando. Y no sólo se está cargando, sabemos cómo la herramienta enlaza en la barra de navegación. Entonces si hago clic en registrarse, no es decirme del remitente de correo electrónico ojo. Así que recuerda que dije que estamos haciendo ese es un servicio que aún no tenemos. Eso no es problema. Lo que voy a hacer no es inyectado, así que sólo voy a sacarlo de la inyección aquí y entrar en tote y lo dejaré donde sea que se esté utilizando, en ninguna parte. Voy a entrar en esos. Entonces en cualquier lugar que se utilizaran los objetos del remitente de correo electrónico, solo comente que le dijo para su uso posterior. Para que eso debería resolver ese problema. Permítanme controlar de nuevo a F5. Y esta vez cuando voy a inscribirme, funciona. Muy bien, así que ves aquí así es como se ve la forma. Recibimos contraseña de correo electrónico, confirmamos contraseña, y luego algo sobre usar otro servicio o registrarnos. Recuerda que tenemos este fichero, por lo que podemos modificar este formulario de registro como queramos. Por ejemplo, quiero más campos en su distribución. No quiero sólo la dirección de correo electrónico y la contraseña. Sabemos lo que es que tenemos nombre de usuario y hemos enviado un correo electrónico. Esos son dos campos diferentes. No obstante, la forma en que configura la marca ahora solo es pedir un correo electrónico, pero lo usará tanto en los campos EMEA como en el nombre de usuario. Depende de ti si quisieras separarlos y si no, puedes dejarlo como está. No obstante, sí necesito que se añada el nombre y el apellido a este formulario. Por lo que fui a saltar de nuevo a mi formulario de registro y voy a añadir más cuadros de texto. Entonces antes del correo electrónico, voy a poner en el punto de entrada primer nombre. Entonces todo lo que hice fue copiar todo el bloque para correo electrónico y buscaré modificando formularios ya. Entonces esto debería ser algo rudimentario para ti en este punto. Solo estoy viendo gene, otros adicionales que creé para FirstName y LastName multi-cell ellos obteniendo esas líneas rojas porque FirstName y LastName no existen en el objeto de entrada. ¿ Qué es este objeto de entrada? Si Control clic y salto a su modelo de entrada, ¿qué es el modelo de entrada? Modelo de entrada es lo que tenían definidos estos campos? No puedo ver. Quiero que mi nombre, mi apellido sea aparte del modelo de entrada. Nombre, LastName. Una vez más, nada especial. Voy a quitar o cambiar los nombres para mostrar. No obstante, por supuesto, el tipo de datos que estoy validando no es dirección de correo electrónico para estos dos. Ahí vamos. Ahora nuestro modelo de entrada se ha ampliado. Nombre, LastName, y lo que sea LLC tad. También lo agregamos al formulario y verás que esas líneas rojas se han ido. No. Entonces todo el mundo conoce su papel. Y entonces lo final que voy a hacer es extender obligación usuario, pero no voy a hacer eso. Quería al menos registrar alguien sin que entraran los datos. Y luego verás cómo se ve cuando obtengamos los datos del carrito. Yo lo hice. Así que déjame controlar la actualización de nuevo. Saltar a mi registro y ya ves conocer la fórmula mostrando más temas. Entonces si pongo en todos esos y voy a decir auto Booking.com, contraseña de Booking.com. La contraseña, pero la falla es estricta. Alguien a decir mayúscula P al decir, dice totalmente ya uno. Esa es la palabra de moda ahí es para tus ojos. Y fui a usar esa contraseña de confirmación. Si lo cambio, mira eso, la contraseña y la confirmación no coinciden. Así que automáticamente estamos recibiendo ese tipo de retroalimentación. Si pongo algo inválido como dirección de correo electrónico e intento registrarme o hace algo direcciones de correo electrónico no válidas. Discúlpate. Pero aquí estás viendo que no tenemos usuario. Ciertas cosas están fallando porque están esperando ciertas configuraciones que simplemente no están ahí. Muy bien, eso no es problema. Como dije, como ves los errores, los arreglamos. Entonces ese error se debe a que el generador Tolkien que está siendo utilizado por el administrador de usuarios habría tenido que configurarse desde el inicio. No estamos listos para. Eso me encanta porque no estamos enviando el correo electrónico de todos modos. Fui a comentar, eso es Alt también. Estoy seguro de que sólo ha llegado aquí porque el usuario fue creado con éxito. Entonces si miro en la base de datos en ASP NET usuarios ver datos, verá que el usuario fue creado admin en la tarjeta Booking.com. Esa no fue una dirección de correo electrónico no válida. Entonces funcionó independientemente de lo que veas aquí, mira la contraseña. Eso no se ve nada que la contraseña que te mostré en pantalla. Solo sé que eso es hash automático. No tenemos que preocuparnos por nada de ese hashing. Pero si nota la fecha de nacimiento, no se cumplimentaron el nombre y apellido. Fecha de nacimiento, obvia porque no agregamos ese campo, pero FirstName y LastName no fueron cumplimentados a pesar de que proporcionamos datos. Entonces veamos cómo podemos rectificar eso. En primer lugar, voy a poner en el campo de fecha de nacimiento en el formulario. Y realmente no importa de dónde empieces a modificar desde que consigas todas las modificaciones hechas al final de la misma, entonces estás listo para ir por fecha de nacimiento. Acabo de establecer el tipo para que sea igual a la fecha para que podamos conseguir un selector de fecha en ese campo. Entonces modelo de entrada. Vas a ser fecha de nacimiento de tipo datetime. No voy a hacer que sea requerido. Creo que debería hacerlo requerido. Voy a hacer que sea requerido porque va a tener un valor predeterminado como hemos visto, que realmente no queremos, ¿verdad? Por lo que todo se requiere para que usted se registre con éxito en este sitio web. Entonces después de que hayamos hecho todo eso, quiero que los campos adicionales se almacenen en la base de datos. Fui a saltar hacia abajo a donde dice, Si el estado moderno es válido, entonces crea un nuevo usuario, dando el nombre de usuario correo electrónico y la dirección de correo electrónico. Puedo extender esto y ver y querido primer nombre debe ser ingresado desde el formulario punto primer nombre. Esto es algo que hemos hecho antes. Construimos sobre lo que queremos. El apellido es igual al apellido del punto de entrada. Y fecha de nacimiento es igual a fecha de punto de entrada de nacimiento. Ahí vamos. Después de hacer todo eso, lo que voy a hacer es probar, pero estoy viendo eso de un aquí fácil porque creé fecha de nacimiento como fecha. Pido disculpas, eso debió haber sido en efecto tiempo. Por lo que ten en cuenta tenemos dos cambios para mí del cambio lo que lobos en la base de datos. Después de que andamios ese campo en la base de datos. Y tenemos que ser atentos a eso. Pero creo que todavía podemos pasar por esta operación porque la base de datos sólo debería convertir eso a una cadena de todos modos cuando la reciba. Así que intentemos esto de nuevo. Vamos a saltar para registrarnos y Tyrone Cooper cambia eso hoy. Para editar tus ys son razones de prueba. Lo dejo y usaré mi contraseña al decir una o simplemente usar algo. Nacimiento 123, no hay problema que estaba en mi portapapeles. Así que sólo voy a reutilizar eso. Hacemos clic en Registrarse. Vale, los analizadores deben tener al menos uno. Por lo que ves esa es la fortaleza de la contraseña en el trabajo. Por eso dije p al firmar una sístole o D1, reutilizar ese click Registrarse. Están diciendo que no coinciden. Así que permítanme volver a intentarlo. Regístrese. Ahí vamos. Entonces no, incluso me está preguntando si quería ver si la contraseña solo ve si podemos movernos más rápido. Pero ves registrarse e iniciar sesión allí todavía no cambia porque todavía estamos en proceso de desarrollo de nuestra aplicación. No hay problema. Pero al menos vemos que funcionó un registro. Eso es uno. Lo pasaremos sin errores. Y si vuelvo a buscar en la tabla de usuarios de ASP NET, voy a ver que se han agregado campos adicionales. Por lo que ahora voy a ver mi fecha de nacimiento, el primer tema y el apellido. Y todo está empezando a unirse muy bien. 33. Configurar la página de inicio: Muy bien chicos, así que estamos haciendo estamos haciendo un buen progreso. El siguiente paso es configurar la página de inicio de sesión. Estoy empezando con esto arranca o porque todavía hay algunas configuraciones. Ahora tiene que entrar. Para nuestras cosas de inicio de sesión. Estamos hablando de lo que llamamos autenticación. Autorización significa ¿ puedes hacer esto? Autenticación significa déjame probar que eres quien eres. Cuando iniciamos sesión, es entonces cuando nos autenticamos. No obstante, lo que podemos hacer después de firmar es, estamos autorizados para hacerlo? A pesar de que la caja tenemos el middleware que se está utilizando ya para autorizaciones están al tope de eso. Voy a añadir otra línea que diga usar autenticación. Esto es lo que realmente va a dejar que ese gestor de inicio comience a trabajar de la manera que queremos que funcione. Otra cosa que queremos hacer es en los servicios de configuración y fue a decir servicios dot add autorización. Para que sepamos que ese servicio se está utilizando cada vez que se inicia una aplicación. Entonces con todo eso hecho, configuremos nuestra página de inicio de sesión. Ahora, una vez más, puedes configurar tu página de registro porque este es el formulario a un lado, solo está ocupando cuatro espacios. Y luego tenemos este otro div a los lados mixtos en ambas opciones adicionales de inicio de sesión, bla, bla, bla. Eso es tomar seis. Lo haría 66. Podría hacer uno más pequeño. Lo personaliza como desees. Por ahora deberías estar lo suficientemente cómodo como para conocer un todo, para extender el formulario, sostenerme los botones personalizar y cosas así. Entonces no voy a pasar demasiado tiempo haciendo eso. Lo que queríamos hacer, sin embargo, es agregar la página de inicio de sesión. Puedo volver a hacer clic derecho en áreas, hacer clic en Agregar, e ir por un nuevo manchado en el elemento, haga clic en identidad. Y después de que recopila toda la información que necesita, nos va a dar este cuadro de diálogo que nos permite simular dónde está login. Ahí vamos. Entonces tenemos esa página de inicio de sesión. Sólo voy a tomar el logo pH también login. Contamos con logotipos. Y una vez más, tienes una serie de páginas, has cambiado de ruta o la contraseña olvidada. Puede implementar una serie de cosas y mucho del código fuera de la caja es bastante resistente. No obstante, solo me estoy centrando en los que son absolutamente necesarios para superar lo que necesitamos para pasar. Iniciar sesión y cerrar sesión. Nuevamente, nuestro contexto DB es la clase contextual de base de datos, y luego seguimos adelante y pulsamos Agregar. Cuando se realiza esa operación , reabre el andamio. Léame, pero luego vemos que tenemos las páginas de inicio de sesión y cierre de sesión. Entonces veamos primero el logo. ¿ Por qué tomé un logo pH? Bueno, todo esto va a hacer es decir, si el usuario que está aquí está autenticado, entonces aunque ellos para hacer clic en logotipos, ¿qué pasa con el logo nucleico cuando hacen eso? Lo mismo en Administrador log salt y luego vuelve a la URL. Eso es lo que hace la página del logotipo. La página de inicio de sesión, Es una forma sencilla. Dame tu email, dame tu contraseña. ¿ Y quieres que te recuerde? Si no, bueno, si no lo haces. Déjame seguir adelante e iniciar sesión. Se está generando automáticamente enlaces para Olvidé contraseña. No lo vimos en ese expediente y no necesariamente vamos a implementarlo. No, eso está bien. Pero olvidaste tu contraseña registrarte como usuario son confirmación de correo electrónico reciente. Entonces todas esas cosas así como esta siguiente sección a la derecha, ¿qué tal opciones alternativas de inicio de sesión? Todas esas cosas vinieron de esta forma. Entonces el código de inicio de sesión detrás es muy similar al registro. Cualquiera de los permiten anónimos, personas bajas que no están autenticadas para llegar al discurso. Entonces tenemos inyecciones para nuestro gestor de usuarios e iniciar sesión Gerente. Tenemos el mismo tipo de formato con el modelo de entrada. Y el modelo de entrada se está utilizando aquí para simplemente quedarse el correo electrónico y la contraseña y establece aparte recordarme, On get, solo cargamos la página más o menos así es inicios de sesión externos simultáneos. No necesariamente necesitamos prestar atención a eso en este ámbito de este curso. Pero al hacer clic en Iniciar sesión, veamos qué pasa si todo es válido. Vamos y pedimos al administrador de inicio de sesión que inicie sesión usando la contraseña dada la dirección de correo electrónico, la contraseña proporcionada. Si la persona dijo Recuérdame. Y si tenemos local habilitado, local significa que si después de unos intentos fallidos, deberían cerrar tu condado, estoy seguro que te has encontrado con eso. Todo eso está incorporado, en esta biblioteca muy poderosa. Este curso no es tiempo suficiente para pasar por todas las capacidades de esta biblioteca. Por eso me estoy enfocando en las cosas grandes, más grandes y más importantes en este momento, ¿verdad? Después de que tratamos de decir si fue un inicio de sesión exitoso, entonces leemos Erich, la URL de retorno. De lo contrario, verificamos si lo es, si requiere autenticación de dos factores y saltamos esa interacción. No tenemos eso implementado. Si el usuario está bloqueado totes, los leemos que no tenemos eso implementado. Y si todo lo demás falla, entonces regresamos con el error del modelo, viendo el punto de cadena vacío como la clave. Fue un intento de inicio de sesión inválido y volvemos a pH. Si llega tan lejos, significa que no funcionó. Agradable y sencillo. Así que sigamos adelante y probemos o iniciemos sesión. Ahora ya tenemos algunos usos creados. Estoy seguro que tú y locos registrando a un número de usuarios desde que consiguió el registro para trabajar y ya ves, tenía un letrero, no solo lo sabía, acabo de cerrar la sesión. Así que probemos esto no login. Llegamos a la página de inicio de sesión. Genial. Yo sí dije que era admin en coche Booking.com. Permítanme creo que debería tener un cuatro al final de la misma, pero déjame intentar iniciar sesión. Y vas a ver que dice login no válido, intente comprobar la base de datos. No encontró esa combinación de nombre de usuario o correo electrónico y contraseña en absoluto. Permítanme poner en lo que creo que el correo electrónico adverso fue pesar de que nuestros propósitos solo hacen uno mejor para dejar de compartir de nuevo. Pero déjame intentarlo de nuevo. Haga clic en Iniciar sesión. No, estoy viendo algo más. Estoy consiguiendo que estos datos del tablero de errores sean nulos. Muy bien, así que entré en modo de depuración y volví a ejecutar esa operación. Y este es el error que estoy recibiendo, lo que tiene un poco más de sentido. Y creo que se está quejando de esto porque cambiamos fecha de nacimiento, fecha y hora, pero las herramientas de base de datos piensan que se encoge. Entonces esa es una solución fácil. Simplemente agregue una migración, cambiado DOB al tipo de fecha. Que haga la migración. migración es la columna de ruido TEN y alter para ese campo que en ese, por lo que actualizar la base de datos. Está viendo que fracasó porque no estoy permitiendo nulls. Entonces recuerda toda esa conversación sobre tipos de datos y notas. Eso está bien. No voy a presionar demasiado lo que voy a hacer ya que todavía estamos en fase experimental. Y puedes hacer a cualquier usuario que hayas creado. Simplemente encuéntralos a todos. Eliminar. Muy bien, en este punto, eso es importante, por eso están ahí y por lo tanto pruebas. Entonces estoy eliminando a todos los usuarios creados actualmente y luego solo voy a volver a ejecutar. Entonces a veces no tienes el lujo de hacer eso. Pero ya miramos cómo puedes dar pasos cuando no puedes eliminar todos los registros que ya tienes cuando querías hacer tal cambio. Entonces de todos modos, la actualización fue exitosa esta vez. Así que déjame sólo Controlar F5 e intentar esto de nuevo. Me fui tras registrarme primero y lo haré correctamente esta vez. Entonces fecha de nacimiento. Apenas hacer hoy admin, coche Booking.com. Esa es la palabra de moda después confirmar esta contraseña solo para tus ojos, esa es la contraseña. Y luego hacemos clic en Registrarse. Sabe, voy a guardar la contraseña y mirar ese hola Admin, no carbocation. Sepa que incluimos el anuncio. Todos usan la autenticación y el servicio para la autorización AT en el inicio, realidad empezamos a ver los cambios en la interfaz de usuario. Así que déjame cerrar sesión y voy a iniciar sesión ahora. Voy a usar el mismo admin, una reserva de auto, misma contraseña, click Iniciar sesión y miré eso. Estamos conectados. Logotipo funciona también. Ya ves, ahí acabamos de resolver ese problema. Por lo que ahora hemos arreglado el problema de registro en el futuro. No deberías tener ninguno de esos programas. Nuevamente, sabemos cómo iniciar sesión y cerrar sesión a voluntad. Lo siguiente sería ¿cómo evitamos que los usuarios que no están conectados lleguen a estas páginas? Porque en este punto, iniciar sesión no hace ninguna diferencia. Puedo ir a cualquier parte de la aplicación. Sin iniciar sesión. Tenemos que mirar cómo podemos atarlo en nuestros bloqueos, acceso a ciertas partes de la aplicación para usuarios no autenticados. 34. Autorización de configuración: En esta lección, estamos hablando de todo el fin de semana restringir el acceso a diferentes partes de nuestra aplicación para usuarios auténticos, autenticados y sobre autorizados y viceversa. Ahora esto suena más difícil de lo que realmente es. Y te voy a mostrar lo fácil que es lograr esto. No, sí tenemos funcionalidad de inicio de sesión y registro abierta corriendo, pero necesitamos poder administrar estas páginas. Entonces cualquiera debería poder llegar cómodamente a la página de inicio. Pero si hacen clic en autos, les debe obligar a iniciar sesión antes de que puedan proceder a mirar los autos y fácilmente a hacerse. Y es de manera muy fácil. Permítanme simplemente cerrar todas las pestañas que no son importantes en este punto y colapsar nada. Si no quiero que puedas llegar a la lista de autos. Todo lo que tengo que hacer está por encima del código de página para los autos. Agregue un atributo que diga autorizar la declaración de uso que falta. Eso es todo. Te dije que sería sencillo. Entonces echemos un vistazo a cómo funciona eso. Por lo que esto está por encima de la página de índice para autos que sí autorizo, lo que significa que no debería poder en un estado no autenticado, click en autos y ver la lista de tarjetas. Mira, mira lo que pasa cuando hago clic en autos va a, vale, bueno, vale, esto es anticlimáctico, pero ya ves que no se está comportando correctamente. En realidad está tratando de llegar a la pantalla de inicio de sesión. Ahora voy a saltar de nuevo a la aplicación, y sospecho firmemente que voy a tener que cambiar mi configuración. Nuevamente. Éstos son los de nuevo, esto de ida y vuelta. Es bueno porque cuando ves este tipo de flechas, te ayuda a inferir dónde necesitas ir para resolver estos problemas. Cuando agregamos servicios, recuerda que primero agregamos núcleo de identidad, y luego vimos que no venía con ciertas cosas fuera de la caja, razón por la que lo cambiamos a identidad. Esas cosas con las que no funcionaron bien. Fuera de la caja comenzó a trabajar en ninguna parte viendo otra cosa. El tema con la flecha que acabamos de ver es que está buscando la página de inicio de sesión en una determinada ubicación que no existe. Eso se debe a que las identidades sólo van a decir mirar en esa ubicación. No obstante, me gustaría que mirara en la ubicación predeterminada basada en el andamiaje. Entonces no quiero hacer muchas configuraciones y alterar cambiar el flujo normal de la aplicación. Por esa razón, puedo, en lugar de usar el núcleo de identidad o identidad, puedo usar la identidad predeterminada. Si nos fijamos en éste, dice agrega un sentido de servicios de identidad comunes a la aplicación, incluyendo nuestra interfaz de usuario predeterminada, que sería donde tenemos andamios nuestras cosas. Esa es la ubicación predeterminada. Proveedores de tokens. Recuerda, completa cuando estamos registrando nuestro barco, todo el proveedor de tokens y camina por la teacup o un juguete, falta y tenemos que incluirlo. Se incluye automáticamente con las opciones predeterminadas y configura la autenticación para usar cookies. Eso es lo que voy a hacer. Agregar identidad predeterminada. No, estoy recibiendo este error porque había predeterminado entidad en similar a las palabras clave de identidad solo toma t usuario, lo que significa que tengo que bajar manualmente aquí y ver agregar reglas. Nuevamente. Agrega reglas, y luego le damos la regla de identidad. Déjame ponerlo entre paréntesis. Ahí vamos adelante, regla de entidad, cerrar. No, estamos usando la biblioteca predeterminada para la identidad. Y éste, como dije, va a incluir ciertos impagos, Alt fuera de la caja que otras cosas no necesariamente lo hicieron. Tomemos otra puñalada en este experimento fue que hemos agregado autorizado el discurso del auto. No debería poder navegar por ahí sin haber iniciado sesión antes. Entonces si hago clic en autos, mira eso, es simplemente redireccionarme automáticamente a la página de inicio de sesión. Entonces, debido a que no teníamos el valor predeterminado, no estaba buscando en la ubicación predeterminada de la carpeta de identidad para encontrar los iconos e iniciar sesión. Entonces eso en realidad omitió esa parte, razón por la que conseguimos esta página. Nunca te mostraré algo o codifica un error sin explicar por qué lo conseguimos y cómo lo arreglamos. Así que ahora que estamos en la página de inicio de sesión, vamos a asegurarnos de que esa es nuestra funcionalidad de inicio de sesión todavía funciona. Sí, lo hace. Aquí está nuestro hola y no, no podemos ver la página, así que en ninguna parte autenticados y estamos autorizados a ver la página. Sería un poco tedioso aunque decir, Bueno, bueno, después del bloqueo para editar y los detalles y el Delete, porque en este punto, si quisiera editar un auto y me acordé de la URL para editar nuestro auto. A ver, no estoy autorizado y voy a autos y no autorizado. ¿ Qué es lo que estaba parado sobre el hombro de alguien mientras estaba? Editando nuestro auto y recuerdo la URL. En realidad puedo simplemente poner en esa URL y omitir toda la autorización para llegar a editar auto, lo cual está mal. En ese punto, tendría que agregar el atributo autorizar sobre cada página que quiero dejarlos configurados para hacer, para crear, tendría que hacer dos detalles más. Edita que cada uno de ellos, que no es necesariamente, me refiero a que funciona y puede ser práctico en una pequeña aplicación. Pero para mí, sólo se cansará fácilmente. Y es fácil para alguien olvidar colocar ese código por encima del código pH. Lo que podemos hacer es hacerlo a nivel global. En nuestra startup Weekend, agrega este bit de código o agrega un área de páginas Razor. posible que veas código variable entre cómo lo hace en las páginas de Razor y si alguna vez has tenido que hacerlo en MVC, y como ves en un montón, ya sabes, hay tantas maneras de lograr lo mismo . Simplemente encuentra el que funcione para usted y que sea lo mejor para su contexto. En esta situación, todo lo que tiene que hacer es ver las arterias son páginas. Empieza a aplicar esa misma opción. Objeto a aceptar. Sólo lo estoy llamando o en lugar de opciones. Entonces toda expresión lambda. Y en lugar de eso estoy diciendo todas las convenciones de puntos, dot carpeta autorizada, aguanieve. Hay una serie de cosas que puedes autorizar. Autorizar el área se puede autorizar un día completo, puede autorizar una página específica. Si usted tiene tal vez una página específica que desea tener reglas específicas es diferente de los otros Phs o una carpeta específica para jugar por diferentes, él puede agregar todos esos. Se llaman convenciones. Norma acaba de agregar una convención global a cualquier cosa después una barra y ver que se supone que debe ser autorizado. Por lo que esto va a ejecutar automáticamente básicamente agregar ese filtro autorizado sobre cada página en mi aplicación. La única forma de eludirlo es agregando o permitiendo el anonimato. Entonces te voy a mostrar eso ahora mismo. Entonces si elimino eso autorizado de la página de autos y un Control F5, déjalo correr. Vas a ver que debería haber aterrizado en la página de inicio. Necesita que me identifique si traté de ir a mezclar, quiere que lo firme sin importar a dónde vaya, tengo que iniciar sesión. Pero entonces si voy a registrarme, me permite ver la página de redistribución. Eso se debe a que el filtro llamado bajo anónimo está por encima de la predica del registro, ¿verdad? Entonces si salto y miro ya tienda, verás un bajo anónimo por encima de él. Entonces si agrego eso a, veamos, página de índice regular. Recuerda que empezamos con nuestra página de índice donde teníamos toda nuestra maravillosa cotización de clase div web más básica. Si quisiera que el usuario a Londres, al menos la página de inicio sin ninguna mantequilla. Pero en todas partes necesitan firmar, entonces todo lo que tengo que hacer es decir permitir anonimato. Entonces al hacer eso, si refresco y voy a la página de inicio, la página de inicio renderizará solo porque dije hola Anónimo. No obstante, si traté de ir a autos, no puedo llegar allí. Si traté de escribir una URL directa a autos slash edit con el ID 14. Tengo que iniciar sesión sin importar lo que haga, tampoco puedo ir a ninguna parte, ¿verdad? Sin privacidad. Quiere que inicie sesión para rectificar eso. Sólo necesito ir por encima privacidad y permitir el acceso anónimo. De repente le hace clic en Privacidad. En realidad me traerá a la página de privacidad porque personas anónimas son capaces de verla. Si inicio sesión y luego lo intento de nuevo, entonces está bien, páginas de inicio, buenos autos, y todo lo demás está disponible para su visualización. Entonces así es básicamente como podemos bloquear o aplicar y restringir acceso no deseado a áreas sensibles. 35. Añadir autorización: Muy bien chicos, así que creo que hemos hecho un buen trabajo de asegurar nuestra aplicación hasta este punto, hemos configurado con éxito el registro y el login, y hay mucho más que podemos hacer. Podríamos meternos en roles, podríamos meternos en restringir a los usuarios en base a ciertas políticas y reclamos. Hay tanto, tantas cosas que podríamos hacer. Pero tristemente, no quiero abrumarte con toda la información y todos los escenarios y así sucesivamente. Es mejor absorber tanto NO y experimentar con él. Y luego puedes ampliar tus conocimientos como necesites. Por ahora, sólo podemos hacer una revisión rápida de lo que implementamos. Empezando por nuestro usuario de identidad, la clase de usuario de la aplicación. Cuando estábamos configurando nuestra biblioteca de identidad. En este proyecto, tuvimos que heredar herencia cursi para el contexto DB del contexto de identidad DB. Y luego lo configuramos para heredar basado en el contexto del usuario de la aplicación. El usuario de la aplicación fue nuestra clase personalizada que nos encontramos para heredar del usuario de identidad, donde ponemos en campos adicionales que extenderían la tabla de usuarios en la base de datos. Hasta ahora no escribimos ningún código personalizado para manejar la creación del usuario o hash de la contraseña o incluso las capacidades de inicio de sesión. Todas esas cosas nos fueron entregadas fuera de la caja. Y el ancho, el margen de maniobra que pudimos modificarlos fuera de curso. Entonces después de hacer todo eso, andamiamos los cambios con unas migraciones, tuvimos algunas migraciones de campo ser algunos cambios, pero pasamos por todo eso. Y luego nos aseguramos de que configuramos la identidad en nuestra aplicación web, cual también pasamos por ciclos de identidad versus núcleo de identidad versus identidad predeterminada de AD, que es el que nosotros dijo que Louis, porque venía con las bibliotecas más preempaquetadas basadas en lo que tenemos que hacer. Entonces después de hacer todo eso, seguimos adelante e hicimos nuestras interfaces de usuario, modificamos algunas de ellas. Para el registro. Teníamos los comentarios, pensamientos, todo el código porque no era necesariamente aplicable a nuestro alcance actual. Por lo que eliminamos parte de ese código. Ponemos en las funciones y páginas de inicio de sesión y cierre de sesión. También obtuvimos un login cortesía parcial del andamio que agregamos a nuestra página de diseño, lo que nos da acceso a los enlaces de registro e inicio de sesión. Ahora con todo eso hecho, balas Zoom son buenos cambios. Y ver que agregamos inicio de sesión y funcionalidad a nuestra aplicación. Nuestros compañeros de equipo saben exactamente qué esperar cuando obtienen el código más reciente. Entonces sí inicié sesión y agregé funcionalidad y luego simplemente comprometemos todo y hundimos. Eso es todo para esta sección.