Desenvolvimento de Web básico Núcleo NET 5 | Trevoir Williams | Skillshare

Velocidade de reprodução


1.0x


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

Desenvolvimento de Web básico Núcleo NET 5

teacher avatar Trevoir Williams, Jamaican Software Engineer

Assista a este curso e milhares de outros

Tenha acesso ilimitado a todos os cursos
Oferecidos por líderes do setor e profissionais do mercado
Os temas incluem ilustração, design, fotografia e muito mais

Assista a este curso e milhares de outros

Tenha acesso ilimitado a todos os cursos
Oferecidos por líderes do setor e profissionais do mercado
Os temas incluem ilustração, design, fotografia e muito mais

Aulas neste curso

    • 1.

      Apresentação

      1:01

    • 2.

      Projeto de núcleo ASP.NET

      3:35

    • 3.

      Projeto de páginas de lâmina

      18:57

    • 4.

      Como entender a sintaxe

      12:19

    • 5.

      Mensagem de configurações

      7:51

    • 6.

      Como adicionar estrutura de entidade

      12:03

    • 7.

      Adicionar banco de dados

      14:32

    • 8.

      Aulas de banco de dados de andaimes

      13:05

    • 9.

      Adicionar projeto ao GitHub

      9:24

    • 10.

      Adicionar criar página de lâmina

      21:40

    • 11.

      Adicionar página de lâmina

      23:53

    • 12.

      Página de lâmina

      5:30

    • 13.

      Adicionar página Excluir lâmina

      22:30

    • 14.

      Como usar visualizações parciais e aprimoramentos de IU

      33:11

    • 15.

      Como adicionar alterações ao GitHub

      1:26

    • 16.

      Gerenciar alterações de banco de dados usando estrutura de entidades

      22:15

    • 17.

      Melhorias de formulário - parte 1

      24:20

    • 18.

      Melhorias de formulário - parte 2

      12:19

    • 19.

      Como melhorar formulários e validação de coleta de dados - parte 1

      26:35

    • 20.

      Como melhorar formulários e validação de coleta de dados

      18:47

    • 21.

      Adicionar listas pendentes com JQuery - parte 1

      24:03

    • 22.

      Adicionar listas pendentes com JQuery - parte 2

      16:33

    • 23.

      Consertar exibições de rótulo de dados

      6:42

    • 24.

      Como limpar a interface do usuário

      31:15

    • 25.

      Repositórios de acesso a dados

      25:57

    • 26.

      Adicionar primeiro código de repositório

      16:46

    • 27.

      Páginas de refatoração

      14:20

    • 28.

      Repositórios completos

      21:24

    • 29.

      Conclusão de seção de repositório

      9:46

    • 30.

      Configuração de autenticação

      10:54

    • 31.

      Como estender a tabela de usuários

      4:53

    • 32.

      Página de registro de configuração

      20:25

    • 33.

      Página de login

      9:45

    • 34.

      Autorização de configuração

      9:34

    • 35.

      Adicionar autorização

      3:09

  • --
  • Nível iniciante
  • Nível intermediário
  • Nível avançado
  • Todos os níveis

Gerado pela comunidade

O nível é determinado pela opinião da maioria dos estudantes que avaliaram este curso. Mostramos a recomendação do professor até que sejam coletadas as respostas de pelo menos 5 estudantes.

93

Estudantes

--

Projeto

Sobre este curso

Neste curso, você vai aprender a desenvolver um aplicativo usando ASP.NET Core 5.

Este curso vai construir na sua base de programação HTML, CSS, JavaScript e C#.

No final deste curso, você vai saber como:

  • Como criar um aplicativo web com ASP.NET Core
  • Proteja um aplicativo web com login e registro
  • Aprenda conceitos avançados, como injeção de dependência e princípios SOLID na programação
  • Conecte seu aplicativo web a um banco de dados do SQL Server
  • Use o Bootstrap para embelezar seu site.
  • Use JavaScript e jQuery em seu site de forma eficaz.
  • Aprenda a usar o GitHub para gerenciamento de controle de fonte

Venha comigo nesta jornada e aprenda a criar um aplicativo web dinâmico, orientado a dados e SOLID.

Conheça seu professor

Teacher Profile Image

Trevoir Williams

Jamaican Software Engineer

Professor

Habilidades relacionadas

Desenvolvimento Desenvolvimento web
Level: All Levels

Nota do curso

As expectativas foram atingidas?
    Superou!
  • 0%
  • Sim
  • 0%
  • Um pouco
  • 0%
  • Não
  • 0%

Por que fazer parte da Skillshare?

Faça cursos premiados Skillshare Original

Cada curso possui aulas curtas e projetos práticos

Sua assinatura apoia os professores da Skillshare

Aprenda em qualquer lugar

Faça cursos em qualquer lugar com o aplicativo da Skillshare. Assista no avião, no metrô ou em qualquer lugar que funcione melhor para você, por streaming ou download.

Transcrições

1. Introdução: Olá e seja bem-vindo a este curso, desenvolvimento web básico com ASP.net Core F5. Sou seu instrutor do VOR Williams e sou engenheiro de software e palestrante neste curso, vamos aprender sobre o ASP.Net Core, que é uma estrutura web gratuita e de código aberto. E também é o sucessor do ASP.net, que é desenvolvido pela Microsoft. Neste curso, também estaremos procurando conectar nosso aplicativo ASP.net Core a um banco de dados do Microsoft SQL Server. Para fazer isso, vamos analisar o Entity Framework, que é uma biblioteca especialmente projetada para esse tipo de interação. Também vamos analisar o controle de origem, que é uma prática de caminhões e gerenciamento de mudanças para que a escola de origem usará o GitHub como a ferramenta para facilitar essa prática. Este curso pressupõe que você tenha conhecimento fundamental em HTML, CSS e C-sharp. Se não, então eu encorajo você a conferir meus outros cursos sobre esses tópicos. Com tudo isso dito e feito, vamos começar e mal posso esperar para vê-lo no curso. 2. Configure projeto de Core ASP.NET: Bem vindos de volta pessoal. Nesta lição, estaremos apenas preparando nosso ambiente de desenvolvimento para nosso aplicativo ASP.net Core. E o que eu gostaria que você fizesse é clicar em Iniciar e digitar o Visual Studio Installer. Você já tem o Visual Studio instalado. O que precisamos fazer é instalar mais algumas cargas de trabalho para que possamos começar a aumentar o desenvolvimento. Não, depois de colocar o instalador, você verá uma janela parecendo algo semelhante a esta. E o que você pode fazer é clicar em Modificar. E quando você clicar em Modificar, você verá uma lista de possíveis cargas de trabalho que você pode instalar. Então você já tem aquele para desenvolvimento de desktop. O que você precisaria é aquele para ASP.net e desenvolvimento web. Então, se você ainda não o tiver marcado, ele pode ir em frente e pegá-lo e depois ir em frente e instalar. Então você pode ver que eu já tenho a minha parada para fazer isso e você pode instalar outras cargas de trabalho. Mas para este curso específico ou para as próximas lições, definitivamente queríamos ter o ASP.net e o desenvolvimento web marcados e instalados. Agora, depois de concluir essa instalação, você pode prosseguir e iniciar seu Visual Studio. E a partir daí vamos criar um novo projeto. Assim, você pode ir em frente e criar um novo projeto. E estamos procurando um aplicativo web ASP.net Core. Assim, você pode simplesmente digitar a pesquisa ASP.NET Core Web App. Então você verá alguns deles. E você notaria que você tem o aplicativo da Web que usa as páginas do Razor. Você também tem o aplicativo web principal que usa o controlador de visualização modal. E então você tem a API da Web e você tem vários outros modelos. À medida que você obtém mais experiência, você pode experimentar os diferentes modelos. Mas para isso, é claro, vamos ver o aplicativo web ASP.net Core usando as páginas do Razor. Podemos ir em frente e acertar isso. Vá em frente e clique em Avançar. E vamos chamar esse projeto de carro inicializando. A ideia geral por trás dos projetos será que estamos construindo um aplicativo que permita que as pessoas reservem ou alugem um carro de uma empresa conforme necessário. Desculpe, é uma habilidade agradável e simples será maravilhosamente complicada o suficiente para obtermos os fundamentos sob nossos cintos. Então, podemos simplesmente ir em frente e clicar em Next. E vamos usar dotnet F5. E então você pode ativar a compilação de tempo de execução do razor, o que nos ajudará com nossa depuração e teste. Não vamos sentar a autenticação agora. Faremos isso manualmente mais tarde para que possamos ver todos os componentes que se encaixam com essas configurações no lugar. Você pode ir em frente e clicar em Criar. Agora que temos nosso projeto em funcionamento, o que vamos fazer é dar uma olhada rápida no que recebemos da caixa. Obtemos essa estrutura do projeto. E quando você clicar em Iniciar, você notará que obtemos um aplicativo web pronto. Temos o aplicativo da web, temos nossa barra de navegação no topo, a área de conteúdo. Portanto, é muito semelhante ao que teríamos visto quando estamos analisando o básico do desenvolvimento HTML, HTML. Neste ponto, não escrevemos nenhum código, mas ainda temos uma página da Web com pelo menos duas páginas para o nosso prazer de visualização. Vamos analisar o básico do que obtemos da caixa. Embora tudo isso seja gerado onde encontramos o que fica por aqui e faz quando surgirmos, estaremos explorando a estrutura de pastas que obtivemos com este aplicativo web e o que todos esses arquivos significam e representam. 3. Projeto de passeios à bandeira: Tudo bem, então estamos de volta. Vamos discutir a dinâmica ou pelo menos uma estrutura de pastas e os diferentes arquivos que obtemos em nosso aplicativo ASP.net Core. Você já passou e analisou HTML e CSS e JavaScript e como todos esses fatores se combinam para fornecer um site e a rede de fundos. Você coloca um novo projeto em uma pasta 12, tende a colocar os diferentes tipos de ativos, as imagens em sua própria pasta, arquivos CSS em sua própria pasta, etc Bem, isso é apenas baseado nesses princípios. Você também teria visto que durante os exercícios de codificação C Sharp onde cada vez que você estava criando um projeto, você tem uma nova pasta onde todos esses arquivos do projeto teriam sido. É o mesmo princípio ou solução em uma pasta por si só, o projeto é suficiente por si só. E, em seguida, há arquivos e pastas diferentes em vez daquela outra pasta. Vamos começar observando as propriedades. As propriedades nos fornecem essas dependências de arquivos que têm a ver com bibliotecas e estruturas. Você verá mais disso à medida que avançamos. Eu não vou aborrecer, você sabe, ou sobrecarregar com isso. Mas se você olhar para as propriedades, verá que você tem um arquivo JSON que tem algumas configurações de inicialização, então você geralmente não precisa modificar esse arquivo sobre isso, você está fazendo algo muito explícito, o que não estamos fazendo agora e provavelmente não faremos por isso dentro do escopo deste curso. Mas é bom apreciar o que está aqui. Você verá que você tem o URL do aplicativo Canadá definido aqui, onde diz que você tem o URL em um endereço HTTP e, em seguida, você tem a porta SSL, que significa que quando apertamos Iniciar, estamos para poder acessar o aplicativo digitando este URL ou HTTPS dois pontos barra host local com o número da porta das portas SSL, geralmente não é necessário alterar isso. Então, é bom entender isso mais uma vez. A próxima pasta principal é nossa pasta raiz www. Portanto, não se parece com uma pasta baseada em espera. As outras pastas realmente olharam nessa estrutura do projeto, mas o que você perceberia é que ela tem subpastas nela. Portanto, esta é uma pasta que armazena os arquivos estáticos do site. Então, quando dizemos arquivos estáticos, como você pode ver, ele é a pasta CSS , a pasta JS e outro chamado salto. Todos esses ativos e os arquivos CSS, arquivos JavaScript ou bibliotecas de terceiros que podem ser uma combinação de arquivos CSS e JavaScript ou jQuery. Você gostaria de armazenar todos eles dentro da raiz www porque o próprio aplicativo mapeia esse local e facilita o acesso a esse local quando você deseja acessar o CSS, o JavaScript ou qualquer um dos outros arquivos de ativos. Assim, você pode ver vem incorporado já feito com bootstrap, jQuery, validação jQuery e outra biblioteca para validação jQuery. Então, todas essas bibliotecas meio que saem da caixa. Se quisermos adicionar outras bibliotecas, o que faremos mais tarde, sempre podemos clicar com o botão direito do mouse e podemos ir para Adicionar. E, em seguida, há um recurso para instalar a biblioteca do lado do cliente. Quando chegamos a esse ponto, podemos realmente usar isso e procurar nossa biblioteca. E isso nos mostraria todos os resultados, como podemos instalá-lo no aplicativo sem consultar manualmente e pescar. Então lembre-se quando estávamos fazendo nossa inclusão jQuery e assim por diante molhado para realmente ir ao site, obter o arquivo e copiar localmente ou usar uma CDN. Ao usar esse gerenciador de bibliotecas. Podemos fazer tudo isso aqui com apenas alguns cliques. E, na verdade, apenas baixaria para o nosso sistema ou para nossas pastas de projetos para nós. Tudo bem, então é aí que todos os nossos arquivos estáticos são realmente mantidos. Saiba se você já viu um aplicativo MVC, você estará acostumado a ver pastas de modelo, visualização e controlador fora da caixa. Se não, tudo bem. Mas a diferença entre o modelo de controlador de visualização de modelo ou MVC e o modelo de páginas Razor é importante que a forma como as páginas e seus ativos são estruturados é diferente. Com o MVC, você tem o modelo que é um arquivo de classe demais. Você tem a visualização, que é o arquivo HTML. E então você tem um controlador que era a inteligência. Nas páginas Razor. O que eles fizeram foi dar uma pasta chamada páginas e, em seguida, cada página vem com o CSS HTML ou o arquivo HTML, bem como o arquivo de código R, que funciona como inteligência e modelo. Vamos dar uma olhada na página de índice. A página de índice. Lembre-se do HTML Basics, sempre nomeie seu índice da primeira página. Bem, aqui está a Microsoft fazendo jus a esse princípio muito simples. Então, quando clico na página de índice, no arquivo HTML CSS, você verá que isso é realmente apenas um arquivo HTML. Sim, tem alguns enfeites, mas uma vez que você supere isso, o que discutiremos mais tarde, você notará que elas são as mesmas tags que teríamos aprendido com o HTML Basics. A tag div, a tag de imagem, a tag P e todos os outros destinos que você saberia, eles são todos utilizáveis dentro deste arquivo, o CSS de ponto, o arquivo CSS de ponto HTML. Parece o código C-Sharp que acabamos de olhar. Tudo bem, então temos a classe pública chamada modelo de índice dois pontos. Isso é chamado de herança. O modelo de índice está herdando do modelo de página, que é uma classe base que vem incorporada. Mas o fato é que isso é chamado de modelo de índice. E se você der uma olhada na classe de índice, notaria que na parte superior diz uma, eu sou uma página e, em seguida, duas, diz ao modelo. Você percebe uma declaração de que meu modelo é modelo de índice. Isso significa que qualquer coisa que eu seja definida em vez do modelo de índice pode ser acessada a partir da página da Web à medida que construímos nela. Você vai apreciar isso um pouco mais. Na maioria das vezes, quando você vê IRAs são mais páginas, se não todas as vezes, então você os verá em pares. Você verá que é HTML CSS de ponto. Sou o único que é HTML CSS de ponto. Com base no seu Visual Studio, você pode tê-los aninhados por padrão, mas você pode alternar esse aninhamento. Saiba que está desativado para mim, eu posso ativá-lo. Eu costumo pensar que isso é um pouco mais limpo, porque quando está aninhado, eu posso simplesmente clicar e, em seguida, vejo o arquivo resultante diretamente abaixo desse. Às vezes, fica confuso quando todos eles estão listados assim, mas isso depende de você. Só estou mostrando que você pode listar, você pode aninhar e desabilitar isso à vontade. Então, como eu disse, toda vez que você criar uma página, ou pelo menos uma página de resultados padrão, você vai acabar com os dois arquivos conhecendo a pasta compartilhada. É aqui que os arquivos que serão usados ou acessados por todos os outros arquivos, todas as outras páginas, é aí que eles são armazenados. Vamos dar uma olhada no layout. Não, você teria notado que, com nossa página de índice, deixe-me apenas pular buffer com índice rapidamente. Você teria notado que a página de índice não tem aquela estrutura de esqueleto HTML que discutimos a partir do básico. Lembre-se de que sempre começamos com fita adesiva e depois as tags HTML e, em seguida, apertar e corpo e depois colocamos o conteúdo, isso vai direto para o conteúdo. O que acontece é que eles estão usando o que chamamos de layout. Ou antigamente chamamos modelo ou obra-prima, onde eles colocam o temporário uma vez em vez de repetir, repetir, repetir este modelo a cada PDF, 20 páginas, você tem que repetir esse modelo? Sim, em um site básico, é absolutamente necessário. Mas o que eles fizeram foi tipo de resumos que trabalham ocupados. Lembre-se, mais uma vez, as estruturas são configuradas para reduzir a quantidade de repetição ou reduzir a probabilidade de você ter que repetir certas coisas. Porque eles sabem que você tem a ver com esse modelo HTML todas as vezes. Quando eles desenvolveram um.the.net Core Framework, o que eles fizeram foi que eles criaram mesmo tempo e então eles permitiram que você ao mesmo tempo e então eles permitiram que você renderizasse os diferentes pH dentro dessa área chamada render body. O que realmente acontece é que cada página sempre terá a tag HTML, a tag head. Isso é definido globalmente COC, está sempre vinculado às folhas de estilo para que você não precise fazer isso em cada página. Você tem a tag body que vai ter a orelha do cabeçalho com o nervo, então você não precisa criar o suficiente em cada página. E então você sempre terá essa aula de div com contêiner. Lembre-se de que olhamos para isso, essa classe div é igual ao contêiner. E então sim, você verá algumas novas tags. Você pode usá-los, talvez nunca os use neste momento. Você realmente não precisa. Estou preocupado com isso, mas o ponto é que qualquer motivo pelo qual o PG criar com ser renderizado automaticamente dentro dessa área, está dentro desse modelo geral. Para ler você aqui mudará o local, os Layouts, desculpe, fora de todas as páginas globalmente. Essa é uma maneira mais fácil de manter seu site, porque agora você não precisa fazer isso em todas as páginas, como teríamos visto quando estamos fazendo o HTML e CSS básicos. Tudo isso é meio que colocado aqui. Você vê as inclusões de script na parte inferior da página e pode modificar tudo. Então, vamos ver, por exemplo, que o que foi gerado automaticamente para nós seria o título Exibir dados da página. Se voltarmos à nossa página de índice, veremos que o tipo de dados de visualização é igual à página inicial. Isso é o que seria renderizado em vez do título de dados. Então isso é como uma variável e um espaço reservado para o que estiver colocando em qualquer pH que tenhamos. Mais uma vez, título é o que é exibido no navegador na banheira. Eu queria mudar isso de um pouco de texto para o aplicativo de reserva de carro. Um pouco mais legível por humanos. Mas esse é o título na barra de navegação, desculpe, na banheira do navegador, então a barra de navegação também tem carboidratos olhando para cima escrito aqui. Então, o que vou fazer é controlar e F5 e essa tala para executar sem depuração. E quando este aplicativo aparecer, a primeira coisa que eu quero que você tome nota é o fato de que isso está dizendo homepage. Então, isso está carregando a página de índice. Caso você não acredite que existe. Indexe diz homepage, certo? Então, ele está carregando a página inicial ou o aplicativo de reserva de carros traço da página de índice. São textos estáticos que colocamos no título. Tudo bem, e se eu quisesse atualizar esse pedaço de texto aqui? Eu também não quero dizer carboidratos ligando lá em cima. Então. Eu posso ir e encontrar esse pedaço de código que está bem aqui. E vou alterá-lo para o aplicativo de reserva de carro. Vou salvar algum humor. Sempre salve. Infelizmente, não os vi implementar nenhum AutoCAD no Visual Studio. Isso teria sido muito legal, mas acho que não o fizeram, eles não fizeram isso por uma boa razão. Mas depois de fazer essa alteração, vou apenas controlar, atualizar meu navegador. E eis vemos a mudança sendo feita e essa mudança mais uma vez, essas globais. Então, se eu continuar com a privacidade do Go on home, cada uma dessas páginas está apenas herdando do layout geral. Então, vou também atualizá-lo no rodapé. Eu posso simplesmente ir lá, mudá-lo no rodapé. Se alguma coisa, eu queria trapacear e cortar. Quero dizer, isso é dizer 2021 se eu precisasse atualizá-lo para 2022 ou não exibir apenas privacidade, colocando o que eu preciso colocar, tudo isso está sendo atualizado globalmente. Então, depois de fazer essa alteração, vou atualizar mais uma vez. E você vê que a mudança não está refletindo. É assim que é fácil realmente modificar globalmente, certo? Agora, se você quisesse modificar as páginas, bem, é apenas um monte de HTML. Então aqui está o que eu fui fazer. Vou executar o HTML antigo da nossa classe básica que tínhamos em nossa página de índice. E vou colocá-lo nessa nova página de índice e vamos ver o que acontece. Então aqui está nosso HTML do básico. O que acontece mais uma vez é que não precisamos de todas essas tags. Vai precisar disso, do corpo HTML tudo o que eu realmente quero. Nem preciso do contêiner. Lembro-me que tivemos que repetir Kantian ou temos que repetir o romance em todos os lugares. E depois adicionamos uma div para o conteúdo. Bem, o que está no conteúdo é o que realmente precisamos, que é o que é exibido na página. não precisamos de um rodapé porque temos nosso rodapé. Só vou pegar todo esse conteúdo. Não estou realmente preocupado com o funcionamento do botão ainda não. Bem, o que vou fazer é apenas substituir o conteúdo padrão que veio com tentativa de conteúdo OER do nosso curso. Fui salvar isso e depois fazer uma atualização de olhar para isso. Em nenhum lugar vendo que podemos simplesmente modificar as páginas da mesma maneira. A única coisa é que não precisamos repetir nosso esqueleto toda vez que isso é feito por nós. Só precisamos do conteúdo. E observe que todas as aulas ainda funcionam para as exibições dos botões e para os cães e a fonte. Por quê? Porque o arquivo CSS do Bootstrap já está incluído fora da caixa. Eles já estão nos dando esse arquivo bootstrap. Agora, uma coisa é que chegamos às cinco. Isso pode mudar no futuro, mas o nó certo que a biblioteca bootstrap é, eu posso perfurar todo o caminho e ver a gordura física. Então, quando eu disse, eles facilitam o acesso. Tudo o que você realmente precisa é dessa barra de til. E então ele começará a fornecer todas as pastas na hierarquia de pastas de dub, dub, dub root. Se eu quisesse acessar o arquivo CSS que está no CSS do meu site, ou eu quisesse acessar a pasta CSS e vou dizer hoje, depois barra, e então ele começa listar todas as pastas para mim. Eu queria chegar ao arquivo CSS. Tudo bem, então é por isso que eu disse que todos os seus arquivos estáticos que você precisa acessar podem entrar na pasta dub, dub, dub root, e isso facilitará muito. Mas eu estava fazendo o ponto de que podemos perfurar todo o caminho até o arquivo bootstrap. E a versão Bootstrap que recebemos fora da caixa é 4.3.1. No básico, olhamos para usar cinco, mas com este modelo só conseguimos bootstrap, florestas de bootstrap, desculpe, o que não é grande coisa porque as diferenças entre os dois não são tão grandes de um acordo. E a documentação está sempre lá no caso você estar usando algo de um que não está disponível no outro, como você não me vê tentando usar o Bootstrap para classes que não estão no Bootstrap F5, você sempre pode verificar isso. Tudo bem, agora que temos uma melhor compreensão de como o layout e os arquivos funcionam em geral. E há outros arquivos lá, importações de visualização conduzida e o início da visualização. Se você começar basicamente diz apenas use esse arquivo de layout. Então, se tivermos vários layouts, podemos realmente criar outro layout. Se você quisesse que um tipo de usuário visse um layout e outro tipo de usuário para ver outro layout ou ter layouts diferentes por página, seja lá o que for, você pode realmente ditar qual aqueles devem ser usados. Todas essas coisas virão no devido tempo. Então, vou continuar o tour dos arquivos e pastas. E vamos passar para o aplicativo settings.js. No aplicativo settings.js, o Zen é como um arquivo de configuração onde basicamente estipulamos coisas como strings de conexão. Você sabe, onde procurar o banco de dados em configurações estáticas que precisamos ter em vigor para garantir que determinados recursos sejam executados de maneira específica. Todas essas coisas podem ser definidas nesse arquivo de configurações do aplicativo. Temos o program.cs, que é muito semelhante ao que teríamos visto em nosso C-Sharp em diversos, onde toda vez que criávamos um novo projeto, tínhamos um arquivo chamado program.cs que empatou método up chamado média. É a mesma coisa, program.cs, E aqui está nosso principal método. Então, tudo o que acontece é que quando você acerta IS Express nosso início de calor, basicamente apenas chamando o programa, chamando o método médio. E o método principal diz construir e executar o aplicativo. Então, onde ele sabe quais configurações colocar em prática? Ele usa o arquivo de inicialização e o arranque aqui representa a inicialização sobre o arquivo CS, que é outro lugar onde as configurações vivem. Aqui no construtor de inicialização, você vê que eles estão fazendo o que chamamos de injeção. Então, mais tarde, você entra em um padrão, mas eles estão injetando um objeto de configuração de IA que representa OER no arquivo JSON settings.js. Para que, se quaisquer configurações estáticas que colocamos lá, possamos acessá-las e, em seguida, via código até que ele use essa configuração quando você estiver inicializando esse recurso. Portanto, o arquivo inicial é basicamente onde toda a inicialização do recurso ocorre. Como você vê aqui, estamos vendo endereço de ponto de serviços ou páginas mais tarde quando estamos adicionando autenticação e outras coisas ao projeto, você verá que temos que entrar aqui e informá-lo. Ok, use este módulo, use este middleware, use esse recurso que vamos adicionar a este arquivo à medida que o aplicativo crescer. O ponto de inicialização css realmente apenas encarregado de ditar o que deveria estar em vigor no momento em que o aplicativo é iniciado. Então, se eu estragar qualquer coisa neste arquivo ou certas coisas neste arquivo, se eu entrasse nessa linha pois não acho que essa linha pareça útil. E então eu tentei executar, então ele estará recebendo esse erro dizendo que há alguma incompatibilidade entre o que eu quero fazer e quais recursos estão disponíveis para mim sem tentar ler esta palavra de seta -palavra. É basicamente que vi que você está tentando executar inicializar a compilação de tempo de execução, mas não vi onde você me disse que eu posso usar o conjunto de recursos para compilação em tempo de execução. Essa linha que comentei é parte integrante dos recursos que precisam ser chamados em outro lugar do aplicativo. Então, à medida que você avança e entende que o WHO.NET Core funciona, você entenderá quais bibliotecas precisam ir para onde. Mais uma vez, isso não é algo que você precisa memorizar. Você só precisa ter uma boa ideia de como essa coisa funciona para que, quando quiser um novo recurso, você possa pesquisar corretamente para descobrir o que exatamente você precisa incluir para colocá-lo em funcionamento . É isso mesmo para o tour da estrutura de pastas. Quando voltarmos, começaremos a trabalhar um pouco mais em nossa interface e explorar como tudo está conectado. 4. Entendendo a sintaxe de cavalo: Bem-vindo de volta pessoal. Nesta lição, veremos como podemos experimentar nossas matrizes de pêssegos. Eu ignoro modificador de pH ou barra suficiente, e até vejo como provavelmente podemos injetar nossa perturbação em lugares diferentes, semelhante a como vimos isso sendo injetado na inicialização. Então, vamos começar com o escopo do que queríamos. Então, vou criar uma página muito simples. Estou apenas fechando todas as instruções descritas. E então, nas páginas, vou criar uma nova pasta. Portanto, isso é sempre uma boa ideia porque quando você tem as diferentes áreas, o que acontece é que você tem três operações principais. Crie, leia, atualize, exclua. Então, na maioria das vezes, você deseja criar uma pasta. E então, dentro dessa pasta, você teria as diferentes páginas para suportar os diferentes recursos. Já que estamos fazendo reservas de carros, a primeira coisa que provavelmente precisaríamos ter seriam os carros. Tudo bem, então vou ter uma pasta chamada carros. E dentro desta pasta para os carros, eu teria um arquivo de índice que representaria a primeira página em que você pousa quando você vota para olhar para carros, que geralmente seria como a lista de carros. Você tem a edição, você tem a exclusão e precisa ler, que significa que estou olhando para detalhes de um carro específico. Não estamos prontos para entrar em todas essas complicações. Estou apenas explicando por que temos essa estrutura de pastas que você verá isso como um tema comum ao longo deste curso e na maioria dos aplicativos da web, independentemente da tecnologia ou do estoque usado dentro de carros, vamos criar um arquivo de índice. Então, vou apenas seguir em frente e clique com o botão direito do mouse e clique em Adicionar página de barbear. E o que estamos fazendo aqui é usar as ferramentas de andaimes. As ferramentas de andaimes nos permitem gerar arquivos. Acho que a Microsoft viu que conhecemos o tipo de arquivos que queríamos, nossa estrutura. E essas são coisas que você teria repetir manualmente h vezes. Então aqui está a ferramenta de andaimes. Use isso e faremos a maior parte do trabalho pesado, colocando todo o B6, certificando-se de que você não se esqueça nada e você pode continuar a partir daí. Então eu acho que foi por isso que eles nos deram essa boa ferramenta. Vamos apenas criar um pH de resultado vazio para não, eu fui clicar em Adicionar e vou chamá-lo de index.html, CSS HTML, e ele já está lá para mim. Então, vou seguir em frente e clicar em Adicionar. Então agora eu tenho esse novo arquivo de índice. Então, se olharmos novamente, vemos páginas slash cars slash index que estou apenas dando você uma ideia do URL porque o index sempre será o primeiro arquivo. Então, quando vamos para carros de corte, ele procurará automaticamente o arquivo de índice para carregá-lo primeiro. Tudo bem, então o que queremos fazer aqui, vou dizer Visualizar dados. Nós vamos digitar essas coisas manualmente nós mesmos. Fui dizer título. Lembre-se de que é visualizado, o tipo de dados é um espaço reservado que alimenta o layout. E eu só vou ver a lista de carros. Tudo bem? O que eu quero fazer é apenas dizer H1, lista de carros, algumas coisas simples. Não estamos prontos para ficar muito complicados ou apenas suar ou apetites e entender o que, e se você olhar para esta página de índice, verá que ela se parece muito a outra página de índice. O motivo pelo qual as páginas de índice não estão tocando é que as subpastas em que elas estão são diferentes. Esse índice está nas páginas gerais, então esta é a página inteira de todo o aplicativo. No entanto, quando entramos nos carros de corte, os carros de esmagamento terão sua própria primeira página e arquivo de índice está fazendo para ser diferente, mas verá que eles têm os mesmos 2s diretos. Esta é uma página, aqui está um modelo e usando o namespace lá para este modelo versus o namespace para o outro. Mais uma vez, obtemos nosso código por trás do arquivo para nosso modelo de índice. Se eu quisesse navegar para esta nova página, o que eu precisaria fazer é modificar meus alelos e deixar a barra de navegação ter o novo link. Então, vou copiar um que existe lá está. Vou apenas copiar o link da página inicial existente e alterar tudo para ver para que não tenhamos uma área. Temos a página ASP. Onde o ASP é pago? Portanto, as páginas ASP não cortam mais o índice. É o índice de barra de carros de corte. Observe que não precisamos necessariamente da extensão onde não precisamos da extensão. Então é aqui que eles meio que obstruíram algumas das coisas que estamos acostumados com BA, HTML básico. Porque se você olhar para ele com cuidado, não há etiqueta de deriva H aqui. Não dizendo que não podemos usar uma natureza se pudéssemos. Poderíamos dizer que h é igual a bunda. Se vamos ver hf é igual a construir o URL exato para ir de aplicativo para página é que os carros vão ser um pouco difíceis porque não podemos ser um pouco difíceis porque não podemos apenas ver o nome do extensão como não conseguimos CSS e HTML básicos. Então, o que eles nos deram são chamados de auxiliares de tags, onde eles dirão apenas 0 me com base no caminho da estrutura de pastas. E vou gerar esse H ref para você. Então a página ASP é igual a, e eu sei que tenho que ir para carros de corte. Portanto, a primeira barra significa a raiz do aplicativo. Então eu tenho que ir para a pasta de carros. Não precisei ir para o arquivo de índice. É aí que esse link deve levar. Ele gerará o riff H em tempo de execução. Veremos isso em alguns. Então eu quero que isso diga carros. Tudo bem, então agora temos um novo URL com uma nova página. E eu vou seguir em frente e correr como, oh, estamos apenas fazendo coisas de interface do usuário. Podemos apenas fazer o Controle F5. Não precisamos depurar toda vez porque esse caminho é um pouco mais rápido. Agora estamos carregando nossa página de aplicativos. Lembre-se de que esta é a nossa página inicial que migramos de nossos arquivos estáticos. E se você quisesse migrar os outros, e eu provavelmente também vou ser uma boa prática para você. Mas agora estamos começando com isso. E então quando clico em carros, antes mesmo de clicar em carros, é inspecionar elemento. Inspecionar elemento vai nos mostrar o H ref de como chegamos lá. Se você olhar para o medo dos átrios, ele diz barra de EHR, isso significa ir para casa. Slash cars significa meta a partir do URL base, que é o que vemos no navegador, localhost com esse número de porta carros de barra. Se olharmos para este, você verá a privacidade da barra do host local. Quando eu vou em frente e bato nos carros. Então vejo que estou chegando na minha nova página, que é a lista de cartões. Você vê que nem precisava dizer especialmente index.html. Porque, por padrão, o navegador em todos os lugares irá para a página de índice primeiro. Então, isso é realmente tudo o que é preciso para criar um novo link e fazer com que as páginas se vejam. Tudo bem, agora vamos olhar para manter o arquivo de código e o arquivo HTML pode interagir com ele. Agora estou exibindo essa lista de texto de carros diretamente na página. Isso pode nem sempre ser o caso como vimos quando estávamos fazendo a codificação C Sharp. Às vezes, os dados que precisam ser exibidos ou interagidos com essas dinâmicas da entrada do usuário. Ele precisa estar em uma variável de alguma forma, mas ainda precisamos exibi-la. Então, e se eu quisesse colocar esse pedaço de texto em uma variável no arquivo de código e depois exibi-lo. Então, vou cortá-lo no arquivo de código. O que vou fazer dentro da nossa classe é dar a ela uma nova propriedade. Então eu vou apenas dizer prop, pressione Tab duas vezes e depois digo string. E isso vai ser atingido, em seguida, em obter um, a página carrega esse método chamado get é o primeiro método que é chamado. Toda vez que você navegar para uma página, você vai clicar nisso, obter o que quiser preparar para essa página. Se você tiver que carregar dados, se você tiver que se sentar na mensagem como se estivéssemos prestes a fazer não, você tem que fazer isso no Git, então tudo isso estará pronto momento em que o pH for carregado para o usuário. Neste caso, quero ver que o cabeçalho é igual aos tiques que acabei de amarrar, que é a lista de carros. Não, estou preparando essa variável. Estou me certificando de que o valor esteja disponível antes do paciente ou é como faço com que o valor seja exibido na página? Bem, na própria página, onde eu quiser, o que estaria entre essas tags H1. E então isso é o que chamamos de visualizações de navalha de borracha ou levantamos uma sintaxe. Em vez disso, a sintaxe do motivo nos permite entrelaçar ou um código C-Sharp com nosso código HTML. Tudo bem? Então, sempre que você vê um anúncio dizendo que está preparando você para escrever código C-sharp, porque esse é um código C-Sharp que é um namespace do C-sharp. No entanto, vemos HTML no pH. Tudo bem, então deixe-me mostrar se eu queria imprimir algo do lado C-afiado em vez do HTML, tudo o que eu preciso é no sinal. Basicamente, desde aquela diretiva que você está prestes a digitar C-sharp, nenhum modelo é como uma variável estática ou uma variável global que representa um objeto do modelo, que é o código por trás qualquer coisa que é pública no código atrás arquivo como este título está agora disponível para mim, vendo o ponto do modelo. Em seguida, recebo todas as propriedades do modelo, incluindo as minhas personalizadas. Você verá alguns que você não colocou. Sem problema, não fique assustado, não fique confuso nem nada. Mas se você olhar de perto, você vê bater. Esse é o que acabei de criar. Posso apenas dizer o cabeçalho model.py. E então, se eu salvar isso e depois atualizar a página e o que você pode fazer enquanto estiver neste momento, você sempre pode fazer uma compilação usando Control Shift e B. E então você pode apenas atualizar a página. Você provavelmente ainda está aberto a partir de quando estava depurando. Mas então você vê aqui que ainda estamos vendo uma lista de carros. E se você inspecionar o elemento, não há indicação de que seja C-Sharp ou HTML. No que diz respeito ao Brasil, ele só está vendo o HTML. Então essa é uma oferta polar é uma sintaxe. Podemos colocar dinamicamente qualquer coisa lá. Se eu quisesse mudar o cabeçalho em vez de manter a página inteira. E se eu tivesse que exibir que ocupa vários lugares em vez de ter a estática toma várias bases, eu a coloquei em uma variável. Aqui. Eu mudo de variável só para sabermos que está funcionando. E eu fui fazer uma construção. Agora, quando essa compilação estiver concluída, vou fazer uma atualização. E então C, lá vamos nós. Este material carros de variável. Isso torna muito mais fácil criar uma página dinâmica onde talvez tenhamos que alterar o texto em tempo real. Nós o mudamos uma vez. E então podemos apenas encontrar referência a ele quantas vezes em nosso código quisermos. Ao contrário de quando estávamos fazendo nossas páginas estáticas e se somarmos o difícil leva vários lugares, temos que ir manualmente e mudar. Está em todos os lugares. Podemos fazer isso aqui, apenas agradável e fácil. Então, se eu replicar todas essas páginas são cruzadas ou todas essas tags, lá está. Se eu mudá-lo uma vez, ele mudou tantas vezes. Tudo bem, então essa é uma maneira agradável e fácil de entender como a sintaxe funciona. Como podemos colocar algo no arquivo de código e acessá-lo dentro da página do Razor. Em seguida, vou mostrar a vocês nossa primeira parte do que chamamos de injeção de dependência. Então, o que vamos fazer é mover esse texto de cabeçalho da variável C-sharp aqui. E vamos colocá-lo nas configurações do aplicativo e, em seguida, vamos mostrar um todo, você pode simplesmente injetar um abscesso. Essas configurações, comem com bastante facilidade e as exibem na página da mesma maneira. 5. Mensagem de configurações: Então, agora vamos analisar como podemos injetar dependências em nosso pH e acessar dados uma maneira desacoplada. Portanto, esse é um dos quatro recursos mais marcantes da consulta de downlink faz o que chamamos de injeção de dependência, o que é um princípio muito importante no desenvolvimento sólido. O D na palavra solid realmente significa injeção de dependência. Tão sólido é um monte de princípios que nos ajudariam a praticar práticas de codificação limpas e boas. E a injeção de dependência é muito importante. E.net Core mix dependency injeção, muito, muito fácil para nós. O que vamos fazer é nas configurações do aplicativo ponto arquivo JSON, vou colocar em uma nova configuração. E mais uma vez, isso é apenas para fins de demonstração apenas para que possamos entender como tudo flui e tudo. Então, vamos apenas sentar uma vírgula. E então fui criar uma nova seção ou um novo nó para dizer que isso é mensagem. Então, estou chamando essa mensagem. Então, basicamente, o que temos é como um par de chave e valor. Então aqui estou criando meu volume e todos eles são separados por vírgulas. Você percebe que o log é a chave e, em seguida, o valor é o que chamamos de objeto. E o objeto tem uma chave que tem em outro objeto, e cada chave tem seu próprio valor. Toda vez que você vê dois pontos, o que está à direita é o valor, o que está à esquerda é a chave. E, em seguida, vírgula separe os nós principais. Portanto, este é um nó Min que separa um host de carga, que é outro carregamento ou peering de chave Vardy. E então isso é vírgula. Portanto, estamos criando nossa própria mensagem de par de chaves válida. E então essa é a sintaxe JSON básica. Bom e fácil de entender. A mensagem terá o valor. Esta é a lista de carros. Mensagem simples da lição. Nada muito extravagante. Sabe, eu disse isso nas coisas opostas. Como faço para acessar esse texto na página para exibir ainda mais no DNA para o usuário. Então, o que temos que fazer é ir para o nosso arquivo HTML index.js. Vou criar outra propriedade. Vou chamar isso de “falha”. Então, para duplicar seu controle D ou Control CNV, semelhante ao Visa Studio Code, mas o Control D também funciona. Tenho outra propriedade. Estou chamando de mensagem. E preciso sentar mensagem para ter o valor do arquivo de coisas opostas, o que significa que preciso acessar a configuração. Assim como discutimos no arquivo de inicialização, estávamos injetando o objeto de configuração aqui. E então isso nos permitiu acessar qualquer coisa, ou pelo menos eu os carrego porque não escrevemos isso. Quem escreveu isso fez essa injeção para que pudessem acessar a configuração que irá. Vamos seguir esse modelo. Os princípios da injeção de dependência um, você tem um construtor, então vamos escrever C TOR pressione Tab duas vezes e depois obtemos o construtor. Ele inicia as listas de parâmetros, o que é bom. Mas então precisamos dizer a ele quais dependências ele deve ajudar. Então, vou dizer que ele deveria estar usando a configuração I. E se você quiser, você pode simplesmente entrar na inicialização sobre CS e você pode fazer a configuração. E estamos chamando a configuração da variável. Linha vermelha significa que precisamos de uma biblioteca, então controle ponto e eu posso simplesmente ir em frente e clicar em Enter. Por isso, incluirá a instrução using. Então, basta fazer isso e obter a linha vermelha da instrução de uso desaparece. Não, preciso inicializá-lo. Então, estou dizendo que preciso da figuração do ícone da inversão do contêiner de controle ou verei o contêiner. A inicialização basicamente coloca tudo nesse contêiner entre a inicialização no arquivo program.cs. Eles colocam essas coisas no contêiner e, em qualquer lugar do meu aplicativo, eu posso acessá-las a partir do contêiner. Então, literalmente, carregou tudo, tudo a partir deste arquivo de configurações do aplicativo para aquele contêiner. E estou vendo que quero acesso a esse arquivo, que é obstruído a esse tipo chamado configuração Uyghur. Preciso de uma variável local que eu possa usar enquanto estiver nesta página para acessar seja como uma cópia. Então, o que vou fazer é apenas dizer duto de controle depois de colocá-lo no construtor. E então eu fui dizer criar e atribuir configuração de campo, e isso faz automaticamente esse processo de injeção para mim. Então agora eu tenho essa versão local apenas para que possamos vê-los de forma diferente. Vou chamar isso de sublinhado. E eu costumo fazer isso com meus campos na configuração de pontuação e pontos de controle para renomear em qualquer outro lugar, então ele se livra desse erro. Agora que temos esse objeto de configuração injetado um e inicializado e acessível à página. Agora posso dizer que minha mensagem deve ser igual à configuração. Tudo bem? O objeto de configuração permite que eu veja, me dê a chave do que você deseja acessar para que lembre-se que acabamos discutir que o par chave-valor é qual é a chave que eu queria acessar a mensagem. Vou ver que a chave é a mensagem. Lembre-se do IRAs, é basicamente uma matriz. Esse arquivo é basicamente transformado em uma matriz que agora posso acessar usando a chave como o subscrito. Depois de fazer isso, agora tenho uma nova variável chamada mensagem acessível à minha página de índice. Então eu posso embaixo do cabeçalho, colocar em talvez um h4 tags. E então vamos separá-los com uma etiqueta de RH. Fica um pouco extravagante com isso. E eu fui dizer, eu assinaria o ponto modelo. E lembre-se de que, uma vez que eu disser model.py tenha acesso a todas as propriedades que estão dentro da classe model, pode acessar a mensagem. Nenhuma mensagem não é apenas algo que digitamos e colocamos em uma variável. A mensagem está lidando todo o caminho de perturbação. Você vê até onde estamos que é perturbador? Ele tem o valor e o par de chaves para a mensagem. E, em seguida, na página, carregue. Estou vendo quando você está carregando esta página, quero obter uma cópia desse objeto da dependência ou do contêiner do COI. E estou criando minha cópia localmente. E então, em tempo real, posso ver onde quando a página está carregando, vá para essa cópia local do arquivo de configurações do aplicativo, me dê o valor que tem a mensagem principal. Quando faço tudo isso, posso fazer uma construção. E eu ainda tenho minha página da depuração mais cedo e você vê que ela é apenas atualizada para mim? Não. Estou vendo essa mensagem vindo do arquivo de configurações do aplicativo. Isso é basicamente tudo que a Injeção de Dependência funciona à medida que o aplicativo cresce Vamos ver definitivamente mais disso. Mas pelo menos esta é uma boa essência de como você pode realmente acessar dados de outras partes do aplicativo e ainda fazê-los exibir na página. E seus usuários nunca seriam mais sábios quanto a origem desses dados, seja um banco de dados ou uma variável em segundo plano. Mas estamos no controle, então sabemos como torná-lo dinâmico. Os usuários só vendo o que parece ser uma página muito estática, carregam-na para eles. 6. Como adicionar a estrutura de Entity: Até agora, estamos analisando alguns dos conceitos básicos de como podemos fazer com que as páginas do Razor exibam datas dinâmicas que estão vindo do nosso código C-Sharp. A realidade, no entanto, é que nós, em nosso cenário, não vamos realmente codificar esses tipos de valores colocando em variáveis e exibindo, especialmente dado o tipo de aplicativo que estamos building, que é um aplicativo de reserva de carro onde você precisará de uma lista de cartões que podem ser comprovadamente alterados. Um carro novo entra na empresa, um é aposentado, etc Onde fomos depois de gerenciar a reserva. Então, o que temos que fazer é encontrar uma maneira muito dinâmica de realmente armazenar esse tipo de dados. Em seguida, precisamos empregar os serviços do Entity Framework para que possamos um, criar o banco de dados para interagir com o banco e três, continuar a construir no banco de dados. O que vamos fazer antes de entrar em qualquer uma das complicações é o escopo antigo, o que precisamos armazenar, vamos torná-lo relativamente simples, mas é complicado o suficiente para que possamos obter boa ideia do que precisa ser abordado em um cenário geral. O que queremos fazer é empregar o S em sólido, que é a separação de preocupações. E o princípio por trás disso é um, um método ou um arquivo nunca deve ter mais do que uma responsabilidade. É por isso que é bom que, para cada página, haja um arquivo de código dedicado. Portanto, toda a responsabilidade desse arquivo de código é por essa página. O que vamos fazer é retirá-lo apenas de arquivos e vamos aplicá-lo a projetos. Agora que estamos pensando em interações com bancos de dados, o que precisamos fazer é criar outro projeto que irá hospedar ou integrar todos os nossos objetos relacionados ao banco de dados. Vou minimizar ou recolher a reserva do carro e fui diretamente para a solução. Clique em Adicionar. E vou criar um novo projeto. A partir desta listagem de projetos, vamos escolher uma biblioteca de classes. Então, se você não tiver isso no projeto recente estimula, você sempre pode pesquisar. O que queremos é uma biblioteca de classes C-Sharp. Você pode ir em frente e selecioná-lo e estamos chamando essa reserva atual até ponto Theta. Então, o nome significará que esse é o projeto de dados. Hit Next, e queremos mantê-lo como um projeto dotnet F5 e criar uma classe bibliotecas de versão muito despojada da obrigação C-sharp são dois projetos C-sharp que estavam acostumados. Como você pode ver que este projeto apenas diz que arquivo CSV e o único classificador, quase parece um aplicativo de console e os expositores sabem program.cs. E se você olhar no arquivo de projeto real, verá que todas as lágrimas são apenas a estrutura de destino. Se você voltar ao console, aplicativos do C-sharp, você notaria que eles também têm uma instrução de execução para informá-lo de que é um arquivo executável. O que vamos precisar fazer aqui é excluir a primeira classe, é definir algumas classes. Então nosso, o que estamos fazendo é criar entidades, que eu realmente poderia pedir arquivos que serão convertidos em tabelas de banco de dados. Então, seja o que for, e já olhamos para o OOP, seja lá o que for que nossas propriedades dos dados que gostaríamos de armazenar. Estamos criando nossa classe para representar isso, que mais tarde seremos realmente transformados em uma tabela por meio da API é que o Entity Framework nos permite, por enquanto, nós só queríamos entender como projetamos o modelo de domínio. Então, nosso primeiro deixe-me modelar, desde que começamos com os carros, serão quatro cartas. Então, queremos uma mesa para armazenar os carros. Quais são as propriedades dos carros que precisamos armazenar? Bem, em geral, isso pode diferir com base nas necessidades dos negócios, nos diferentes cenários. Então, vou apenas baseá-lo no meu cenário. Você pode fazer um pouco mais ou financiar isso precisa fazer um pouco menos do que eu. Mas, desde que você entenda o escopo geral do que estamos tentando realizar, isso não é problema. O que precisamos fazer é criar nossa primeira lição clicando com o botão direito do mouse no projeto de dados, estou adicionando uma aula e vou chamá-la de símbolo de carro. Dentro do carro. Vamos tornar esta classe pública. E então defendemos as propriedades. A primeira propriedade de qualquer tabela de banco de dados. Se você ainda não fez bancos de dados, não se preocupe comigo isso o mais amigável possível. Se você estiver familiarizado com bancos de dados, saberá que o sempre começa com uma chave primária que é incremento automático. Se você estiver familiarizado com o uso do SQL Server ou assim por diante. Você sabe que você tem que passar por alguns passos, você tem que sentar e restrição de identidade, você também tem que informá-lo mais incrementos IN1 e assim por diante. Com o Entity Framework ou na criação uma entidade que sabemos que vamos usar o Entity Framework para lidar. Tudo o que você realmente precisa fazer é chamá-lo de ID. Apenas fazendo isso em diferentes onde saberemos que, tudo bem, esta é a chave primária e deve ser incrementada automaticamente. É isso. Portanto, sempre tenha a chave primária para cada, a maioria, se não todas as entidades, 90% de suas entidades devem sempre ter um valor de chave primária chamado ID. Se você não quiser chamá-lo de ID, então há outras coisas que você pode ter que fazer. Usando o Entity Framework para que ele reconheça como uma chave primária. Mas entre chamá-lo de ID ou ID do carro ou ID do nome da tabela, esses dois garantirão que Entity Framework Core o veja como a chave primária. Temos uma identificação, o que precisamos? Vou dizer público no ano inteiro, talvez o ano do veículo seja importante, também. Vou armazenar o ano. E a próxima coisa que vou armazenar é o nome da corda, nome do veículo, Toyota Yaris, etc. Eu só vou mantê-lo simples e isso está sempre jogando uma bola. O carro teria criado nossa primeira entidade. Agora, a próxima coisa que precisamos para Entity Framework reconheça que essa classe deve ser uma tabela, é chamada de contexto de banco de dados. Então, banco de dados abreviado para o contexto do banco de dados, que significa que estou analisando o que significa que estou analisando todos os recursos no banco e os reconheço como tal. Vamos configurar o contexto do banco de dados. Ainda não vamos nos conectar ou criar nenhum banco de dados. Estamos apenas preparando as bases, certo? Não. Vou clicar com o botão direito do mouse novamente e adicionar outro arquivo, novo item ou classe. E eu vou chamar isso de reserva de um carro. Contexto Db, niacina, nome fácil de lembrar. Carb procurando contextos DVI, apenas outro arquivo de classe. Agora, o contexto do banco de dados voltará a ser público. E ele herdará de uma classe base que nos é dada pelo Entity Framework chamado DB context. Basta digitar contexto de banco de dados. E se você der ao Visual Studio alguns segundos, você notará, ok, maravilhas e ferramenta de livro de erros, para usar os contextos DVI, você precisa instalar um pacote chamado framework NTD. Então você tem Entity Framework e anti trabalho diferente Tribunal. Estamos usando dotnet Core, então temos que usar o Entity Framework Core, que é o mais recente e o melhor do Entity Framework. Agora, o mais legal é que precisamos usar um gerenciador de pacotes. Então, em vez de termos que sair e encontrar coisas manualmente, Visual Studio vem com um gerenciador de pacotes chamado New get. Temos duas opções. Podemos permitir que ele vá em frente e encontre-o para nós e instale-o. Ou podemos ir manualmente, clicar com o botão direito do mouse e pressionar Gerenciar pacotes NuGet. Portanto, é bom entender todas as suas opções porque o desenvolvedor que sabe que precisa Entity Framework provavelmente começaria aqui. Você provavelmente iria ao NuGet, ir para os irmãos. E então ele veria todos os pacotes disponíveis para ele. E então ele realmente veria que você tem Microsoft dot Entity Framework Core dot SQL Server. E há aquele que foi anunciado para dizer que tenho um monte de outros, mas não vamos ficar preocupados com aqueles que você não precisa. Então, na verdade, vamos usar bancos de dados do SQL Server em diferentes núcleos de trabalho, na verdade, de código aberto e disponível para a maioria dos mecanismos de banco de dados. No MySQL, postgres SQL sequel light, todos esses são mecanismos de banco de dados ou provedores diferentes. Na estrutura fornece APIs que permitem usar C-sharp para conversar com qualquer porta única. No entanto, se nós, já que estamos usando o SQL Server, podemos simplesmente ir em frente e instalar o em diferentes pontos de núcleo de trabalho SQL Server, o que nos dará as APIs do SQL Server, bem como a biblioteca base para Entity Framework Core. Então, vou usar o gerenciador de pacotes NuGet. E tudo o que tenho que fazer é acertar esta seta para baixo. Podemos escolher a versão. Vemos que esta é a versão estável mais recente. Não precisa modificar isso. Pressione Instalar, dê alguns segundos. Você pode obter licenças e contratos pronunciáveis. E, como esses co-mórbidos, basta clicar em OK e aceitar e denotar o tempo em que está instalado. E quando voltarmos ao projeto CS, você verá que um grupo de itens é adicionado onde as referências do pacote estão sendo colocadas. Tudo bem. Podemos deixar que ele faça suas coisas em segundo plano. Mas agora, quando fazemos dois contextos e controle de dB, vemos que temos a capacidade de apenas adicionar o namespace. Esse foi o nosso primeiro gosto de como podemos usar o gerenciador de pacotes NuGet para adicionar bibliotecas que estão inerentemente ausentes. Vá em frente na declaração de uso. Agora temos o contexto do banco de dados. Para que possamos deixar o contexto do banco de dados saber o que as tabelas precisam ser. Precisamos adicionar banco de dados público sit. Então dizemos que ele cria um Db, Db cities Entity Framework. Fale por uma mesa. Context representa banco de dados, conjuntos BB representam uma tabela. Temos que fornecer o modelo no qual essas tabelas devem ser baseadas. Bem, criamos nosso modelo na forma de carro. Alguém para dizer banco de dados. Você terá uma mesa em um carro modelado. E você deve chamá-lo de carros quando ele for criado no banco de dados real. Então, vamos olhar para isso de novo. Toda essa classe representa nosso banco de dados em todos os ativos que estarão lá para exibir as tabelas, procedimentos armazenados, etc. Quando quisermos adicionar uma tabela, queremos metade criar o modelo que a tabela deve seguir. Então, no caso do carro, demos a ele as propriedades que sabemos como fazer a classe por não. Isso está apenas mostrando como nossa classe se parece com uma tabela em termos de desenvolvimento de banco de dados. Acabamos de criar uma classe com todas as propriedades, todos os campos que conhecemos que nossa tabela ou precisam ter os tipos de dados. E então estamos dizendo ao contexto do banco de dados que preciso uma nova tabela ou de um conjunto DV do tipo carro. E eu queria ligar para carros. Quando voltarmos, o que vamos fazer é configurar minha agressão, onde realmente dizemos um, geramos código que criará o banco de dados e avaliaremos como isso olha e para nós realmente iremos gere esse banco de dados e veja que tudo isso vai funcionar da maneira que estamos falando sobre isso. Não. 7. Adicione banco de dados ao projeto: Bem-vindo de volta pessoal. Então, agora vamos estar sentados ou banco de dados real. Já configuramos nosso contexto, que basicamente representa uma conexão com o banco de dados. Já criamos pelo menos uma entidade ou uma tabela para esse banco de dados. Não, precisamos uma vez o que chamamos de cadeia de conexão. E, em seguida, criar o que chamamos de migração, que seria o conjunto de instruções que Entity Framework poderia usar para informar como ele vai criar a tabela e o banco de dados e qualquer outros ativos que precisam ser criados de acordo. Vamos até as configurações do nosso aplicativo a partir da nossa reserva de carro. E o que precisamos fazer aqui é adicionar nossa cadeia de conexão. Agora, a sintaxe de um fluxo clínico se parece com isso, e acabei de adicioná-la logo acima do registro. Então lembre-se de que tudo isso é um grande objeto JSON. Estou adicionando uma nova chave chamada strings de conexão. E então essa chave tem um valor de objeto que usa outro par de valores-chave, conexão padrão e, em seguida, esse é o valor. Então, vamos passar pelo que esse valor tem. Esse valor tem um servidor e o nome do servidor é praticamente o nome da máquina ou o nome da instância do banco de dados. Se você não está tão familiarizado com bancos de dados, tudo bem. Temos um provedor de banco de dados integrado com Visual Studio chamado Local DB, MS. Sql local DB, você sempre pode acessar esses bancos de dados acessando o SQL Server Object Explorer. Se você não quiser tê-lo do lado como eu, eles sempre podem ir para View. E então você pode procurar o SQL Server Object Explorer. Então isso lhe dá acesso instantâneo a essa instância de banco de dados e você pode simplesmente cair e é um banco de dados local MS SQL local DB no B2C, todos esses servidores de bancos de dados são iguais ao Debian local, escrevê-lo exatamente como você vê. Parênteses abertos, DB local, parênteses próximos. A barra dupla é porque precisamos escapar da barra. Se tivermos uma sessão, você receberá esse erro. Precisamos ter essa barra dupla no contexto desse arquivo e do MS SQL local DB. Em seguida, temos um ponto e vírgula e, em seguida, declaramos que o banco de dados é igual à reserva de carro no banco de dados de pontuação. Agora, mais uma vez, ainda não criamos esse banco de dados, mas sabemos como queremos que o banco de dados seja chamado, então estamos avisando nesse momento. Mais tarde, você verá que conexão confiável é igual a verdadeira e vários conjuntos de resultados ativos são iguais a true. Portanto, essas são entidades relacionadas à segurança para usabilidade. Então você pode simplesmente ir em frente e replicar tudo isso. Agora, depois de termos entrado em nossa cadeia de conexão, precisamos deixar o aplicativo ou que, na inicialização você deve usar essa cadeia de conexão para o banco de dados. Ainda em nosso aplicativo da web, vamos ir para a inicialização. Em seguida, nos serviços de configuração, vamos registrar nosso encadeamento de contextos de banco de dados. Então eu fui dizer serviços que adicionam contexto de banco de dados. E então eu estou colocando o nome dos contextos DVI. E enquanto estou fazendo isso, estou olhando para o outro lado e vendo que tenho um nome aqui e outro nome deste lado. Então, na verdade, é assim que eu queria ser chamado. Eu chamei isso Car book Up DB context por engano. Fui atualizá-lo, certo? Não há carb procurando o contexto de banco de dados do nome do arquivo e, em seguida, atualize o nome da classe de acordo. Tudo bem, então agora que esse refatoramento está feito, eu me sinto um pouco melhor e posso voltar aqui. Portanto, os serviços pontuam IDB, contexto e a maneira como digitei colchetes com o nome do contexto de banco de dados e, em seguida, temos as opções. Então, obviamente, isso não é realmente registrado o que estamos tentando fazer, daí as linhas vermelhas. Então, o que eu vou fazer é controlar ponto. Em seguida, isso indicará que preciso adicionar uma referência ao meu projeto de dados de reserva de carro. Tudo bem, então temos em dois projetos diferentes para diferencial chamará assemblies. E agora o Visual Studio ou a solução vê isso. Ok, estou tentando fazer referência a algo que não está no projeto atual, o que eu vejo em outro projeto. Gostaria de adicionar a referência que fui dizer sim, vá em frente e adicione a referência. Uma vez que eu fizer isso, você verá que esse nulo muda para aquela cor que indica que sabe qual arquivo é e tudo é. Certo, mas ainda tenho outro erro que vou controlar. E está me dizendo que preciso adicionar uma instrução de uso para Entity Framework Core para que eu possa ir em frente e fazer isso. Não, não tenho mais erros. Isso é buraco. Adicionamos esse bit de código com as opções para usar o SQL Server, como eu disse, Entity Framework, core pode suportar vários mecanismos de banco de dados. Então, estamos especificando que estamos usando o SQL Server aqui. E então estou procurando na configuração. Lembre-se, tudo isso foi injetado anteriormente, o ponto de configuração obtém string de conexão. Portanto, essa é uma função interna da configuração. Eles estavam procurando a conexão padrão. Então essa conexão padrão, e então ele está recebendo esse valor. Então, qualquer coisa que você possa ter chamado isso se você não quisesse chamá-lo de uma conexão padrão para mim, eu queria chamar a conexão de carbocation up, seja lá o que você chamar, nós só temos que conseguir isso string de conexão aqui. Agora vamos fazer uma conta rápida apenas para garantir que não quebramos nada para construir foi bem-sucedido. Vamos continuar. Então, no próximo passo, preciso realmente gerar esse banco de dados. Então, como eu disse, precisamos fazer uma migração e em seguida, podemos realmente gerar o banco de dados após a migração. O que farei no projeto de dados mais uma vez, vou pular para Gerenciar pacotes NuGet. Em seguida, vamos procurar o pacote Entity Framework Core dot tools. Se você não vir listado aqui, pronto como é para mim, você sempre pode ir em frente e procurá-lo. Vejo isso aqui. Vou apenas ir em frente e instalá-lo como de costume. Vá em frente e aceite quaisquer termos e condições e saiba que ele está instalado. Deixe-me dar a você um histórico rápido sobre o que essas ferramentas permitem que você faça. Se você observar a descrição da biblioteca, ela diz que ela permite que US, use comandos usados com frequência. Você adicionou migração, é isso que estamos prestes a fazer. Você descartou o banco de dados, obtém contextos DVI, coisas relacionadas à migração, coisas relacionadas a andaimes e migração de scripts e geração de comandos não relacionados. Portanto, esses são todos os comandos e esses são na verdade, comandos powershell que executaremos usando nosso console do Gerenciador de Pacotes. Esse console do Gerenciador de Pacotes, se você não estiver vendo onde eu o tenho na minha barra de tarefas, mais uma vez, você sempre pode ir para Ferramentas e, em seguida, obter gerenciador de pacotes e um console do Gerenciador de Pacotes. Tudo bem, então uma vez que você fizer isso, você terá uma janela semelhante a esta, onde ela está pedindo o comando. O que vamos ter que fazer, é alterar nosso projeto padrão ou um projeto de dados porque é aí que está nosso contexto de banco de dados. É aí que queremos nossas migrações e tudo se levanta está relacionado ao vivo. Fui alterar o padrão, previ um projeto de dados. E então eu vou dizer adicionar migração traço e ele pode até pressionar Tab para completá-lo para você. Então vou chamar essa migração inicial. Depois disso, basta pressionar enter. Ele reconstruirá o projeto e , em seguida, estou recebendo esse erro. Não faça problema. Então diz que meu projeto de inicialização não faz referência a essa biblioteca, tudo bem. Este pacote é necessário para que as ferramentas do Framework Core funcionem . Então eles estão realmente nos dizendo o que há de errado. Não há problema. Então, a senhorita desviar a biomassa. Vamos consertá-lo. Vamos clicar com o botão direito do mouse em nosso projeto web. Use o NuGet. E eu só estou tentando mostrar como é fácil colocar essas alavancas quando elas estão faltando, você fica mais do que provável que as tenha. Então vá em frente, vá para o NuGet e depois vou colar o nome da biblioteca que ela disse. Mais uma vez, você sempre pode apenas pesquisar no, digitando a barra de pesquisa. E depois que eu conseguir, posso instalá-lo. Quando isso for feito. Agora vou voltar ao meu console do Gerenciador de Pacotes e vou pressionar para cima. Então, quando você pressiona a seta para cima, você é comprado o comando mais recente, tentado, pelo menos tentado. Então, vou pressionar para cima, comprar essa migração, pressionar Enter novamente e em nenhum lugar recebo outro erro. Eu não vou esconder essas prisões para mim porque às vezes você tende a esquecer alguns dos passos e é bom ver os erros e saber como lidar com eles. Estou claramente esquecendo algumas etapas aqui, mas isso não é problema como o escopo do erro, vamos corrigi-los. Então este está dizendo que havia uma seta acessando os serviços de hospedagem. E precisa haver algum construtor que leve a configuração sendo passada. Então deixe-me explicar exatamente o que isso está dizendo. Então, quando teríamos configurado em nossa classe de inicialização que cada um deveria estar usando o contexto de banco de dados. E eu estaria passando essas configurações. Portanto, as opções, praticamente todo esse objeto aqui chamado opções, nos permitiriam colocar em várias configurações diferentes que queremos ir e manter o banco de dados interagido com quando o aplicativo inicia sua entidade. É muito simples, certo? Não, a única opção aqui é que ele use a mistura na corda. No entanto, isso não é suficiente porque, embora tenhamos que o aplicativo use esse banco de dados e desconexões, você é esse contextos de banco de dados e linear representa o banco de dados que é nossa desconexão e string. Precisamos deixar nossos contextos DVI que é suposto ser uma ferramenta relativa, sejam quais forem as opções que estamos passando. Vamos voltar para o nosso contexto de banco de dados e criaremos um construtor. Então, vou ler CT OR e pressionar Tab, Tab. E o que temos que passar aqui seriam opções de contexto de banco de dados. E as opções de contexto de banco de dados seriam ferramenta relativa ou inicialização do carro no contexto do banco de dados. E vou chamá-lo de Opções. E então temos que deixar o baixo notar que ele deve usar a mesma base de opções, é claro representa ou contextos DB da herança. Isso está completando toda essa hierarquia de injeção de dependência qual eu teria aludido. Onde quando o aplicativo é iniciado, mais uma vez, estamos vendo usar o contexto de banco de dados encontrado neste arquivo e dar a ele essas opções para controlá-lo sem o que acabamos de fazer com tudo isso linha de código. O contexto do banco de dados estava apenas sentado lá em terra la-la em nenhum lugar, deixando você saber que isso é o ciente do fato de que as opções serão passadas. E também é possível com os contextos DB, que é a classe base dada a nós pelo EF Core. Então, agora que fizemos isso, vamos tentar mais uma vez a migração da porta. E finalmente temos uma tentativa de migração bem-sucedida. Tudo bem. Agora temos essa migração inicial. Finalmente, como você obteria uma nova pasta chamada migrações que você pode entrar em colapso. Mas toda vez que fazemos uma migração ou toda vez que fazemos uma alteração no banco de dados, adicionando uma nova tabela ou coluna ou alterando algo, temos que fazer uma migração. O arquivo de migração irá gerar e dizer essas são as mudanças , são essas coisas que vou fazer. E então podemos executá-los e isso manterá um histórico. Portanto, é uma boa maneira de manter um histórico de todas as alterações que estão sendo feitas no banco de dados. Se, em algum momento, fizermos uma alteração e isso não é exatamente o que queríamos indesejar remover a migração, então você pode literalmente executar o comando remove a migração, que simplesmente desfaz o máximo migração recente. Apenas uma varredura rápida até o que esse arquivo de migração está dizendo. Está dizendo, bem, temos uma classe chamada construtor de migração, que está sendo inicializada ou positon em vez disso. E então esse construtor nos permite criar o nome da tabela é carros. Então lembre-se que seja qual for o nome que você colocar aqui, esse é o nome da tabela entrando. Então, é dizer criar uma tabela com o nome carros e as colunas devem ser ID. Lembre-se que eu disse que uma vez que você chamá-lo, o ID saberá automaticamente que sua identidade, sua chave primária. Ele já está mantendo todas essas restrições na coluna ID, quatro linhas. E criará o ano e as colunas de nome para nós. Isso está na função. Então você tem uma função não, que basicamente diz, isso é o que eu vou fazer para desfazer isso. Então, se alguma vez fizermos o ACI no banco de dados e, em seguida, o sublinhado perceber, oh snap, isso não é realmente o que eu queria depois de mim. Tenho que mudar isso rapidamente. E você deseja desfazer a migração , bem como a alteração no banco de dados. Porque o que acontece é que se as alterações já aplicadas ao banco de dados neste momento, esse arquivo não é nenhum banco de dados existe. Este é apenas um arquivo de instruções para ver quando o banco de dados é isso que farei. Se você já tiver a migração e já a aplicou ao banco de dados, terá que reverter a migração antes de removê-la do histórico. Esse método não é o que contém instruções e diga, bem, essas são as alterações que foram feitas. Bem, isso é tudo que vou desfazê-los. Então este diz criar uma tabela com todas essas coisas. O desfazer por isso seria largar a mesa. À medida que avançamos, veremos mais disso. Portanto, não se preocupe muito com isso. Sei que só queríamos ter certeza de que já precisamos ser excretados. Então, o próximo comando que vamos executar é atualizar o banco de dados. Você pode ir em frente e executar isso. E depois que isso tiver sido bem-sucedido, podemos verificar se nosso banco de dados foi criado. Então volte para o SQL Server Object Explorer. Em seguida, expanda, entre em bancos de dados e, em seguida, você verá o carro inicializando o BB. Nesse banco de dados, você verá carros para uma tabela e o histórico de migrações do EF como uma tabela. Portanto, esta tabela transporta todas as migrações que foram aplicadas ao banco de dados. E então veremos esse banco de dados preenchendo à medida que colocamos mais e mais tabelas nele. 8. Aulas de banco de dados de andaimes: Tudo bem, então agora que fizemos nossa migração, criamos nosso banco de dados. A próxima etapa lógica seria carregar o aplicativo para interagir com o banco de dados. Porque, bem, você não desejaria necessariamente enviar seus usuários para seu banco de dados para poder gerenciar o carro. Nem todos conhecerão SQL, nem todo mundo entenderá como operar nesse ambiente, é por isso que temos interfaces de usuário, nossos aplicativos web, que nos permitem conduzir diferentes operações de forma mais fácil de usar. Tudo bem, então o que vamos fazer é explorar as páginas de motivos inteiros tornam muito, muito simples para nós realmente gerar interfaces de usuário para interagir com nosso banco de dados. Já começamos a construir páginas antigas para os carros. E o que aconteceria é que temos a página de índice e o índice geralmente seria a lista de carros. E então você teria o outro o que chamar de páginas da multidão. Então C e corrode representa criar, nossas representações lidas. Você foi atualização de presentes, e D representa delete crude. Basicamente, todos os aplicativos que você usará em seu aplicativo móvel em sua geladeira, seja lá o que for, tudo o que eles estão fazendo são operações crude. Eles estão olhando para ver alguma coisa. Remova-o se você não quiser, altere-o se não gostar ou criar outra coisa. Então corroa, esse é o cerne de cada aplicação. Então, o que vamos fazer é criar as páginas da multidão para nossos carros. Como precisamos ser capazes de gerenciar uma frota, queremos ver todos os carros em dados BSO para excluir aqueles que não estão mais aqui. Talvez alguém tenha cometido um erro tipográfico, você queira atualizá-lo, etc. Na verdade, vou remover esta primeira página de índice que criamos para carros. O que vamos fazer é uma nova página de índice desgastada e usando o Entity Framework. Então, o que podemos fazer é clicar com o botão direito do mouse ou a pasta carros ir para adicionar uma página Razor. Então, quando essa caixa de diálogo aparecer, temos três opções. Temos os esvaziadores, um pH, que já olhamos. Temos o motivo pelo qual pgs é o Entity Framework, então usaremos esse. Portanto, esta próxima caixa de diálogo nos permite dizer qual é o nome do PGY1. Estamos substituindo os bits de índice. Eu posso apenas dizer o índice, então o modelo perguntaria: Ok, Você quer isso como um modelo de lista, edite o modelo. Assim, podemos realmente andar de carga de forma ou toda a tela para o que quisermos. Portanto, neste caso, queremos a lista porque a página de índice, em geral, teria a lista de qualquer tipo de dados ou dados que você está mostrando. A classe mais modelo seria a próxima. E a classe modal significa modelo andado ou modelo de tabela que devo usar ao gerar esta página? Então eu posso dizer carro. Nós faremos, faremos é ir em frente e gerar código para que ele possa exibir os diferentes pontos de dados da entidade do carro. O contexto de dados mais, é claro, seriam contextos RDB, que é onde todos os nossos objetos de banco de dados estarão saindo. De qualquer forma, não queremos ter que alterar nenhuma dessas outras configurações e podemos seguir em frente e clicar em Adicionar. Sei que encontrei esse erro que você pode não ter, mas vamos trabalhar com esse árabe porque desde as versões recentes do dotnet Core, esse erro ocorreu durante o procedimento de andaimes e é bom entender pelo menos buraco que você pode contorná-lo. Às vezes, é muito frustrante, mas vamos apenas resolver isso. Portanto, há poucas coisas que são recomendadas. Um, você precisa e eu vou cancelar tudo isso. Uma delas é ir para Ferramentas e ir para pacotes NuGet, Gerenciador de Pacotes, desculpe e depois as Configurações. E então você vai limpar tudo o que você recebe caches. Então vá em frente e acerte isso. Em seguida, é seguir em frente e construir ou limpar a solução. Então, vamos executar uma solução limpa. E isso trouxe isso precisa fazer. E então estou vendo que tenho dois erros aqui. Tenho um erro em relação às versões dos pacotes. Então, geralmente é isso que causa esse erro. Quando os pacotes são as versões dos pacotes que você pode estar usando bullet necessariamente correspondem às versões que o andaime ou está procurando. Não tenho certeza do porquê. Essa é uma daquelas partes mais irritantes do que a Microsoft, a equipe da Microsoft, vem fazendo nos últimos tempos. Mas vamos apenas trabalhar através da Alma. Não, meus pacotes e eu só vamos clicar no arquivo do projeto e posso ver que meus pacotes estão em 5.09. Então, o que vou fazer é deixá-los para 5.08. Então, no arquivo CSV posso simplesmente trocar os bolsos. Então, essa é outra maneira de alterar versão do bucket para que você possa alterá-la aqui. Mas se você não tiver certeza de quais são os números da versão, não há problema. Vamos usá-los que você recebe para o próximo. Assim, você sempre pode ir até o novo gerenciador de pacotes get para esse projeto em si, olhar para as versões instaladas e, em seguida, você verá quais versões você tem. E então você pode alterar essa versão. Então, vou soltar a versão 2.08 e, em seguida, clicar em Atualizar. Assim, você pode fazer isso apenas para os pacotes de conclusão e design do núcleo dotnet para o Entity Framework. Depois de ter feito essa operação, vejo que construí com sucesso. Então, vou tentar o andaime novamente. Vou clicar com o botão direito do mouse em carros com a página Razor e depois paginar usando o Entity Framework e nós apenas preenchemos depois paginar usando o Entity Framework e nós as mesmas coisas que acabamos de preencher. Então o modelo de índice é lista, classes de modelo, carro e, em seguida, vá em frente e clique em Adicionar. Tudo bem, é como se fosse outra área. Este, pelo menos, é um pouco mais informativo. Ele diz que havia um ganhando o gerador de código selecionado para scuffled, instalar esse bolso em particular. Então, tudo bem, não há problema. Vamos seguir em frente e seguir as instruções. Em segundo plano. Você pode ver isso e você começa a instalar esse mesmo bolso. Vou tentar isso mais uma vez. Desta vez, temos decolagem. Então, não sei se esse foi um ciclo de tentar obter um trabalho distinto. Mais uma vez, isso acontece quando determinadas versões são lançadas, mas o mecanismo subjacente no Visual Studio não foi atualizado para saber que esta é a versão da biblioteca, ele deve ser usado. Então você pode ter um pouco de ida e volta com isso. E, como eu disse, não há muitos recursos on-line para orientá-lo exatamente o que fazer. Essas etapas, de um modo geral, funcionarão para você. Mas o que acabamos com é o arquivo de índice. O arquivo de código. No valor do índice, você vê que muito HTML foi gerado para nós. E no arquivo de código você verá que alguma quantidade de C-sharp também foi criada para nós. Então, vamos discutir brevemente o que está acontecendo aqui. No arquivo de índice. Vamos começar com um arquivo de código porque está listado. Veja o que estamos vendo aqui é injeção. Então lembre-se de que fizemos uma forma de injeção de dependência anteriormente com um arquivo de configuração porque a configuração tem algo que queríamos. Não queríamos criar uma nova instância do arquivo de configuração toda vez que quisermos algo. Então, em vez disso, estamos tirando aquela cópia compartilhada registrada no aplicativo para ser compartilhada entre todos. Então, em essência, quando teríamos ido para nossa classe de inicialização e contextos RDB registrados, já estávamos começando a ser compartilhados entre aplicativos, tornando-o um candidato a injeção em qualquer lugar que quisermos. Portanto, somos nós injetando uma instância ou injetando a versão cortada do contexto e inicializando nossa própria cópia privada neste arquivo. Isso é injeção de dependência em um a um. Sempre que você quiser fazer injeção de dependência, parecerá algo assim e você pode injetar várias coisas como à vontade. Então você não está limitado a apenas uma coisa de cada vez. Agora que temos o, no contexto injetado em nosso índice, o que estamos fazendo aqui é criar um objeto de lista do tipo carro, então é apenas uma coleção de carros. Tudo bem. Devemos chamar isso de carros realmente. Então, vou chamar isso de carros porque é uma lista. E eu costumo ficar muito específico com minha nomeação, pelo menos que eu pluralizo isso. Se for singular, então é singular. Assim, você pode renomeá-lo para usar pontos de controle e permitir que ele reflita até todas as outras referências para você. E então o que temos está chegando. Então lembre-se do que discutimos quando a página é carregada. Nós temos o ligado, vamos, chegar aqui está sendo demitido. Depois de navegarmos para esta página de índice, chamaremos esse método automaticamente. Esse método configura todos os dados ou o que precisamos para a página, assim como fizemos com a configuração e inicializando nossas variáveis no exemplo anterior. Então aqui estou dizendo que minha lista atual de carros deve ser igual a. E então vamos aguardar os resultados de chamar a tabela de carros de ponto de contexto e obter todos os elementos. Portanto, esse é o clássico Entity Framework. Entity Framework nos dá acesso ao banco de dados por meio desse arquivo de contexto. Quaisquer que sejam as mesas que declaramos, porque lembre-se , carros, colocamos carros lá, isso é nosso. Isso é tudo o que está fazendo. É dizer contexto, me dê os carros. E então a maneira como o Entity Framework funciona é que isso é o que chamamos de método de execução. É ver lista assíncrona significa que realmente me dá tudo na tabela como uma lista. E então estamos armazenando essa lista em nossa variável local ou propriedade chamada carros. Depois que tudo isso for feito e a página tiver sido configurada, vamos pular para o nosso HTML real. Então, na página HTML real, ele sabe que é uma inexperiência, deu seu índice de nome não, encontrar todas essas pequenas coisas são porque chamamos o índice de pH. Chegamos ao botão Criar novo gratuito, certo? Portanto, temos um link para criar novo. É claro que essa página ainda não existe, mas tudo bem. Obtemos uma tabela, e essa tabela tem um cabeçalho ou uma seção de cabeçalho com as linhas de cabeçalho. Então, temos o cabeçalho da tabela para o próximo ano, pagamos o nome. Em seguida, temos outra coluna de cabeçalho da tabela que está vazia. E então, para cada item que entrou, o modelo dot car, modelos de carros, essa é a nossa lista de carros. E então estamos usando isso para cada loop para passar por cada item na lista de carros que estamos vendo. Dê-me uma exibição para o ano, me dê uma exibição para o nome. E naquela terceira coluna que não teve batida, quem poderia ter chamado essas ações, talvez o que está nessa terceira coluna, me dê três links queridos editar, querer excluir, e um, basta ver os detalhes. E cada um passará por esse ID. Lembre-se, o ID da chave primária, é isso que identifica exclusivamente uma coluna no banco de dados ou aquela função em vez do banco de dados. E então estamos apenas vinculando isso ao botão que, quando clicarmos em Editar em qualquer uma dessas funções, saibamos qual ID vamos ver. Vamos dar uma olhada rápida no que foi gerado para nós. Aqui está nosso pH. Esta é nossa nova página. Vemos aqui que temos algo parecendo uma mesa. Se você não está familiarizado com todas as tabelas, olhe no Bootstrap, então é assim que elas vão se parecer. Mas temos a tabela, temos a coluna para você, temos o nome e, em seguida, temos aquela coluna vazia que terá os links. O que não temos são dados. Sim, temos a página que temos que criar novo botão acima dessa inundação de índice para que possamos começar personalizar esta página para o que queremos. Em vez de ver o índice acima, podemos dizer lista de carros de contratação. Isso é basicamente o que tivemos da última vez quando fazemos isso e vemos se o vemos atualizar e mudar. Tudo bem, então o que não temos seria criar novo. Não temos nenhum dado e também não temos nenhuma das outras páginas. Quando clicamos em Criar novo, ele vai simplesmente fazer um loop porque não há página para criar uma nova, voltamos, o que vamos fazer é criar um repositório do GitHub para este projeto. E então podemos continuar desenvolvendo nossos recursos. 9. Adicione um projeto ao GitHub: Tudo bem pessoal, então estamos de volta e o que vamos fazer nesta lição é ficar sentado ou repositório do GitHub para nossos projetos. Não, GitHub, passamos por isso. É uma ferramenta ou plataforma muito útil para manter uma cópia do nosso projeto um e manter a história do nosso projeto. Também nos permite colaborar com nossos colegas ou amigos em um projeto com muita facilidade. Museo Studio, microsoft comprou o GitHub anos atrás e desde a integração entre as ferramentas da Microsoft e o GitHub, nomeadamente o visual Studio e você já viu o Visual Studio Code. Essas integrações realmente amadureceram e se tornaram muito, muito, muito poderosas. Então, vamos ver como podemos enviar todas as informações do nosso projeto usando o Visual Studio para o GitHub e mantê-las sincronizadas. Portanto, é muito simples fazer isso. O que podemos fazer é olhar no canto inferior direito do nosso Visual Studio. E veremos esse botão que diz Adicionar ao controle de origem. Então você vá em frente e clica nisso e verá get. Portanto, vá para a instalação em sua máquina automaticamente quando Visual Studio foi instalado, se ele ainda não estava instalado a partir de quando você fez esse exercício usando o Visual Studio Code. Mas não, eles dirão criar um repositório Git e eles configurarão o repositório local. E, em seguida, também permitirá que você crie o repositório do GitHub fora da caixa. Portanto, se você não está dizendo Não vá em frente e faça login, provavelmente será solicitado a fazer login com suas credenciais do GitHub neste momento. Mas, a partir daqui, você pode indicar que deseja um repositório privado e tudo bem por enquanto. Você pode deixá-lo como privado de realmente perceber que quando você desmarcar isso, a menos que eles consertassem o comprador em massa, não, mas não o criaria no GitHub se você não o tornasse privado, não totalmente certo por que, mas você sempre pode voltar e mudá-lo para público, se assim o desejar. Nós o deixamos como privado. Não precisamos colocar uma descrição ou qualquer outra coisa. E eles estão nos dizendo qual será o tweet de URL. Assim, você pode ir em frente e clicar, Criar e empurrar e dar alguns momentos. E eu não recebi nenhum sinal evidente de que estava terminado. Mas se eu olhar no canto inferior direito, estou vendo que o botão para dizer add não está mais lá em vez do caminho do centímetro, está me dizendo que eu tenho um branch master. Vai ser o que chamamos de controle remoto. Lembre-se, configuramos esse controle remoto, que basicamente tem esse link para o repositório remoto. Ele tem alterações pendentes e commit que podem estar em conhecimento por push nos recursos. Você verá que todos os arquivos no hub nulo Solution Explorer, pequenos cadeados, esses lotes de botões indicam que a versão que está na sua máquina ficou inalterada desde a última atualização do servidor. Então, se eu entrar e encontrar qualquer ajuste e vou apenas fazer um pequeno ajuste neste arquivo. Então você verá que ele se livra desse carrapato vermelho. Significa que sim, esse arquivo foi modificado e temos outro painel chamado boas mudanças. Se não estiver onde está na minha tela para você, você sempre pode ir para View e verá boas mudanças. Tudo bem, então, uma vez que você abrir, obtenha alterações, ele mostrará os arquivos que foram alterados e aguardando para serem confirmados. Então você tem sua mensagem de commit, então ela diz arquivo de índice modificado. Então, a maneira mais fácil de fazer isso seria comprometer tudo e ver o que isso faz é empurrar e puxar. Ele enviará suas alterações e pulôver novas alterações que possam estar lá? Não. Há situações em que você pode acabar entrando em conflito com seu colega, o que significa que você fez uma alteração nessa página de índice. Ele ou ela também fez uma alteração nessa página de índice. E então um de vocês fez o check-in antes do outro. Então, quando você está verificando sua versão modificada da antiga, GitHub está percebendo que a versão que ele possui é diferente da versão que lhe deu pela última vez. E então isso causaria um conflito. Nesse ponto, você terá que fazer algum gerenciamento e resolução de conflitos. Podemos discutir isso mais tarde à medida que um projeto cresce. Mas retinal isso, basta mantê-lo simples o suficiente Para saber que podemos criar ou repositório para alterações sincronizar e quando fazemos compromissos e você verá que ele o confirmará localmente e, em seguida, sincronizar os commits locais com um commits do GitHub automaticamente derrubando qualquer coisa que você não tenha que esteja atualmente no GitHub. Entrada real. É assim que é fácil codificar como um grupo. Portanto, cada um de vocês pode fazer logon facilmente neste projeto no GitHub. Vou mostrar-lhe através do Maya cólon. Então aqui está o carbo King up que acabou de ser criado há um minuto. Há o frango que acabei de fazer o arquivo de índice modificado. Certo? Ninguém é privado e dois deles são a única pessoa. Então, se eu quisesse Bem, mantenha-o privado, mas compartilhe-o, então isso é tão fácil quanto ir às configurações, vá para Gerenciar acesso. Eles podem pedir que você confirme quem você é. E depois de confirmar quem você é, você pode convidar colaboradores. Convidar colaboradores é tão fácil quanto digitar o nome da pessoa. Então eu tenho outro, estou tentando defender meu outro YouTube, um cone para que eu possa demonstrar o que isso parece. Mas você pode simplesmente procurar o nome de usuário dessa arte explosiva. Eu só estava lidando com nomes de usuário aleatórios. Ele pode apenas encontrar o nome de usuário de outra pessoa, ir em frente e adicionar. E então eles aceitariam o convite, e então eles também seriam capazes de empurrar e retirar do projeto em ordem, digamos que a nova pessoa na equipe, ou mesmo se você perdesse seu código, vamos ver, sua máquina caiu. Preciso perder o projeto local e você precisa recuperá-lo do GitHub. O mesmo procedimento que alguém que acabou de ser adicionado ao projeto e precisa de uma cópia local para começar a funcionar. Tudo o que você realmente precisa fazer é ir para o código. E então você verá aberto com o Visual Studio. Depois de fazer isso, ele abrirá o Visual Studio em sua máquina. Em seguida, indique que você pode clonar a partir do repositório. Portanto, esse é um local de repositório que é o URL do GitHub shore. Este é o seu passado local. Agora está mostrando vermelho porque eu já tenho esse caminho local. É um projeto no qual estamos trabalhando. Não. Então, mais uma vez, se fosse nossa primeira máquina, então você não teria esse problema. Ou se fosse a primeira vez que você está recebendo esse projeto, você não teria esse problema com o caminho. Mesmo que você já tenha o projeto, tudo o que você precisa fazer é mudar tão rápido e ele entraria em uma pasta diferente se você realmente quisesse uma cópia. Depois de indicar onde você queria clonar localmente, basta clicar em Clonar entre Visual Studio e GitHub. Todos os arquivos do projeto que foram carregados para saber serão baixados para sua máquina e sincronizados e , em seguida, você poderá começar a trabalhar. Então é assim que é fácil para as equipes começarem a colaborar. Se você quiser tornar todo o projeto público. Serrano é privado, ou seja, se esse URL e eu tentamos crescer o terno e eu vou abrir uma nova janela anônima. Se eu tentasse cultivar terno, vou chegar a um 404. Tecnicamente, não existe comparação com um dos meus projetos públicos. Deixe-me encontrar um que eu sei que é público. Se você fosse obter esse URL e navegar por ele, ele mostraria que qualquer pessoa pode navegar para repositórios públicos no GitHub. Mas uma vez que é privado, ninguém pode, quando você está trabalhando em seus sérios prever os projetos de ganhar dinheiro, eles não querem compartilhar sua propriedade intelectual com nitidez, torná-la privada. Mas então, no verdadeiro significado de código aberto e colaboração e cisalhamento, então você provavelmente quer ter alguns projetos abertos, porque isso também pode dobrar como seu portfólio para seus pretendentes ou seus futuros empregadores Quando eles queriam ver que tipo de projetos você fez e apenas ter uma ideia geral de seus conjuntos de habilidades. No geral, o GitHub é uma ferramenta maravilhosa para conhecer novas pessoas, você sabe, ver o que outros desenvolvedores podem estar fazendo. Você pode seguir as pessoas. As pessoas podem segui-lo enquanto você publica. As pessoas podem iniciar seus repositórios ou fazer suas próprias cópias do seu código porque talvez você esteja fazendo algo que outra pessoa esteja interessada em fazer e o que você está fazendo esteja meio feito, pode ajude-os. No verdadeiro significado, mais uma vez, estão pulando na comunidade de código aberto para colaboração. Isso é o que o GitHub traz para a mesa. Então vá em frente e o que vamos fazer é fazer shorts ou um cone. Então, toda vez que tivermos uma funcionalidade, estaremos sincronizando com o repositório porque, mais uma vez, ele nos dará o histórico de tudo. Então, se cometermos um erro e algo parar de funcionar, sempre podemos reverter para a versão anterior. O que você não quer fazer é deixar muitas alterações entre as versões que você está verificando. 10. Adicione uma página de desenho de cavalo: Ei pessoal, bem-vindos de volta. Então, agora que temos uma ideia de como podemos gerar o código para visualizar os carros ou qualquer detalhe em qualquer tabela. Praticamente o que podemos fazer é continuar nessa linha e pescar todas as atividades da multidão. Então corroa mais uma vez já que criamos, lemos, atualizamos e excluímos. Então, neste momento, temos uma das opções vermelhas na forma do índice, mas não temos dados no banco de dados. Temos duas opções. Poderíamos entrar no banco de dados, colocar no registro, mas é claro, ao perceber ou não estaria fazendo isso, não estariam incentivando nossos usuários a fazer isso. Então, em vez disso, o que vamos fazer é continente para brigar com todas as páginas. E, em seguida, é a página Criar, que a clínica para o banco de dados permite usar a interface do usuário em nossos dados e, em seguida, tê-la visível a partir do índice. Da mesma forma que geramos o arquivo de índice. Vamos apenas clicar com o botão direito do mouse em carros, adicionar a página Razor. E vou fazer outra página de resultados com o Entity Framework. Agora, mais uma vez, você poderia simplesmente arrancar tudo isso, mas eu queria fazê-los um por um para que possamos avaliar os diferentes bits de código e segurar que todos eles se unem para nos dar toda a funcionalidade crud. Então, página Razor usando Entity Framework, fui adicionar essa. E desta vez vou fazer um Create. Estou nomeando a página de criação. O modelo permanece que o cria nos dará um formulário ou uma classe modelo será o nosso carro. E podemos deixar o estresse do contexto dos dados, ir em frente e clicar em Adicionar. E isso gera nossas brigas nessa página para mim. Então eu recebo o fundo de campo, bem como o arquivo de código que estamos acostumados a isso agora, lembre-se de que, se você receber algum erro sobre isso e não conseguir scaffold, acabamos de passar por essa atividade com o índice. Então, entre as lições, você pode ter se inclinado a atualizar seus pacotes NuGet e isso provavelmente causaria alguma desconexão com uma briga mais antiga. Então, se você estiver recebendo esse erro, basta reverter para a versão anterior ou uma versão antes daquela em seu nulo em. E tente novamente. E à medida que você arrasta e se você continuar pegando a área, basta continuar com andaimes de vinco ou soltando a versão do pacote NuGet e tentando arrancar. Então, agora vamos avaliar o que conseguimos através dessa briga, a atividade da página Criar. Temos nosso código por trás do arquivo, que sempre foi herdador de classe, herdando do modelo Page. E então temos nossos contextos sendo injetados. Então, em get, é apenas dizer o pH de retorno. Em outras palavras, não temos nada que precisamos necessariamente carregar para o Create, então não precisamos ir e ajustar nenhum dado para mostrar o formulário, porque eles vão apenas mostrar um formulário vazio para o usuário para que ele realmente crie um registro. Então o início está vazio, não há nada para voltar aqui, tudo bem. Também temos essa propriedade chamada cards. Então, temos um carro público e é um objeto do tipo carro, e então temos comprando imóveis. Portanto, a propriedade bancária aqui basicamente diz à página Razor que, no formulário, qualquer entrada que seja dada para qualquer propriedade que esteja dentro dessa classe, ela deve assisti-la. Depois que ele for enviado, ele atingirá essa postagem. Qualquer coisa que esteja desossada, será assistida para que, quando chegarmos à postagem, ele realmente raspe todos esses dados, combinando dados para as propriedades do carro do formulário. E assim podemos processá-lo nisso no post. Aqui primeiro verificamos se o modelo é válido. A validade do modelo pode ser uma série de coisas com base nos dados que estamos pedindo. Então, no caso de criar um carro, seria absurdo para um baixo, um carro a ser inserido sem um ano e com o nome OTA. Ou pelo menos talvez o nome seja a coisa mais importante. A orelha pode ser opcional. Portanto, definitivamente gostaríamos de ter certeza de que pelo menos o nome esteja presente antes de tentarmos enviar qualquer coisa sobre dois dados. Então, se o estado dos modelos for válido aqui, basicamente, isso verifica para que possamos ver quais são as regras de validação? Eles emitem, se não, basta recarregar a página. Vou te mostrar em alguns segundos. Mantenha isso traduzirá para cada um mostrando o que há de errado com ele. Mas se não for válido, basta recarregar a página. Caso contrário, o que acontecerá é que ele irá para o contexto do banco de dados, vá para o estábulo do carro e adicionará o novo objeto do carro. Veja que são os mesmos objetos que dissemos Ben propriedade quatro. E depois disso, ele salvará as alterações. Então, isso é tudo o Entity Framework funciona. Diz um, me dizendo qual mesa e me diga o que você queria fazer. Então, neste caso, queríamos adicionar e queremos adicionar um carro. E depois de aumentarmos os dados, ou seja, onde adicionar algo, excluir algo, atualizar algo. Uma vez que estamos alterando algo sobre os dados, precisamos chamar as alterações de salvamento. Agora você notará o aguardar. Quando eu clico duas vezes, espero, você verá que há esse outro título chamado coletor. Então, na programação assíncrona, você verá muita dessa tarefa assíncrona fora do tipo em que realmente resulta. Observe que o início é apenas um resultado de oxigênio. Este é o resultado da ação da tarefa porque é uma função assíncrona. A razão pela qual ele é assíncrono é que ele está fazendo uma chamada de função assíncrona para o contexto. Portanto, ele tem uma versão não assíncrona. Basta salvar as alterações. Mas isso exigiria que fizéssemos algumas mudanças em nosso método e em todas essas coisas. Mas se isso gerou isso para você, sempre tentará fornecer o código mais eficiente com base no que ele é capaz. É por isso que estamos recebendo as versões assíncronas desses métodos depois que ele salvou as alterações e tudo está bem, então redirecionamos para o índice da página é mesmo que o código gerado sabe que deve estar procurando por uma página chamada Índice. Essa página de índice estaria aqui no mesmo nível que criar. Depois que tudo estiver pronto, ele apenas redirecionará para a lista e você verá seu registro recém-criado nessa lista. Agora vamos dar uma olhada rápida no arquivo HTML que foi gerado para nós. Não é muito, é um formulário pequeno porque a tabela não tem tantos registros para lamentar muitos campos para preencher. O que conseguimos, pegamos um, pegamos o carro. Se pudéssemos realmente redesenhar essencialmente criar carro. Essa é a nossa tag H1, remova essa H quatro. E então temos algumas divs Bootstrap. Temos uma div com uma classe chamada rule, e então lá temos uma classe chamada MD4. Isso significa que está ocupando quatro colunas na regra. No Bootstrap, o sistema de grade é tal que você pode criar uma regra e, em seguida, você pode ter col, traçar um número o que você tem até 12. Assim, você pode ter tantas divs de chamadas em vez de uma linha de até 12. Então você poderia ter 12 um ou três, quatro ou quatro três. Tudo bem, você pode misturar tanto e simplesmente não escolher ter nenhum, certo. Então, se eu quisesse formar um distrito em frente ao que vi na seção HTML deste curso quando acabamos de criar o formulário, nós demos a ele todas as tags de formulário e assim por diante um esticado o mais amplo possível, então você não teria que especificar nenhum col md. Então você pode experimentar isso. Veja a documentação para as diferentes medidas de coluna, e podemos experimentar isso e ver como isso se parece. Mas o mais importante é a nossa forma. Então, no formulário, temos essa div que diz resumo da validação do traço AASB apenas no modelo. Ele também tem outro modo que vê tudo. Tudo bem, então às vezes eu costumo encontrar tudo isso. Às vezes você ama apenas o modelo. Tudo bem. Quero dizer, você verá os benefícios de um e não do outro, embora seja mais global. Então, eu só recomendo que você use tudo quando tiver dois. Então damos a ele uma aula com perigo de tiques. Esta seção da página realmente é preenchida com quaisquer erros de validação que estavam presentes quando dissemos que se o estado do modelo não é válido, retorne o pH, então isso é automático. Então, o estado do modelo está realmente caminhando para ver, bem, este é o modelo inteiro e isso está sendo desossado. Quando os dados são inseridos e no Post, ele irá transportar todos os dados que foram inseridos aqui através do formulário. Você verá que você tem duas entradas. Um para o meu carro ponto ano. Eu não quero colocar o nome do ponto então obtemos o rótulo, obteremos a entrada e, em seguida, obteremos o spun com essa mensagem de validação sendo incorporada. Assim, em dois lugares, as mensagens de validação aparecerão abaixo da entrada e na parte superior do pH em um resumo de geração. Sempre que é postado um cheques, era válido? Caso contrário, retornaremos à página quando ela recarregar essa página. Entre o resumo da validação e esses períodos de validação, veremos todos os textos que indicarão por que algo não foi votado. O que vou fazer é virar isso porque é nossa fazenda. Foi gerado para nós o que podemos mudá-lo por conta própria. Então eu fui colocar este grupo de formulários para um nome acima do ano. Essa coisa que flui mais. Está colocando o nome do carro e colocando o ano. Isso é opcional neste momento. E então temos o botão Criar embaixo com a classe BTN será dez traço primário. E você pode até estender esse sentido que bloqueia btn, ele se estende por toda a página. Em seguida, temos nossa lista de volta ao botão List. Então, se a pessoa chegou até aqui e iniciou, Ok, eu não quero mais criar o carro. Eles sempre podem voltar para a lista, voltar para o índice. Abaixo de tudo isso, há uma seção para os scripts. E o que acontece é que todo esse fluxo de trabalho de validação que acabei de descrever, é realmente uma combinação de nós adicionando regras de validação e estou prestes a mostrar como isso funciona. E alguns parciais ou arrependidos, são alguns scripts que são renderizados na página. Esse bit de código, está renderizando parcialmente assíncrono para scripts de validação. Se olharmos na pasta compartilhada, você verá esses scripts de validação parcial de sublinhado exatos parciais. Aí está. E se você olhar nessa parcial, verá que tudo ele tem duas tags de script para validar ponto jQuery. Então, para bibliotecas jQuery, que vimos em ordem www raízes. Só estou tentando mostrar como tudo está interligado aqui. Temos o jQuery validar, como o jQuery valida em intrusivo. Então nós temos esses, acabamos de criar uma estrutura parcial ou a estrutura gerou essa parcial para nós que automaticamente tem referências a isso. A qualquer momento, ele gerará um formulário para você ou mesmo se você criar seu próprio formulário. Mais tarde, veremos como você pode criar seu próprio farm a partir do zero ou da sua própria página, então você pode realmente usar esse bit de código para obter esse tipo de fluxo de trabalho de validação em todas as partes quando quiséssemos dizer quais campos são válidos ou arrependidos, ele deve ser validado e contra quais regras temos que ir para o modelo real que está sendo usado ou para a entidade real. Colocar esses atributos são anotações de dados é tão simples quanto ir acima do campo ao qual você deseja que a regra seja aplicada. E, em seguida, usando colchetes e, em seguida, veremos necessário. Então essa é a nossa primeira regra que diz que, a qualquer momento, os dados devem ser inseridos em qualquer página que seja modelada fora carro ou qualquer formulário modelado fora do carro. O campo nome é obrigatório. Esse é o passo número um. Que outras regras podemos ter? Também podemos querer dizer que comprimento da corda deve ser, e então podemos ver um comprimento máximo de talvez 50. Portanto, nenhum nome de carro deve exceder 50. Deixe-me colocar isso para 150. E então poderíamos dizer que , se não for excedido, quer uma mensagem de erro do meu nome. O nome é muito longo. Algo que também podemos definir um comprimento mínimo para que a pessoa não possa inserir nada com um personagem, você sabe, coisas assim. Então, você pode simplesmente encadeá-los logo acima do campo. Agora, colocando essas regras contra a entidade devedora, porque esta é a entidade real que está sendo usada para gerar a tabela como vimos quando adicionamos um conjunto de banco de dados. Adicionamos nossa migração. Quando eu colocá-los aqui, na verdade vou afetar o banco de dados. Então, se eu gerar outra migração neste momento, e vou gerar uma. Eu fiz regras de validação, pressione Enter. E quando você fizer isso, lembre-se sempre de alterar o projeto padrão para o projeto de dados. Mas uma vez que isso seja feito, então você pode ver aqui que os bens são uma sintaxe da coluna do altar. Aqui está dizendo que altere a coluna com o nome, nome porque esse é o que acabamos de definir as regras acima. Então o tipo ainda é, o tipo é int varchar 150. Portanto, antes de estar em var char marks, observe que, enquanto estiver sentado como limitação de comprimento de string, ele mudará o tipo de dados no banco de dados para saber que mesmo assim, ele não pode armazenar mais de 150. Tudo bem? Não, não é mais inaudível porque agora tornamos necessário. Então, antes que fosse verdade, não era azul. Poderíamos ter levantado o MTU. O banco de dados não teria um problema. O banco de dados em si o recusa ativamente. Se for nulo, se nada for fornecido, ele fornecerá uma string em branco como um valor padrão, mas não pode ser nula. No entanto, no lado do cliente, nem sequer aceitaria a string em branco porque é necessária. Então, quando testarmos ou formarmos na página de índice, vou clicar em Criar novo e, em seguida, temos nossos formulários. Então, por causa da chamada MD4, você vê que ela está se estendendo apenas para até quatro. O que podemos fazer, basta explorar isso. Vou inspecionar elementos que podemos brincar com essa largura. Se eu fizesse isso chamado MDA oito, por exemplo, você se estenderia para oito vezes. Então, de onde vemos o EHR? Linhas que se estendem da esquerda para a direita, são tão largas quanto as 12 colunas. Então eu sei que ele vai ocupar oito dos 12. Se eu não especificasse uma largura, então é assim que ela seria. Seria meio pequeno. Então, se quiséssemos que ele se estendesse completamente e então poderíamos apenas dizer col md. Então eu só vou fazer isso aqui, é igual a chamadas. Portanto, essa é uma maneira agradável e perfeita de testar como seria antes de realmente encontrar a mudança de código. Então, em nenhum lugar vendo chamado painéis chamados. Então você pode dizer col dash AMD, T12, ou seja, em uma tela de tamanho médio, tamanho de ponto T corp. Ou se você quer que ele seja universal em todas as telas e ocupe esse tamanho de modo ou não mathspace, você pode apenas dizer que col dash T2 são chamados dash o número. Então, aqui vemos que ele está se esticando , em última análise, da esquerda para a direita, tanto quanto possível. E então temos nosso botão Criar, que é o bloco btn. Se eu apenas tentasse criar esse ponto. Lá vamos nós. Estamos vendo nossa validação funcionando. Então, em nenhum lugar obtendo esse resumo de validação no topo e , em seguida, estamos recebendo as mensagens de validação abaixo. Não, não dissemos campo do ano que era necessário com base em nossas regras. O que vou explicar por que você vai ver isso. Portanto, é bom entender essas nuances com todo o prato válido e quais campos estão validando automaticamente, por assim dizer. Porque o ano é um número inteiro e não um int anulável. Por padrão, quando você vê int no C-Sharp, isso significa que nunca pode ser nulo. Tudo bem? Então nano significa vazio. Mas então um int nunca pode estar vazio. Um int sempre será padrão para 0. Isso significa que quando enviamos apenas nem tentei enviar nenhum, se modesto, é válido. Não era válido porque o número inteiro não obteve um valor. Nem sequer obteve o 0. No que diz respeito, é inválido. Então, se eu tivesse colocado um 0 lá, a mensagem de validação desaparece. Se eu tentei criar, fica satisfeito, tanto quanto 0 não é um ano válido para nós. Zera um valor válido comparado ao nulo para um inteiro. Estou apenas tentando explicar que todos os diferentes tipos de dados podem ter seu próprio tipo de validação acontecendo com base em espera. Eles trabalham em C-Sharp. Mas, em última análise, se eu não colocar nada lá, ele vai automaticamente apenas dizer, bem, é necessário. Se eu tentasse criar, ele não vai mais longe. E se você quiser mais provas, vou colocar nossos pontos de interrupção nessa linha onde ele verifica, é válido? Clicamos em Criar, ele atingirá esse ponto de interrupção. Bem, não vai atingir o ponto de interrupção saber porque a validação está assistindo ativamente. Então deixe-me ir em frente e criar carro. Na verdade, isso está no meu carro antigo. Belo GAR, vá em frente e clique em Criar. E como ainda não há erros de validação ativos, o que temos é essa verificação para ver o estado do modelo é válida. É válido. Isso está dizendo que se não for válido, retorne ao pago. Então, como é válido, ele vai avançar e adicioná-lo ao banco de dados. Só vou remover esse ponto de interrupção, pressione F5 para deixá-lo continuar. E então ele faz isso redirecionar para a página de índice, que então executa a consulta para ver e me colocar todos os carros no banco de dados e exibi-los. É assim que tudo está interconectado. Então, vou tentar fazer outra criação. E eu vou colocar esse ponto de interrupção, apenas pegar e ver o que está acontecendo. Vamos clicar em Criar e você verá que ele nem atinge o ponto de interrupção porque, no lado do cliente, ele está se recusando ativamente porque as regras de validação estão realmente configuradas para o campos baseados nas regras que nos sentamos. Se destacarmos ou inspecionarmos a caixa de texto para o nome, vemos aqui que temos dados que Val é igual a true. Então, todos eles são gerados pelo JavaScript. Então, entre nossas regras que configuramos no C-Sharp e as bibliotecas JavaScript no cliente disseram que todos esses atributos foram adicionados à caixa de texto. Portanto, dados Val é igual a verdadeiro significa que devo fazer a validação de dados neste campo. Os dados de comprimento. Isso significa que o erro com base no comprimento, é a mensagem de erro que tínhamos digitado. O máximo é 150. Então, todas as pequenas regras que configuramos, você as verá sendo aplicadas nos fóruns de atributos aqui. E não tínhamos esse código extra. E se você olhar para o nosso arquivo HTML, ele ainda é o mesmo isquio. Não o digitamos e ele não modificou o arquivo em si. Tudo isso está sendo feito em real toda vez que a página da Web for carregada. que fizemos, tudo, o que vamos fazer é apenas atualizar o banco de dados porque ele acabou de criar uma nova migração. E isso é algo que vamos fazer muito sempre que você fizer uma alteração em uma das classes de entidade, uma delas, você faz uma migração onde ela documentará qual mudança precisa acontecer. E se você remover a migração, o que trapaça e precisa ser desfeito ou mudar. E depois de fazer a migração, voltamos e dizemos atualizar o banco de dados. Então, você pode realmente usar a guia. Se você digitar alguns de vocês para fazer é pressionar Tab para finalizar o resto do banco de dados de atualização. E se tudo correr bem, você verá feito. Agora, há momentos em que você pode obter erros. Talvez algumas das alterações que você deseja aplicar possam entrar em conflito com alguns dos dados que já estão lá. Às vezes isso acontece, mas como eu disse, sempre que esses erros surgirem, trabalharemos juntos com eles. Então você pode ter uma boa ideia de como solucionar problemas. Ele deveria surgir? Quando voltarmos, continuaremos com nossa aventura de código. Até agora temos o Criar, temos o r, Então temos o c, temos o R na forma desta página de índice. E então podemos fazer a edição em seguida. 11. Adicione uma página de vitrine de caveira: Tudo bem, bem-vindos de volta pessoal. Então, agora estamos em nossa nova atividade, que é configurar a página de edição. Então, as edições seriam a atualização bruta da ONU. No momento em que vamos editar algo, você basicamente está fazendo atualizações nos dados existentes. Então, continuar ao longo da mesma linha de andaimes , corretamente carros, pasta de carros, vá em frente e aquecer. Há uma página, uma página usando o Entity Framework. E então este chamaremos de edição. Meu raciocínio para usar esses nomes de página. Por que eu disse edições em vez de atualizar ou disse índice em vez de lista. Você notará que, na página de índice, esses são os nomes das páginas. Espera-se ver isso sendo dito, no entanto, se esses não são os nomes de páginas que você deseja, você sempre pode alterá-los. Então, se eu quisesse que isso dissesse atualização em vez de editar, então tudo ficará bem. Vou chamá-lo de atualizações. Fui alterar esse modelo de Criar para editar, então obtemos esse formulário de edição e você verá a diferença entre os modelos de criação e edição. classe modal ainda é carro, contexto de dados significa o mesmo anúncio. Então, obtemos nossos dois quintos. Então, recebemos atualizações, CSEA, esmalte e o arquivo modelo por trás dele, neve, isso é atualização. Mas se eu voltar para a página de índice, o código gerado está procurando a página ASP vai querer ver é editar e não atualizar. Tudo bem, tudo bem. Eu posso apenas torná-lo nulo Cada um espera atualizar a página. Também posso alterar o texto se quiser, porque esta é apenas uma marca âncora. O que é preciso que eu quero exibir? Posso dizer que quero exibir a atualização, mas vou deixá-la na edição porque a atualização não é tão fácil de usar ou os usuários realmente não se relacionam com a atualização da palavra como editariam. O que você apresenta aos usuários. Sempre importante. Mas você pode ter um pouco de margem de manobra com seus nomes de arremesso. Mas isso é tudo o que eu queria demonstrar não por edições do Nimitz, colocar nomeando, atualizando. Você quer ter cuidado se estiver indo contra a norma, então você precisa atender cada vez mais para facilitar sua implementação. No entanto, caso contrário, se você seguir as normas, sua necessidade de personalização será bastante reduzida. Vamos voltar ao nosso arquivo de código para o arquivo HTML CSS de atualização. Portanto, é praticamente a mesma coisa em que injetando o contexto do banco de dados também, temos o mesmo tipo de propriedade band, propriedade que vimos no Create. Então, vamos ter o primeiro. Vamos ter campos para o carro no fórum. Precisávamos observar as alterações nos valores da propriedade para que pudéssemos processá-los no post. Observe, no entanto, que estão no GitHub tem muito mais ação acontecendo, então teremos nos acostumado, e vamos apenas percorrer o que está acontecendo aqui. Primeiro, você notaria que isso é assíncrono, então eles fizeram isso funcionar desta vez, e ele tem um parâmetro para int id. Agora observe que este int tem um ponto de interrogação ao lado dele. Então, anteriormente, eu teria mencionado ins neoliberais versus int. Então int significa que não é opcional, tem que ser pelo menos 0. No entanto, há momentos em que você pode precisar de um valor nulo na variável que deveria ser um int. Nessa situação, eles estão basicamente dizendo que alguém pode tentar navegar na página de atualização sem fornecer um ID. Tudo bem, então isso significa que quando ele atinge aqui, esse valor de ID seria nulo. A primeira coisa que ele faz é verificar se o valor de id é nulo e, em seguida, retornar não encontrado porque não consigo encontrar nada. Não significa nada. E se você está me dizendo que quer editar um registro sem nada como ID. E já passamos por espera que o ID é aquele identificador exclusivo no banco de dados? É uma chave primária. Isso é o que é o ID. Se você me disser que quer editar um ícone de gravação, volte para a ideia do registro que vou dizer se não é telefone e não consigo encontrá-lo certo. Então, sempre que tivermos essas 404 páginas em qualquer site, basicamente o que isso é tudo o que eles estão fazendo, eles estão retornando, não telefonados. Tudo bem. Se nenhum ID for fornecido, não consigo encontrar nada. Isso é praticamente o que estamos vendo para o usuário. No entanto, se for além disso, podemos supor que o ID tenha um valor. Então, tentamos encontrar esse valor no banco de dados. Isso é basicamente dizer, vá para o contexto, vá para o estábulo do carro. Então vá para mais tarde, desculpe, vá para o estábulo do carro e me dê o primeiro registro padrão em que o ID corresponde ao valor que está chegando. Isso é o que chamamos de expressão lambda. Tudo bem, então coloque demais. M poderia ter sido qualquer Tolkien, isso poderia ter sido a palavra registro igual w, q igual W2 word filhote. M não é, não é nada abertamente especial. No entanto, m seguido por essa seta, que vou chamar de seta do Lambda, faz dela uma expressão lambda, o que significa que você está basicamente definindo funções como recursos dentro de um declaração. Tudo bem, então essa é uma expressão lambda. Então eu poderia ter usado um elixir degenerado m, tudo bem. Mas eu poderia ter usado qualquer letra, qualquer palavra, qualquer Tolkien e dito flecha de Tolkien. Então o Tolkien basicamente representa todos os registros no banco de dados. Então, em vez de eu ter que usar como um loop for-loop, porque já estabelecemos não carros é como uma lista de cartões ou a lista de registros no banco de dados. Já olhamos como teríamos que usar para loops ou para cada loops para passar pelo menos para obter todos os registros em vez de dizer que me dê os carros. E então, para cada cartão que está no banco de dados, se o ID corresponder, basicamente isso está fazendo toda essa lógica que acabei de descrever para nós. Então o Tolkien aqui representa qualquer registro no banco de dados. Nós obtemos as propriedades para que eu possa dizer m ponto m nome do ponto, m ponto ano. Então, se eu precisasse procurar algo, eu poderia usar essa expressão lambda para pesquisar por nome por ouvido. Nesse caso, estamos pesquisando por ID. O ID muito é o valor que está sendo passado pela tentativa de navegação do usuário para esta página. Posso ver se o carro não é porque talvez eles passaram no ID TIN e não há carro com um ID dez, isso significa que nada teria sido levado para o banco de dados. Então, estamos dizendo que se nada foi encontrado, então retornamos a página. Há maneiras de refatorar isso, mas posso explicar por que foi escrito assim e por que provavelmente iria querer refatorá-lo ganho. Foi escrito assim porque um banco de dados chamado é caro. Gosto de pensar neles como uma coisa cara. Você faz isso quando for necessário. Quer apenas fazer isso fora do, mas só porque praticamente o que eles estão dizendo é que se nada foi fornecido, não espere. Um banco de dados chamado, verifique se algo foi fornecido e, se não, então mate-o bem ali. A pessoa está perdendo tempo e recursos. Mate-o ali mesmo. Não desperdice a chamada do banco de dados. Depois de fazermos a chamada de banco de dados, ainda queríamos saber se esse respeito telefonou? Se não for encontrado, retornaremos não encontrado 404. Caso contrário, retornamos o pH com os dados carregados on-line com uma criação onde o Create só tinha o vazio ou apenas a instanciação do carro. Então não havia nada no cartão, isso estava vazio. É por isso que obtemos o formulário vazio. Porque o nome do ponto do carro estaria vazio. ano do ponto do carro estaria vazio. Cabe a nós preenchê-lo e ele seria preenchido e inserido no banco de dados no post. No entanto, nas atualizações estavam tentando preencher isso com dados antes de voltarmos à pizza, lembre-se que eu disse que você quer colocar tudo dentro das propriedades antes de enviá-lo para o real apareceu antes de contestar usuários. Então, assim como com o índice, estamos em get. Fomos em frente e executamos a consulta. Então lembre-se de que isso estava sendo usado, isso está sendo usado na própria página, carros de ponto modelo. Ao contrário do índice em que não estamos, desculpe, assim como com o índice em que preenchemos os cartões com dados antes de retornar a página. Precisamos fazer isso para a atualização. Então, precisamos encontrar o registro e depois retornar a página. E então ele vincularia automaticamente os valores existentes provenientes da ferramenta de banco de dados, os campos de entrada no formulário gerado, que são capazes de examinar em alguns segundos. Então, é por isso que foi escrito assim. Se não houver ID fornecido, não desperdice o banco de dados, ligue, elimine a execução. Caso contrário, tente encontrá-lo. E se você não conseguir encontrá-lo, mate a execução, caso contrário, vá em frente e mostre a página. Não, isso pode ser refatorado para ter uma instrução if porque essas duas instruções if enquanto estão verificando dois cenários diferentes, estão realmente fazendo a mesma coisa. Se quiséssemos uma resposta diferente para qualquer um deles e temos duas linhas de código para mudar. fator de perguntação pode ser que, ok, arriscamos a chamada de banco de dados. Nós tentamos encontrar o carro independentemente, não obtemos o valor. Tudo bem, então eu poderia apenas dizer que se o carro é nulo, porque no final do dia, se nulo for passado teoria , só vai ver se o ID é equivalente a nulo, que nunca aconteceria. Então o carro seria nulo, nós retornamos não encontrados. Ou se esse valor for 0 ou algum ID que não exista, Kyra ainda será nulo, retornará, não telefonado. Veja, só estou mostrando que o código gerado, mas não tenha medo de explorá-lo e modificá-lo, como você pode pensar que pode ser mais eficiente. Mas estou te dando os dois cenários e explicando por que um cenário foi configurado dessa forma. E quais são os prós e contras disso? Agora que temos uma ideia do que o início está fazendo e eu não vou modificar isso. Vou deixá-lo como está. Não, podemos ver o que a página HTML tem para nos mostrar. Portanto, a página HTML ficará praticamente idêntica ou criará. Neste ponto, não, você está vendo bem que há dois dois mesmos fóruns literalmente lá para vê-lo formulários. A diferença aqui seria essa forma degenerada aqui. Diz atualização de carro e eu fui mudar isso para editar o carro. Retire qualquer coisa que não precise. O botão por padrão é salvo no formulário decretado. Dizia criar. Tudo bem, e então podemos mais uma vez pegar o bloco btn e colocá-lo aqui. Além disso, se não quiséssemos a classe para ela chamada MD4, poderíamos encontrar o chamado MD, seja lá o que for. Só estou mostrando que os dois formulários geralmente são idênticos entre um formulário de criação e atualização na maioria dos aplicativos da Web, geralmente são idênticos. Neste ponto, você poderia tomar outra decisão de design. Você poderia fazer uma página que diz que talvez upsert, atualize e inserções que suporte mental surjam para atualizar e inserir. E eles chamam isso de absurdo. Este absurdo Pij praticamente no, ETC. Recebi um ID no Get eu recebi uma identificação? Se eu consegui uma identificação, tentei encontrar o carro e depois voltar para o campo. Caso contrário, basta carregar a página vazia. Dessa forma, se os dados forem apresentados aparecerão. Se os dados não forem apresentados em terra. E então ele poderia fazer outra declaração se aqui para ver se o ID está presente em terra um valor no botão ou mostrar o outro botão chamado este é um botão de atualização. Eu gostaria que fosse btn-primário, eu gostaria que fosse isso para ser um perigo. Então é laranja. Só estou te mostrando , estou apenas explicando considerações de design diferentes. Todo mundo tem contextos diferentes. E então eu posso fazer algo que você está vendo, se eu não preciso fazer isso dessa maneira. Ou você pode fazer algo em um colega ou amigo seu e você vê que não precisa fazer isso dessa maneira. Mas os contextos devem sempre ser o fator determinante para suas decisões ao desenvolver um aplicativo. Vamos continuar. Não vou fazer essas coisas absurdas, só vou te dar uma ideia. Mas o ponto é que os formulários são quase idênticos. mesmas regras de validação seriam aplicadas. O dinheiro para listar está lá, temos o botão, temos nossos campos de entrada. Só vou reorganizar este. Então, parece exatamente o Criar em termos da ordem dos campos. Mas há uma coisa que eu queria apontar e essa é essa entrada para o oculto mudou isso para tudo no último. Para o oculto. Se você voltar ao nosso Criar, não haverá oculto. Para um ID. Esse campo oculto é absolutamente importante. Primeiro, é oculto porque nossos usuários realmente não precisam conhecer nossas chaves primárias. Pense nisso. Na Amazon, você pode ver nosso número de produto, mas esse número raramente é nunca. A chave do pária Mary. Você pode ver um número ISBN para um livro ou algo assim. Você sabe, um número de identificação para nossos alunos. Mas isso raramente é a chave parietal. A chave primária é interna ao sistema. No entanto, é absolutamente necessário para caminhões. O que acontece, porque se não tivermos essa chave primária sendo caminhada neste formulário, então ela sempre assumirá que esse é um novo registro. Tudo bem, então temos que é por isso que eu crio não tem isso porque é sempre um novo registro. Não há ID quando você está criando algo. No entanto, quando você está editando ou atualizando a coisa toda que passamos pelos ungulados, é óbvio que o ID é muito importante. E temos que lembrar o ID através do formulário. Então, quando essa pessoa envia a fórmula, nós batemos de volta para o post on, você vê muito mais de repente a bordo? Sim, nós validamos. Já passamos por como a validação parece, tudo bem. Mas então aqui onde dizemos contextos pontuam carro anexado e muda de estado para modificado. O que realmente está acontecendo aqui é que estamos vendo banco de dados. Por favor, comece a caminhar este carro de objeto. Então, teríamos conseguido o registro original do carro aqui. Se o nome fosse uma abobrinha para o esporte. Isso é o que temos aqui. O ano era 2013, foi o que conseguimos. O ID era três. Não, não ouça depois de ter sido editado, a ideia nunca deve ser editada porque o IID diferente significa que é um registro diferente. É por isso que está oculto e não permitimos que o usuário o veja ou interrompa com ele, mas está sendo transportado em segundo plano. Agora, se eu mudei de Suzuki. Nos esportes e em como, oh, não era um esporte. Deixe-me tirar o esporte. Então o que estamos vendo é banco de dados. Por favor, comece a assistir a este registro e saiba que ele foi modificado. O banco de dados saberá que ele foi modificado ou Entity Framework saberá que ele foi modificado ou outro por causa do ID. Então, vai presumir que algo sobre ele muda. A única coisa que não deve mudar é o ID porque o ID está presente, ele saberá disso. Certo. Tenho um registro com esse ID, certo? Não. Então, o que vou fazer é salvar as alterações que foram feitas nesse registro com esse ID. Em essência, ele vai acabar com duas versões. Vai ter o registro original que acabamos de recuperar. E então ele terá esse novo registro ou essa nova versão do registro COVID, mas propriedades potencialmente diferentes. E, em seguida, Salvar alterações, diremos, ok, vou salvar os novos dados na tabela de acordo. Isso, neste, você verá que temos um try-catch porque esta é uma situação mais delicada. Ou seja, e se duas pessoas tentassem atualizar o carro? Cliquei em editar este carro. Segundos antes de você clicar em editar este carro, nós dois temos esse registro de aço ou pelo menos quem os dois atuais exigiram, então eu faço uma alteração. Eu mudei do ano de 2013 para 2015 e depois clicarei em Salvar. Você gastará sob o tempo abaixo registro e todo o seu registro é de aço porque você tinha a versão do registro antes de eu atualizá-lo. Quando você clicar em Atualizar, você tentará salvar as alterações. Eu ganhei algo que já estava atualizado desde que você clicou nele. Isso levaria a esse tipo de erro ou eu não sabia sobre tentar e pegar ou manipular exceção, explorar o C-sharp, que estamos fazendo é tentar salvar as alterações, mas então é apenas esboçando explicitamente esta exceção de simultaneidade de atualização de banco de dados, que é esse mesmo cenário que acabei de mencionar. Eles precisam ver isso, bem, se o carro não existir, então retorne não telefone porque talvez tenha sido excluído no momento em que estou tentando atualizá-lo. Se não pensar desde então, retorne não telefone, caso contrário, basta lançar uma exceção e erro mais maneiras de Griswold para lidar com isso, mas é isso que o código gerado está dizendo nós. Portanto, isso não é problema. No entanto, se o julgamento foi bem-sucedido, não havia nada capturado, então retornamos o discurso do índice. Não, este é apenas um método de carro que basicamente retorna verdadeiro ou falso. O banco de dados verifica o carro estável se houver algum registro. E aqui está outra expressão lambda. E só para mostrar que o Tolkien realmente não importa em cima é a mesma expressão lambda, mas usamos m aqui embaixo. É a mesma expressão lambda que usa apenas E. Se você quiser compará-los novamente, basta copiar isso e colocá-lo perto disso. Eu olhei para o fato de que eles são o mesmo código, apenas dois diferentes lambda Tolkien. É basicamente apenas dizer: Existe algum carro no banco de dados que tenha esse ID? Se sim, então tudo bem. Caso contrário, volte. Não telefonou. Então, se ele existir, isso significa que os dados ainda são que estou tentando mudar. Então, lança uma exceção, ou podemos simplesmente enviar um erro de botão dizendo Ei, algo deu errado. Você provavelmente quer tentar essa operação novamente. Tudo bem, vamos ver como essa operação de atualização funciona. Então, vou apenas ir em frente e pular. Tudo bem, então não, vamos ver como essa funcionalidade de atualização funciona. Quando clico em Editar. Observe que ele trará os dados. Isso não deveria ter sido um botão vermelho, que deveria ter sido alerta btn, não ser perigo de dez traço. Deixe-me fazer essa mudança. Não há aviso para um botão laranja. Depois de fazer essa alteração, posso apenas atualizar. E lá vamos nós. Não, é um botão laranja. Então, vamos ver como é essa operação de edição. Observe na URL que você vê a atualização da barra de carros e, em seguida, as cadeias de consulta. Portanto, lembre-se quando falamos sobre a string de consulta chamada dados é transmitida através de formulários. Então, quando usamos um GET, então não especificamos que ele realmente colocará todos os dados e cadeias de consulta que podem ser perigosas. E enquanto estamos trabalhando em um site estático sem nada particularmente perigoso sendo transmitido do nosso formulário para qualquer lugar, tudo bem. No entanto, você não notaria que eles geram formulários explicitamente com método igual a post, porque quando você publica os dados ou quando você envia o formulário, você não quer enviar dados na string de consulta. Especialmente como quando você está lidando com informações de cartão de crédito ou informações pessoais dos usuários. Ainda voe esse nome de usuário e senha. Você não quer isso na string de consulta que eu falo. Embora seja inofensivo usar a string de consulta para o ID, ela pode não ser inofensiva quando você está enviando do formulário. É por isso que sempre queremos ter certeza de que nossos formulários, nosso método seja igual a postagem. No entanto, vamos fazer uma pequena experimentação aqui. Então, estamos falando em ambos, o buraco fica certo. Então, quando navegarmos para indexar com o ID, vou colocar um ponto de interrupção aqui novamente. Só vou atualizá-lo quando ele atingir o ponto de interrupção. E passamos o mouse sobre a propriedade ID, você vê esse ID sendo passado. Então é isso que abriu. Obtemos esse ID que está chegando através da string de consulta. E então somos capazes de determinar, ok, aqueles carros de ponto existem em nosso sistema. Agora veja o que acontece quando eu mudo esse ID para um que não existe. Eu só tenho um carro no meu ID do sistema. Não há carro com o ID TIN. Se eu tentasse manos lá, recebo dez. Tudo bem. E então, se eu apenas fizer F5 e continuar, então você veria que ele está apenas dizendo que não pode ser telefonado para HTTP ou fluorophore. Então isso é o que recebemos em virtude de chamarmos de retorno, não telefonamos. Tudo bem, então isso é basicamente segurar, isso funciona. Agora observe mais uma vez que este é um método on post. O método on post é o que vai funcionar com o formulário que está enviando com o método é igual a post. Tudo bem, então deixe-me voltar para o gravado que temos Vamos fazer alcançado. Então, o ano foi 2215, não 2013. Tudo bem. Fui salvar e depois olhei para isso. 2015. Lembre-se de que isso está sendo carregado do banco de dados toda vez que você atinge o índice, ele está consultando o banco de dados. O que quer que você veja aqui é o estado atual do registro que está em poucas palavras. A atualização inteira funciona. Não importa o quão complicado um sistema possa parecer, quão sofisticados os botões e animações e assim por diante. O que estamos fazendo aqui está na raiz de cada sistema, o site com o qual você interage, tudo o que eles estão fazendo é permitir que você coloque dados no banco de dados por meio de reforma, modificado por meio de um formulário. Olhe para isso através de uma página de índice ou de uma página de detalhes que vamos ver em alguns ou excluídos. Eventualmente. Isso é tudo o que realmente está acontecendo, não importa qual sistema você está olhando. Quando voltarmos, analisaremos a implementação ou exclusão da funcionalidade. 12. Adicione detalhes página de Razor: Tudo bem, então estamos de volta. E eu sei que na lição anterior eu disse que trabalharíamos no Excluir, mas tenho uma surpresa para o Excluir, vamos fazer as coisas um pouco diferente para o Excluir. Em vez disso, vamos trabalhar em nosso discurso de detalhes. Tudo bem, vamos pular para o nosso código. E acho que agora conhecemos o Drew. Vamos brigar ou detalhar a velocidade. Portanto, clique com o botão direito do mouse na pasta cars, adicione a página Razor usando Entity Framework, estamos chamando isso de detalhes. E o modelo seria o modelo para detalhes. Então nosso modelo é carro e tudo o resto permanece. E obtemos nossa página para obter os detalhes com o arquivo de código correspondente. Saiba que a página de detalhes é praticamente apenas outra página que nos ajuda a conduzir para o r da corrosão que é lida. Neste ponto, pode ser difícil ver a relevância da página de detalhes. Porque o que a página de detalhes realmente mostra são os detalhes de algo, enquanto o índice realmente mostra a falta de uma visualização. Então, se talvez nossa tabela tivesse 20 ou 50 campos diferentes, talvez até dez campos, você não iria querer todos aqueles na lista. Pensável como um custo, uma lista de clientes ou até mesmo na Amazon. Quando você está olhando para os produtos na Amazon, eles não estão mostrando tudo sobre a proteína. Eles estão mostrando o nome, o preço deles, talvez quanto tempo levaria para enviar. Mas então, no momento em que você clica nesse produto, você vê tudo o que eu construo um protótipo, você vê todos os tamanhos e cores potenciais e de onde ele vem e que material o faz, etc. realmente para o que a página de detalhes foi projetada. Nesse caso, é discutível que é opcional porque o carro realmente quando tem dois detalhes para mostrar em qualquer ponto que seja o ouvido e o nome. Bem, mais uma vez, se fosse uma tabela maior com mais detalhes para mostrar, então você não gostaria de listar todos eles no índice naquele momento. Você provavelmente não gostaria de me mostrar ser o ano do carro ou o nome do carro. Então, digamos que não quiséssemos mostrar o ano. Só vou comentar isso. Então, quando você olha para a página de índice, você só está vendo o nome do carro. No entanto, você quer ver o resto dos detalhes sobre o carro. Você clica na página de detalhes onde eles têm o link aqui e , em seguida, sabe que criamos a página, nós a temos conectada. Então, ele vai para esta página de detalhes detalhes que HTML CSS. Vou apenas modificar isso para dizer detalhes do carro. Livre-se disso cada Doug, há um formulário antigo porque, mais uma vez, é apenas ler dados, dados como um link gerado automaticamente para ir para Editar. Então, aqui está outra coisa. Está procurando, edite fora da caixa. Usamos a atualização do nome da página. Então eu tenho que me certificar de mudar isso. Então podemos voltar para a lista, se assim o desejarmos. Tudo bem, então o que a página de detalhes ou o arquivo de código realmente está fazendo? Tem um carro de propriedade, não tem cláusula de propriedade Bend. Não há presente estrangeiro, mas tem a propriedade. E então ele faz a mesma coisa em que diz Traga-me o registro com o iodo está procurando por esse ID. Se for nulo, retorne não telefonado. Não é nulo, então tenta encontrar o registro. Se você conseguir encontrar o registro, não é telefone, retorne a página. Portanto, esse é o mesmo código que vimos gerado para a página de edição. Tudo bem, não vou fazer as modificações aqui. Ambos têm a comparação do normal fora da caixa pontuado versus nossa pequena modificação em que acabamos de fazer uma chamada de banco de dados e determinar se ela não foi encontrada. Então você pode compará-los, mas vamos em frente e correr. Então, vou apenas controlar o F5 para que possamos ver o que os detalhes pH nos trazem da nossa página de índice. Se eu bater em detalhes , verei os detalhes do cartão e isso me dará todos os detalhes. Então, mais uma vez, isso é gerado. Você pode modificar a aparência dele conforme você precisa. A partir daqui, posso clicar nele. E como modifiquei o link, não estou tendo problemas em saltar para a página de edição. Posso voltar à lista. Mais uma vez, toda a navegação está bem acoplada aqui porque cada link sabe onde encontrar. Isso é muito, muito importante de qualquer pH, você deve ser capaz de navegar para outra página. Ou o pH nulo deve ter mais de dois ou três cliques com base no tamanho de um site. Mas geralmente há uma política de tour de três cliques quando se trata de navegar entre as páginas. É isso mesmo para os detalhes, agradável e simples, em comparação com tudo o que passamos com a criação e edição para ver que os detalhes são realmente apenas carregados no registro e nos mostrando. Você pode modificar o que está sendo exibido no índice. Mais uma vez, se você não quiser todos os dados na página de índice, é por isso que temos a página de detalhes para mostrar o que não estava sendo mostrado na lista. Quando voltarmos, vamos examinar o uso de algum jQuery com nosso delete. Porque com nossa exclusão, não vou criar a página inteira para a exclusão. Você tem duas maneiras de olhar para ele e exploraremos as opções quando voltarmos. 13. Adicione uma página de caveira Apagar: Pessoal, bem-vindos de volta. Vamos procurar trabalhar com nossa exclusão operacional. Comecei a mencionar que geralmente existem dois modelos que governam manter a exclusão ocorre. Primeiro, você pode definir o tom do lead, que é realmente como um discurso detalhado, mas também funciona como uma página de confirmação porque você deseja permitir que o usuário veja o registro que ele pode excluir e, em seguida, pergunte Tem certeza de que deseja excluir? Vejamos isso primeiro. Isso segue o mesmo padrão que estamos seguindo. Vá em frente e adicione uma nova página Razor usando o Entity Framework. Vou chamar isso de excluir. Do modelo. Acabei de escolher as necessidades ou o mesmo modelo. Em seguida, obtemos nossa página gerada para exclusão com seu arquivo de código. Então, mais uma vez, injetando o contexto do banco de dados, também temos um botão apropriadamente para o carro. Portanto, alguma forma de coleta de formulário ou dados ocorrerá aqui. No Git, temos o mesmo tipo de lógica que acabamos de ver com a edição. A página de detalhes onde obtemos o ID, certifique-se de que não seja nulo, obtemos o registro e retornamos ao pH se eu gravar foi encontrado. Mas, na postagem, também verificará se o ID não está vazio. Portanto, observe que ele está procurando apenas o ID no Post. É muito possível apenas usar um parâmetro que corresponda aos dados que estão na página. Então deixe-me apenas executar o paralelo aqui. Com nossa operação de atualização. Dissemos comprar imóveis em todo o carro. Observe que não há parâmetros no OnPause. Isso porque todo o objeto do carro tinha campos presentes no formulário. Então, tínhamos uma identificação, tínhamos o nome, tínhamos o ano. Então, quando clicamos em Salvar, ele realmente serializaria todos os pontos de dados que foram inseridos e os colocava dentro dos carros. É por isso que eu vinculo propriedades, basicamente transportando quais dados foram para o objeto, então podemos operar nele. Sabendo o caso de uma exclusão, eu realmente não preciso saber o nome e o ano. Eu realmente só preciso saber qual é o ID do registro que precisa ser excluído. Em seguida, posso especificar no OnPause que estou procurando apenas o ID. Mais uma vez, posso fazer todas as verificações. Verifique se é nulo. Quero dizer, se eu estiver tentando excluir nada, retorne não pasta, mas, de outra forma, tente encontrar o registro do carro que precisa ser removido. Então, desta vez, vamos usar esse achado assíncrono. Portanto, é meio diferente dos padrões de primeira ordem porque a multa que esses Sing usam os valores-chave para que eu possa dispersar em Id em oposição ao primeiro ou aos padrões que exigem uma condição ou esta expressão lambda, onde isso é verdade, então nós pegamos um carro, enquanto o achado, ele vai ver ir para a mesa e encontrar um registro com esse ID para a chave primária, que, claro, ainda se depara o risco de ser não. Então, tentamos encontrar o carro. Esse ID se o carro não for igual a não, então procedemos a remover o banco de dados do carro, pegar a tabela de carros e remover esse registro. Então, temos que encontrar o registro. Em seguida, removemos o registro. Mais uma vez, estamos aumentando os dados para salvar as alterações. Depois de tudo isso, retornamos ao índice. Então, mesmo que Kiara fosse o modo neste caso, não retornaremos nenhum não telefonado. Vamos apenas redirecionar para o índice. Talvez você esteja tentando excluir algo que importava o tempo que você clica no lead, outra pessoa, eles precisavam, sem danos, sem falta, basta retornar ao índice. Mais uma vez, esse é apenas um código gerado. Se você quiser fazer algo diferente em seus cenários, sinta-se à vontade para modificá-lo conforme necessário. Esse cenário funciona bem porque quando passamos para o Excluir, vemos um. Parece exatamente com os detalhes. Este é o mesmo código que estava na página de detalhes. No entanto, temos uma mensagem. Tem certeza de que deseja excluir isso? Vou fazer o que sempre fazemos aqui, onde vejo as principais mudanças estão atingindo o carro de exclusão. Tem certeza de que deseja excluir isso? Mostramos os detalhes do carro, mas olhe para o formulário. Desta vez, temos um formulário sobre tudo o que está neste formulário. Bem, sim, é uma postagem de método, mas tudo o que ele tem é o oculto para o ID do carro. Essa é a análise básica P4. O Eu sou vou me ligar a essa propriedade. Então você teria visto este formulário ESP, o Criar, ver qualquer coisa das atualizações, vinculando-se a esta propriedade car dot ID. Mas então o nome da propriedade será ID. E, em seguida, no Delete, isso irá apenas vinculá-lo ao ID do parâmetro. Então é assim que eu sei que só estou recebendo o ID desse envio de formulário. Então, aqui estamos vendo que é um botão de envio com a exclusão válida e é um perigo BTN dash, o que faz sentido. Se você mudar de ideia, você sempre pode voltar à lista. Tudo bem, vamos dar uma olhada no que obtemos com a exclusão. Na lista, vou clicar para excluir. Ele vai carregar meu registro, excluir carros, então você deseja excluir isso. E assim, nos detalhes do registro, podemos optar por excluir ou podemos optar por voltar à lista. Então, se eu clicar em Excluir, ele voltará para a lista e não há mais um carro no meu banco de dados ou pelo menos as leis do banco de dados. Um cartão a menos e tinha antes de eu fazer essa operação. Só vou criar recriar o carro rapidamente. Suzuki Swift esporte. E foi um faria e criação de 2013. Tudo bem, então temos nosso registro novamente e você pode fazer isso para quantos registros precisar. Então essa é a opção um. Você gostaria de permitir que o usuário revisasse o registro e pergunte Tem certeza de que não foi possível excluir e você confirma? Saiba e se eu não quisesse introduzir uma outra página inteira apenas para a operação de exclusão. E se eu quisesse isso aqui? Quando a pessoa clica em excluir, eu pedi a ela aparecer talvez. Tem certeza de que deseja excluir? Clique em Sim e, em seguida, a exclusão acontece. Vamos tentar algo que nenhum método de implementação disso seria envolver cada link de exclusão em um formulário e torná-lo um botão de envio em vez de apenas um URL para o Excluir. Sim, temos a página, mas vamos voltar ao nosso índice e modificar ou o que está acontecendo aqui. Eu poderia dizer formulário aqui. Deixe-me acertar minha ortografia. Neste formulário, teremos o botão. Esse botão basicamente vai ver a mesma coisa que o botão atual vê não comeu. Eu não quero que ele pareça necessariamente com um botão. Quero dizer, acho que neste momento provavelmente podemos começar a ser criativos com nossos links também. Portanto, não há problema. Vou apenas dizer que a classe é igual a vt n dash. Isso é editar. Então, provavelmente vou querer que seja como um aviso. É isso. Botão It. É claro que qualquer botão precisa ser T e , em seguida, btn dash o tipo de botão. Este é um detalhe, então isso seria informação da indústria b2, apenas para mostrar as informações. E então esse botão vai ser um custo igual a b2 e perigoso, Não, eu usuário não conseguiria dizer qual deles é um botão, qual deles é um link. Todos eles ficarão parecidos. Temos este botão Excluir. O que podemos fazer é dizer onclick. Já analisamos essas coisas do evento quando estamos falando de JavaScript anteriormente, posso ver, Tem certeza de que deseja excluir esse registro? Então, clique, vou retornar uma confirmação. Portanto, esse é um método incorporado. E quando veremos o método de alerta em JavaScript? Ao clicar, confirmado é apenas mais um método JavaScripts que estou vendo desclicar retornar, confirmar. Tem certeza de que deseja excluir esse registro? Eu sou que basicamente só dá uma caixa sim, não. Isso é realmente tudo o que eu preciso para o botão. Mas, em seguida, de volta ao formulário um. Queremos ter certeza de que é a postagem do método. Agora vou explicar por que queríamos ser explícitos sobre isso ser postado. Há várias coisas acontecendo com as postagens. Portanto, os benefícios implícitos de usar as postagens que já exploramos, onde falamos sobre o fato de que os dados não estão sendo enviados no URL. Está sendo escondido em segundo plano. Então isso é bom. Sou uma proteção inerente para dados confidenciais, como nome de usuário , senha, informações de cartão de crédito, etc. Não, você provavelmente estaria se perguntando, ok, então o que desde o entregável, talvez o ID. Bem, já vimos que no Excluir Forum, mesmo assim, eles tentaram usar a postagem aqui porque esse mesmo conceito, eles apertaram o ID e, em seguida, tínhamos o botão de exclusão. É a mesma coisa que estamos fazendo, exceto que estamos fazendo isso dentro da lista no índice. Mas outros benefícios do post seriam os incorporados ao ASP.net Core, nossos recursos de segurança contra o XSS e o CRS se atacarem. É essencialmente sem entrar nos detalhes do que esses dois significam e assim por diante. A maneira como eles funcionam seria que as pessoas podem usar JavaScript e seqüestrar dados maliciosamente enviados através da rede. O que ASP.net tem incorporado ou ASP.net Core. Sempre que você tem um formulário e faz dele uma postagem de método, e então você tem isso na postagem aguardando esse tipo de envio através desse envio de postagem. Eles têm a validação de Tolkien anti-estrangeiro de que quaisquer solicitações que entram que quaisquer solicitações que entram em uma postagem são válidas do sistema e não sequestradas por uma entidade externa. Tudo bem, isso é como um recurso de segurança incorporado. Eu não mencionei que você não notaria que tudo isso está realmente acontecendo em segundo plano. É por isso que é importante que, mesmo que não estejamos gerando ou formando aqui, você sempre queira ter certeza de que o tem como postagem de método e que esses recursos de segurança estarão quase implícitos. Outras coisas que queremos fazer agora que temos o formulário, temos o botão, precisamos dizer para onde ir. Agora, quando digo estranho ao objetivo, quero dizer que as outras páginas que tinham fóruns como vamos ver, o Criar eles criaram o formulário que ele disse método post. Não tinha nada explícito para dizer para onde deveria ir. Isso porque ele assumirá uma vez que o formulário for enviado, é uma solicitação de postagem. Então, automaticamente, ele irá para o post on. Caso contrário, ele terá a mesma coisa com as atualizações, mesma coisa com o índice de exclusão, no entanto, só tem uma em Get. Ele não tem posts. E saberemos que estamos colocando em um formulário que tentará chamar um método post na página de índice que não existe. O que podemos fazer agora é criar manipuladores personalizados. Então, apenas caminhões, só para entendermos no post. E o que somos capazes de criar, esses são chamados de manipuladores. Esses métodos recebendo, postando, fazendo o que quer que seja em segundo plano, eles são manipuladores. É por isso que os chamamos. Precisamos dizer ao formulário que ele deve ir para o gerenciador de traço de página ISP, P traço. Vou ver o DDGT. Esse é o nome do manipulador para o qual ele deve ir. O método é post. Não. Além disso, também queria obter o valor de id. Vou ver é B dash, escreveu o traço ID. Isso não sou eu dizendo que quando você está enviando o formulário, eu quero que você passe por cima Eu escrevi valor ou um valor de string de consulta com esse nome. Então, se eu dissesse ID do carro ou se eu disse pulpy, seja qual for esse tipo depois que a palavra escreveu, esse é o nome da string de consulta que diz o nome do parâmetro que meu manipulador estará procurando . Então, vou deixá-lo como iodo de carro em vez de apenas o ID. Tudo bem, então agora você pode ver explicitamente o que quero dizer. Então ASP traço rota, ID do carro, ele deve ter o valor de no ID do ponto do item de sinal. Observe que toda vez que clicamos em Editar ou detalhes, ele é enviado automaticamente pelo ID. Isso porque, a partir do loop for-each, cada item onde a vinculação que é p root dash ID aqui. Então isso já está acontecendo. Vemos isso acontecendo quando você clica em detalhes. É chamado de página de detalhes e está enviando o valor de id. É por isso que, no Get, ele está observando o ID. Assim como com detalhes ou exclusão em vez do Post, ele está procurando ID, e isso é porque a exclusão, deixe-me encontrá-lo rapidamente no Excluir, estamos realmente sentando aqui. Só estou mostrando sabores diferentes. Você obtém o código gerado, mas é bom entender como você pode fazer a mesma coisa de várias maneiras. Isso funciona no formulário e está enviando o ID esta semana. Isso também funcionará com menos linhas de código, apenas com o formulário. No entanto, dizer ir para este manipulador de página e enviar um parâmetro chamado ID do carro com o mesmo valor de ID. É um método postagens. Estamos adicionando essa confirmação ao botão. E vou apenas comentar o link existente. Mas o que vamos fazer agora é criar esse manipulador de exclusão no arquivo de índice. No código de índice por trás. Posso estender isso e posso dizer público e não torná-lo uma tarefa assíncrona. Digamos que a ação da tarefa resulte porque vou querer que ela retorne resultados reais. E vou dizer no post, excluir. Veremos a sintaxe em get on post. E posso dizer post assíncrono se eu quiser. Essa é uma convenção de nomenclatura que eles reconhecem. Isso é opcional. Mas meu ponto é que eu sei é um método de postagem do fórum, então eu tenho que especificar no post para chamar a exclusão. Eu disse que seu manipulador é exclusões. Ele procurará automaticamente um manipulador chamado delete que está esperando uma resposta post. Então, basta colocar um pôster no git dirá ao manipulador que tipo de solicitação deve estar procurando na tentativa do Bureau de excluir a postagem. O que eu realmente vou fazer é apenas reutilizar esse código. Vou apenas copiar isso da exclusão gerada. Certas coisas não são adultas, mas tudo bem. Podemos preencher os espaços em branco, mas o mais importante seriam os parâmetros. Então, vou dizer int ponto de interrogação ID do carro. Por que ID do carro? Porque na minha forma, o índice, eu vi que sua raiz ASPE é ID de carro para todos os outros, era ID. O que para este? Vou dizer identificação do carro. Não estou fazendo isso por nenhum motivo especial. Só estou te mostrando. O que a raiz ASP realmente faz. Se eu alterar o ID , meu manipulador precisará procurar ID. Se eu mudei para Puppy, ele precisa procurar cachorrinho. Vou deixá-lo como identificação de carro só para que possamos ver a diferença. Então, o ID do carro do formulário, ele chamará o pH 100 delete e é um método post. Então, ele vai ver aqui e procurar um manipulador chamado delete que foi projetado para respostas no post que está foi projetado para respostas no post usando o parâmetro chamado ID do carro, então o código terá que ser ajustado porque nenhum ID não é mais ID aqui, não é identificação de carro, ID do carro. Agora eu vi que não há carro confiante em um carro, tudo bem. Posso ver facilmente, me dar uma variável local chamada carro, porque não preciso de uma propriedade da classe como da última vez. Só preciso de uma propriedade local chamada carro. Vá e encontre o carro. Você achou o carro? Sim ou não? Se sim, remova o carro. Tudo bem, então esta é apenas minha variável local dentro da exclusão. Então, quando você clica em Excluir, tentamos encontrar ID, senhor. Tentamos determinar isso. Id tem um valor. Se não for telefonado. Você provavelmente não gostaria de não telefonar aqui. Se estamos excluindo diretamente do índice, então tudo bem, tudo bem. Podemos deixá-lo. Quero dizer, mais uma vez, o contexto determinará como você quer usar uma experiência para ser. Então está tudo bem. Nós o deixamos, deixamos como esse ID de carro. Se você clicar nele, não telefonou, tente encontrar o carro. Se o carro não for igual a nulo, removemos e depois recarregamos a página de índice. Leia Erich para *****. Bem, isso pode ser facilmente redirecionado para a página sem nada nele. Então, literalmente, apenas diria, que página estou? Deixe-me recarregar essa página. Também poderíamos dizer o tom de retorno. É por isso que eu fiz. Na verdade, eu resulto aqui. Então, ao contrário deste, isso não tinha um tipo de retorno. Portanto, não precisava dos resultados da ação i. Mas neste caso, quero retornar alguma forma de comando para dizer que me leve de volta à página em que estou. É por isso que eu disse tarefa, resultado de ação aqui. Retinol apenas faz o redirecionamento para a página sem valores. Então, só estou mostrando os diferentes cenários. Quando você se sentir confortável, você começa a escrever o código em um nível de especialista, então você ficaria como, ok, sim, eu vejo como tudo corre junto e mantém tudo funciona. Vamos pegar este outro código Excluir ou esse código de exclusão alternativo para uma execução de teste. Tão bem, levou carros e, em seguida, tudo bem, podemos corrigir esse problema de exibição mais tarde. Não há problema. Clicou em Excluir. Aqui está nosso prompt. Tem certeza de que deseja excluir esse registro? Se clicarmos em Ok, ele vai, causou o manipulador, a exclusão lê Eric para o pH. Então, vamos criar outro carro de teste. Algum ano aleatório. Vou colocar um ponto de ruptura. Não estou no modo de depuração. Deixe-me ir para o modo de depuração e então podemos colocar um ponto de interrupção para ver o que acontece. Quando clico em Excluir. Eu recebo o prompt clique, OK, então ele passa a chamar o manipulador. Então, mais uma vez, ele sabia onde procurar porque eu disse ao formulário, use esse método específico e passe por cima desse ID de rota específico. E esta é a solicitação do método, o método a ser usado. Todos os três se combinam para deixar o formulário nulo que deseja ser enviado. Ele deve atingir este manipulador e o lado da codificação desse manipulador, o nome sugere que é, é um, um 100 suposto lidar com esse cenário. Este cenário é que eu quero excluir este carro, IDs de carro três, tudo bem, então vemos que o ID da rota está passando por cima. Bem, obviamente, ele telefonou para o carro no banco de dados ou ele encontrará o banco de dados atual , o removerá e redirecionará para a página em que está. Então deixe-me acertar F5 e você vê que acabou de ler o Eric sem qualquer agitação. Tudo bem, então eu corrigi rapidamente a tela é que você está tendo aqui com os botões. E é uma solução muito simples. Probabilidade, até mesmo um HUC, dependendo de como você olha para ele. Mas em vez de colocar as etiquetas de âncora lado antigo, eu coloquei tudo na forma porque o formulário é o que estava quebrando as linhas. Acabei de colocar as etiquetas âncora dentro do formulário e isso é realmente saber as consequências porque no final do dia, apenas o botão fará o envio. Se eu clicar em Editar, ele simplesmente navegará para longe. Se eu clicar em Detalhes, ele navegará para longe. Então, se eu clicar em Excluir, serei solicitado efetivamente cancelado. Nada acontece. E então, se eu clicar em Ok, vimos o que acontece. Isso é buraco. Você pode começar a trabalhar um pouco de JavaScript no nó para começar a ver, ok, bem, isso é o que é suposto fazer. Quando voltarmos, vou mostrar um pouco mais de JavaScript. Começarei a estilizar nossas páginas porque vemos que nosso botão Criar está no topo. Parece um link. Começamos a analisar o total para estilizar o botão Editar, a lista de botões ainda é um link. Os detalhes têm dois links. Então, quando voltarmos, veremos um prompt de confirmação mais robusto. Vamos usar essa biblioteca chamada Sweet alerts. Isso é um. E como podemos usar JavaScript ou jQuery para obter isso. E dois começarão a estilizar RPGs um pouco mais. 14. Como usar visualizações parciais e aprimoramentos de UI: Tudo bem, bem-vindo de volta. Portanto, nosso objetivo para esta lição é um estilo todos os nossos links para parecer um pouco mais amigável. E o que queremos fazer é colocar confirmação um pouco mais robusta na exclusão, no mínimo. Vamos começar. Em primeiro lugar, vamos criar o link de alteração e criar. Deixe-me sair do modo de depuração, ir para o meu arquivo index.html e aqui está o botão Criar. Então, vimos que tudo o que temos que fazer para nossas etiquetas de âncora é dar-lhes a classe BTN dash. Sou o principal para o Create. Vamos ficar um pouco mais criativos lá momentos em que você pode querer pensar em colocar os ícones certos? Então, às vezes você não quer que a palavra inteira edite ou todos os detalhes da palavra. E você pode até remover esses ícones de tubos um pouco. Ou mesmo como o Create que você provavelmente desejaria e é um sinal de mais em sua alma. O que podemos usar para isso seria Font Awesome, que é uma biblioteca que tem vários ícones. E podemos olhar para isso rapidamente. Se você pular para Font Awesome.com e estamos vendo os ícones na versão 4.7, você verá que você tem alguns ícones que você pode usar. A maioria deles é gratuita. Você pode ter que pagar ou se inscrever em alguma conta que eles tenham, mas tudo bem. Mas agora, há tantos ícones que você sai da caixa que é muito legal. Então, se você quiser um sinal de mais, tenho certeza de ter um Pelosi uso de plus. Acho que eles têm como um feijão ou lixo ou algo para significar excluir. Mas eles têm alguns ícones que podemos usar para exibir certas coisas. Lá vamos nós, lixo. Então, às vezes você quer um ícone. Agora, o que você acha que pode ser? Chama-se outra coisa, mas não há problema. Vamos ver como podemos integrar isso em nosso projeto. De volta ao nosso código. Podemos clicar com o botão direito dub, dub, dub root folder. E então podemos adicionar uma biblioteca do lado do cliente. Quando fazemos isso, só precisamos digitar fonte. Também muitos assentos já tipo de preenchimento devia por nós. Então Font, Awesome, seletor de ícones. E então isso não é o 101. Não é um ícone peaker. Deixe-me tentar novamente. Então, estou apenas removendo o local de destino. Deixe-me realmente apenas aconselhar e começar de novo. Então, adicione a biblioteca do lado do cliente. Vou apenas digitar fonte, e lá está ela, hífen de fonte, impressionante. Isso é o que eu quero. Quando clicarmos nisso, você verá dirá àqueles que vamos colocá-lo no local de destino da fonte dub, dub, dub route slash. Incrível. Mas eu gosto de que todas as minhas bibliotecas terceirizadas sejam organizadas no mesmo lugar. Então, em vez disso, vou dizer dub, dub, dub route slash, LIB slash Font. Incrível, é onde eu quero. Mas esses são todos os arquivos que estaremos recebendo. E não vou modificar nada disso. Vou escolher arquivos específicos. Vou apenas seguir em frente e clicar em Instalar. E então ele baixará o necessário para mim e o adicionará à pasta que eu especifico. Aí está, Font Awesome. Também obtivemos um arquivo adicional na forma deste JSON de ponto Lindeman, que é basicamente impressionante dizer essas são as bibliotecas que você usou o gerenciador de biblioteca cliente para instalar. Tudo bem, isso parece bom até agora. Saiba o que preciso fazer é informar todo o layout que ele também deve incluir recursos Font Awesome. Na área da cabeça onde coloquei todas as minhas folhas de estilo logo acima do bootstrap. Fui colocar na folha de estilo da fonte. Também. Onde estou conseguindo essa folha de estilo? Está na pasta lib, pasta Font Awesome, pasta CSS. E então você verá todos os pontos Min meio que colapso na dívida. Então, em vez de usar tudo o que usamos a versão minificada. Já discutimos a diferença entre uma versão e a minificada, certo, então vamos fazer isso. Por isso, incluímos esse arquivo ali mesmo. Com essa inclusão, não posso, vá em frente e veja como posso usar meus ícones. Se eu voltar para o site e olhar para os exemplos, ele me mostrará como é a sintaxe e é muito simples. Tudo o que precisamos é de uma etiqueta I e depois de uma aula com FA. E então, se um traço, seja qual for o ícone que estamos procurando. Nós dissemos que queríamos como uma lixeira para a exclusão. Ativado. Aqui está um exemplo prático. Você tem a etiqueta âncora, e eles não configuraram a tag âncora, você tem esse ícone. Então, seja lá o que for preciso, é aí que você obtém o ícone do host ao lado de casa. livro que dissemos biblioteca, etc. Então você pode ser muito criativo e usar esses ícones como achar melhor. Então aqui está algo prático que vemos aqui que temos o compartimento. Como faço para obter o compartimento? Certo, é lixo. Então, vou pegar isso emprestado. Pule para o nosso código. Em seguida, no botão excluir em vez da palavra excluir, quero apenas o ícone da lixeira. Para edição. Talvez eu só queira e me deixe ver qual é o testemunho. Então eu acho que se não me engano, a inteligência realmente começará a preencher ou opções com base no fato de que incluímos o CSS. E se eu quisesse um livro para edição? Deixe-me ver se há uma edição. Edite. Há um explicitamente para edição. E então, para detalhes, provavelmente podemos usar algo como deixe-me ver se há algo para detalhes. Não, então podemos usar em massa ou um antigo traço de livro Aberto. Lá vamos nós. Às vezes você pode, você teria que sentar e explorar as diferentes ideias de ícones ou as opções. E então você cria o seu próprio com base no que deseja transmitir ao usuário. Então, vou apenas visualizar isso rapidamente. Quando damos uma olhada, vemos que, tudo bem, isso parece uma edição. Este é um livro aberto. Eu aguento. Meu usuário inferiria que esses são os detalhes examinam mais e, em seguida, o ícone da lixeira não está aparecendo. Então, se eu pular de volta, às vezes também com base na versão da fonte Arquivo impressionante que você está usando certos campos certas classes podem não funcionar. Então, como trash dot dash ou pode não funcionar, mas arrastou o lixo meu trabalho. Então deixe-me atualizar essa alteração. E lá vamos nós. Então, estamos fazendo com que nossa lixeira pareça muito melhor. Só estou mostrando que essas são maneiras que você pode usar para apimentar como serão seus monitores se você não quiser confiar apenas nos ícones, porque nem todos podem inferir o que nós deseja que eles façam apenas os ícones e você sempre pode editar o ícone de texto, em seguida, a palavra editar detalhes e excluir. Não se diga que não era muito fácil de usar porque você não sabia quais são os ícones do MIT Boulder menos traz aquele pequeno talento para ele. Então, mesmo para o botão Criar, o link criar, em vez disso, vou copiar que eu marcar. E então isso está criando um novo bot. Então, em cima, vou ver que há um sinal de mais? Há um sinal de mais. Então, se um traço mais atualizar, e vemos que mais períodos de inscrição. É assim que você pode começar a trazer o corruptor para sua exibição do aplicativo usando essas bibliotecas de terceiros. Você pode passar. Desafie você a redesenhar essas páginas, coloque-me em dinheiro para listar um pouco mais robusto nos detalhes. Ela é a editora e o dinheiro para listar aqui e nós vamos precisar já está fazendo o que precisa fazer. Você pode ir em frente e fazer isso. Então, espero que você tenha assumido esse desafio e que você tenha ido em frente e aplicou alguma criatividade às outras páginas. Mas vou mostrar o que fiz. E assim podemos comparar notas na edição. Tudo o que fiz foi adicionar isso de volta à lista. Agora observe que esta lista acima de duas é, ela é batida com uma bobina primária ou ambas. Só tem esse olhar quando eu pairo sobre ele. Isso foi facilmente conseguido usando BTA e linha de traço, traço primário. Para todas as páginas que tinham dinheiro para listar o link na parte inferior, o que eu fiz foi movê-lo para fora do DV estava dentro, colocá-lo na mesma div que o botão Enviar e, em seguida, dar-lhe o btn, btn contorno primário. E tudo o resto permaneceu intacto, mas eu dei o ícone de seta para a esquerda. Mesmo assim, perdeu uma oportunidade aqui com a entrada. Portanto, a entrada não é colocada nesse ícone. Na entrada. O botão salvar é apenas uma entrada não é uma tag de botão, é apenas uma tag de entrada. Se eu quisesse colocar algo para dizer que está salvo e não poderia usar a entrada. O que eu teria que fazer é usar o botão. Vim mostrar o que fiz e percebo que se eu tivesse mais espaço para melhorias para poder encontrar esse botão e dar-lhe o aviso da classe btn, btn dash. E então os botões podem ter um tipo. E este seria um botão Enviar. Tudo bem. Mas então, para o ícone, vamos ver qual ícone eu poderia usar aqui. Se for, existe um Save, ok, se eu salvar e eu acho que isso vai nos dar aquele disquete, esse ícone de aparência. Então, depois de fazer essas alterações, acabo com esse botão de salvamento versus as entradas. Então, estou apenas mostrando como você pode usar tags diferentes para realizar a mesma funcionalidade. Então agora posso remover essa tag de entrada ou essa entrada. Sim e não. Eu só tenho esse salvamento com ícone ou acima para listar. Mais uma vez, essa pequena animação de pairo é realizada apenas por falta de BTN, traço de esboço, e então você tem o mesmo aviso primário, perigo, etc. Eu estava em um processo. Vejo você naquela página que teve o link de dinheiro para listar, tudo o que fiz foi movê-lo para o mesmo grupo de formulários que o botão para o envio. Então essa é a página de atualização no Criar. Fiz a mesma coisa para poder encontrar o mesmo tipo de modificação aqui com o botão Criar. Só vou fazer isso enquanto estamos todos aqui procurando. Tomado esse botão e isso é quase tão simples cópia NPS só a diferença seria que isso seria primário. Ou posso fazer algo mais parecido sucesso porque é um Create, então é sucesso, criar. E então ele também pode ter o ícone de salvar. Eu poderia ver se há outra coisa que eu poderia usar. Não consigo pensar em mais nada neste momento, então vou deixá-lo com o Salvar, a Página Criar. Prenda para a lista dois e clico em Criar novo, eu recebo esse botão verde. Esse dinheiro para listar. Ok, então para minha página de detalhes onde eu tive a edição e voltei para Listar os mesmos princípios. Portanto, este é o mesmo botão vindo da página de índice para Editar. E então esta é a mesma lista de bucket que estamos usando. Não, há uma pequena diferença sintática fala de detalhes em que o rota do traço ASP ID da rota do traço ASP, é claro, é model.py ID do ponto do carro. Então essa é uma diferença entre o que teria sido e o que eu tinha que digitar o que estava na página de índice em vez do que tem que estar nesta página. Caso contrário. Agora estamos começando a ver como podemos adicionar um pouco, mais uma vez, personagem ao nosso aplicativo. Agora que sabemos como integrar bibliotecas de terceiros, a última coisa que vamos fazer é usar ótimos alertas para lidar com a confirmação do Delete em vez do script Java padrão avisa que estamos usando atualmente. Etapa número um, vamos encontrar nossa biblioteca de alertas doces. Clique com o botão direito em www root novamente, adicione a biblioteca do lado do cliente. E vou digitar alertas doces lá está aparecendo. Vou apenas ir em frente e incluir isso. E então eu estou mais uma vez mudando a localização. Eu queria dub, dub, dub ou root slash lib slash sweet alert. Vá em frente e clique em Instalar. Ele atualizará ou gerenciador de biblioteca ou um arquivo lib man. Então, agora sabemos qual biblioteca adicional foi adicionada, mas também recebemos os arquivos ou o arquivo adicionado ao projeto. Saiba que isso está no lugar. Vamos pular para o nosso arquivo de layout e incluir o script. Então, a razão pela qual vamos incluí-lo no layout e não na página ou na, você sabe, exatamente onde isso, se quisermos isso em vários lugares, então você teria que repetir essa inclusão em todos os lugares, o que eu não quero necessariamente. Então, vou incluir a ameaça acima do SIG do site. Vou apenas adicionar essa tag de script onde o SRC é igual. Eu saberei que está na barra de alerta de assentos lib slash. Tudo isso estava abaixo pela inteligência. Bom e limpo. Ou seja, não, podemos acessar essa biblioteca de alerta doce de qualquer lugar em nosso aplicativo. Você pode querer isso em páginas diferentes. Quando você tem arquivos de índice diferentes, você deseja ter o mesmo tipo de funcionalidade de exclusão. Você pode, você pode fazer isso em todos os lugares. Quando volto para minha página de índice, preciso configurar uma seção para scripts. Agora, isso é algo que já vimos porque na nossa página Criar, era a seção deles para scripts. Então, deixe-me dar um plano de fundo sobre o que é esta seção em que posso destacá-la. Ok, queríamos incluir os scripts e assim por diante, mas eu não expliquei bem por que a seção está lá e não incluímos apenas os scripts. Voltando à nossa página antiga do alelo, você notaria que tem seções diferentes, então você tem o tipo de dados de visualização. Já estabelecemos para que serve isso. Também temos o corpo de renderização. Já estabelecemos que é aí que todo o conteúdo dentro de nossas visualizações, ele será renderizado dentro de todo o layout mais tarde, não, você verá que você também tem uma seção que diz a seção de renderização chamada scripts, e ela não é necessária. Isso permite que sempre que quisermos colocar em um script, possamos chamar essa seção, colocando esse script jQuery JavaScript personalizado ou seja lá o que for. E quando a página em um todo renderiza, essa área de script seria renderizada embaixo resto ou em relação à sua posição na peça Leo, é aí que ela será renderizada. Isso é importante porque lembre-se que falo sobre dependências. Jquery, então, o bootstrap tem uma dependência do jQuery. Isso significa que não posso colocar a inclusão de bootstrap ou a referência de escritura acima do jQuery porque o que o Bootstrap precisa fazer não estará disponível porque o jQuery não estava disponível. Assim como com o doce alerta. Não posso chamá-lo de alerta doce se não tiver a biblioteca de alerta doce já disponível no momento em que estou escrevendo meu código. Embora precisemos fazer é ter certeza de que temos todos os nossos scripts que são necessários em toda a linha, tudo em nosso layout e, em seguida, em nossas visualizações sempre que precisarmos de um script ou outro script personalizado referenciado, garantimos que ele o coloque em seção. Voltando a um dos fóruns existentes, o razoavelmente em fazer os scripts de validação é que os scripts de validação são bibliotecas relacionadas ao jQuery. Vamos chamar a funcionalidade jQuery antes que o arquivo jQuery exista. Ele o coloca nesta seção para que, quando toda a página de layout seja renderizada com todos os scripts e o romance e assim por diante. Jquery já está na página. Portanto, quando o formulário é carregado, os scripts de validação jQuery são carregados após o jQuery. No nosso caso, queremos ter certeza de que chamamos nosso doce código de alerta depois as bibliotecas de alerta doce não estiverem em um discurso na seção de ciências que eu fui. Veja, eu queria abrir e fechar a seção de scripts. Então aqui posso começar a escrever meu próprio JavaScript ou jQuery personalizado ou o que eu quiser. Nessa situação, preciso um evento jQuery para assistir quando o formulário está sendo enviado. Tudo bem, então vamos ler isso juntos. Vamos ver se vai funcionar, mas vou guiá-lo pelo que estou fazendo e podemos consertar isso à medida que avançamos. Então cifrão, estamos usando jQuery. Então, mais uma vez, não posso usar o código jQuery até que a biblioteca jQuery já exista e tenha sido invocada. Só vou para o cifrão C. Coloque essa função ponto global função abrir e fechar, ponto-e-vírgula. E então dentro dessa função ou posso começar a escrever meu código personalizado. Então cifrão, e estou procurando um envio de formulário. Então, vou dizer enviar formulário. Então, no envio de um formulário, queremos o telefone Shun. E eu fui dar a vocês dois um parâmetro chamado E. Então E é como um argumento de evento para ver, bem, eu represento o evento que está prestes a acontecer. Então você está tentando enviar o formulário. E tem informações para tudo o que está prestes a acontecer. A primeira coisa que eu queria fazer é dizer a ele E dot prevent default porque a operação padrão de um envio de formulário é enviar. Eu queria pausar isso porque estou prestes a perguntar, tem certeza? Tudo bem. Então o botão lembra que estamos agradando essas coisas desclicadas com os bons alertas. Então você clica no botão, quero pausar o comportamento padrão do envio do formulário. E então eu vou ver o swale, que são meus bons alertas, enquanto é a abreviação de alertas doces. Em vez daquele aparelho aberto. E então eu vou, apenas, em JavaScript, a dica de código não é tão poderosa quanto HTML, CSS e C-sharp. Então o que eu tentei fazer foi quando abro algo que fecha a mesma hora e coloco o ponto e vírgula, então não me esqueço mais tarde. Swale leva alguns argumentos e, se você quiser, você pode procurar a documentação de alerta doce. É sempre bom olhar para o documento é. Então, quando você não tiver certeza, mas por enquanto vou continuar e vamos apenas olhar para ele aqui. Então eu fui ver, tem certeza? Este é o título do prompt? Como? Então temos o texto, que será a mensagem real que a pessoa vai ver, que é o que eu vou ver como o que tínhamos antes. Tem certeza de que deseja excluir esse registro? Vai ver o ícone. Ícone está advertindo, então ele sabe que este é um momento muito sério. Vou dizer que botões são iguais a verdadeiros. Então, bons alertas realmente podem ser como um pop-up para dizer, ok, isso aconteceu. Você clica nele e diz, ok, quando você diz botões, no entanto, por padrão, vai lhe dar o archaea e cancelar tipo de prompt como o que vimos com o onclick. Então também vemos que um modo de perigo é verdadeiro. Observe que cada linha termina com uma vírgula porque isso é como um edifício ou para todo o objeto. Observe que temos o objeto de alerta doce que Bill disse que precisamos continuar a ver. Então. A parte então será como uma nota do delegado para ver, observar a entrada do usuário. As entradas serão armazenadas em qualquer variável que colocarmos. Então confirme. Estou vendo, então, atento a ele para confirmar. Se eu clicar em OK. Confirme que é verdadeiro. Se eu clicar, Cancelar e confirmar o falso dele. Isso é praticamente o que é. E fazemos esse mesmo tipo de expressão lambda nisso. Portanto, esta é uma função delegada em que estamos apenas fazendo uma função em tempo real para ver, em seguida, continuar disfunção contra a variável confirmar. Estou vendo se confirmar. O que queremos fazer se confirmado. Então, se confirmar é basicamente ver se esse valor é verdadeiro, se eles disseram: Ok, então o que queremos fazer? O que eu quero fazer? Se eles disseram que confirmam, então eu queria dizer este ponto enviar. Estou pausando o comportamento padrão, mas depois estou vendo, ok, bem, vá em frente e envie. Se eles disserem que sim, vamos declarar isso para dar uma volta. Tudo bem, então eu fui em frente e adicionei alguns registros adicionais para que possamos testar. Então eu vou apenas dizer delete e oh, snap, eu não removi o prompt original, mas deixe-me clicar em OK e continuar. E então você vê aqui está o alerta de nossas suítes. Olha, oh, bom. Isso parece. Tem certeza que aquele pequeno ícone agradável? Só deixe você saber que ei, perigo à frente. Tem certeza de que deseja excluir esse registro? Se eu clicar em OK. Ok, ainda é uma inspiração, então temos que colocá-lo em um pouco mais de diversão para que eu saiba exatamente o que está acontecendo. O que está acontecendo é que, porque cada um desses botões de exclusão é um formulário. Quando você clica em Excluir, ele está vendo todos os formulários, a página. E é por isso que esse prompt está chegando várias vezes. Portanto, não há problema, estamos explorando o que precisa ser implementado para que isso funcione corretamente. Então, primeiro, o vizinho move isso onclick. Agora que temos os bons alertas, não precisamos desse prompt de padrões do navegador. Sabemos que temos uma interface mais limpa para usar um método alternativo para imprimir formulários por palestra que vejo imprimir formulário para cada botão seria difícil de uma forma. E então vamos assistir no botão, por favor. Só estou mostrando todas as suas opções. Então, vimos que isso funciona no prompt padrão, e se você estiver confortável com isso, não há problema. Mas, às vezes, quando você começa a trabalhar em outras bibliotecas, começa a ter que fazer compromissos ao longo do caminho com todo o seu design. Tudo bem. Vamos trabalhar para combinar nosso conhecimento de como os formulários funcionam em espera, a publicação funciona em todos os dados que precisam estar sentados antes que o envio possa ocorrer. O que eu quero fazer é criar uma instância do farm em vez de ter três registros e três fóruns diferentes, eu quero ter sim, mini botões de exclusão como muitos botões Excluir dizem, existem registros, mas vamos usar um formulário para executar o comando delete a. Vou tomar este formulário e vou colocá-lo debaixo da mesa sozinho. Então, estou apenas cortando as tags do formulário e colocando-as sozinhas. Fui remover isso é b ID do carro raiz. E, em vez disso, vou dar uma entrada, assim como o que vimos na origem ou na exclusão. Na forma de liderança de originalidade. Tínhamos um formulário na parte inferior do campo. Nós tínhamos isso escondido, então vou copiar isso para que tenhamos um ponto de referência. O tipo de entrada está oculto, é antes de não termos nenhuma propriedade ou qualquer coisa no modelo chamado carro. Não consigo ver um ID automático de cartão para o ASP, em vez disso, vou dar um nome a ele. O nome aqui é ID do carro. Agora, qual é a relevância do nome? Quando temos um formulário? Algum formulário? Lembre-se de que quando fizemos a página HTML básica, conversamos dobramos o nome e, por causa do nome, você viu o material passando no URL. É o mesmo princípio, exceto o ASP dash four cuida do nome e do ID para o. Então você notará que nossas tags de entrada aqui, nós não precisávamos ver joelho seria suficiente para vê-lo ID tudo o que temos que ver como entradas e definir a classe e a ferramenta ASP dash for bone did, o nome da propriedade para o nome do modelo seria o substituto para ASP dash four. Então, realmente e verdadeiramente, o que é impresso é id igual ao nome do ponto do carro, nome é igual ao nome do ponto do carro. Podemos fornecer manualmente nossa própria tag, seu próprio nome, que corresponderia ao mesmo ID de rota que tínhamos ou o mesmo parâmetro de rota que o método post está realmente esperando para ver o ID do carro aqui. Ideias de carros e eu também vou dar-lhe o id, o ID do carro para que possamos acessá-lo através do jQuery. Então essa é a nossa forma. Ele nem precisa de um botão de envio porque temos o botão aqui. No entanto, precisamos saber o ID do botão que está sendo clicado. Então, vou adicionar outro atributo de dados. Mais uma vez, estamos apenas explorando todos os compromissos e todas as coisas legais que podemos colocar. Existe um atributo que podemos colocar no botão chamado ID do traço de dados. E então podemos fornecer o mesmo valor de item, ponto ID. Saiba que os links têm seus IDs e cada botão que vai dobrar como um botão de envio terá seu próprio ID. Não, precisamos observar um clique de botão em vez de um clique de formulário. Para isso, posso dizer facilmente, dar a isso uma classe personalizada, excluir btn. Portanto, cada botão de exclusão será identificado como delete btn dentro do meu jQuery. Em vez de assistir por um envio completo do formulário, posso saber dizer Dot Delete btn. Portanto, observe um evento de clique em qualquer elemento que tenha a classe delete btn. Então você vê como tudo isso vai se juntar. Sempre que isso for clicado, não há padrão. Não preciso evitar padrões, então vou remover isso. Mostrando mais uma vez o contexto. Por que escrevemos o código nas diferentes circunstâncias? Portanto, não há formulário para ele enviar. Não preciso evitar o comportamento padrão de um clique de exclusão btn. No entanto, o que eu preciso fazer é rápido, o que ainda vai acontecer. Então, se eles confirmarem, o que vou fazer é e eu tenho que dar um documento de identificação para que eu possa identificá-lo. Assim, sempre que precisarmos identificar um elemento em JavaScript ou jQuery, podemos usar a classe ou podemos usar o ID. Portanto, este é o formulário de exclusão. Vou ver um que o valor que a entrada deve obter deve vir do ID de dados do botão que foi clicado. Então deixe-me fazer tudo isso passo a passo. Em primeiro lugar, vamos pegar os botões. Então posso dizer que var btn é igual ao cifrão. Isso. Este sou eu dizendo que esse é o elemento. Este é um objeto que representa todos os elementos acionados pelo evento. Esse é o passo número um, ferramenta. Var id é igual a e, em seguida, posso obter o ID dos dados do ponto btn. A razão pela qual eu usei IDs de traço de dados que realmente consultam você pode facilmente se vincular a esse elemento de dados e obter essa chave. Obtenha o valor com base na chave. Estou vendo dados btn dot e, em seguida, obtenho o valor que está sendo armazenado com o ID da chave. E agora temos o ID ou ID do carro que corresponde a um botão que foi clicado. Saiba que depois de ter tudo isso, fui definir o valor dos elementos ocultos. Então, aspas de cifrão, hashtag e seu ponto de identificação do carro. E então eu vou dar-lhe a identificação. Saiba que o valor desse oculto será definido como qualquer ID no botão de exclusão. Depois de fazer tudo isso, agora posso ver a hashtag do cifrão, excluir o formulário. Você usa a hashtag para ID, assim como com css, hashtag de classe cheia de ponto ou libra ou o número dizendo para IDs. Então, vou para o formulário de exclusão por ID até que ele vá em frente e envie. Vá em frente e execute seu comportamento padrão depois de configurar seus dados para você. Então, vamos declarar este, esta versão dele para dar uma volta. Podemos clicar, Excluir, recebemos nosso prompt, clicamos em OK e olhamos para isso. Está funcionando, certo? Então, tudo o que fizemos foi em segundo plano. Mais uma vez, criamos uma tag de formulário. Portanto, mesmo se você inspecionar o elemento, você percebe isso na parte inferior da tabela. Então temos corpo e deixe-me entrar na div, isso é um contêiner. E então temos a tabela e, em seguida, temos nossa forma C. Não é diferenciando na página. Não parece que estávamos conspícuos quando foi anexado a todos os botões, mas não, é apenas um formulário na página, então não há confusão qual formulário está sendo clicado, qual botão que para mim está tentando ser enviado. Não há mais confusão. Há apenas um formulário. E então, se você olhar para cada botão, verá que o ID do traço de dados tem o ID correspondente a todos os outros links. Então este é o ID cinco. Quando é clicado, pegamos o botão que foi clicado. Recebemos o id. Em seguida, definimos isso para o elemento oculto. Em seguida, vamos em frente e enviamos. E então o formulário sabe que ele deve ir para o manipulador Delete com um método de postagens e está passando por cima desse valor oculto chamado ID do carro. Uma vez que tudo isso esteja no lugar, você pressionará a exclusão na postagem com o ID da rota esperado. E o que sabemos é suposto fazer tudo isso, todos esses aprimoramentos sempre que estamos colocando em bibliotecas de terceiros e queremos usá-las, você sabe, temos que levar esses tipos de design decisões à medida que avançamos porque você pode pensar que funcionará ou pode funcionar em uma situação específica. Mas quando você adiciona outros códigos e bibliotecas, talvez seja necessário adicionar mais diversão. Basta modificar seu refatoração de código à medida que você avança. Então é isso para essa atividade. Vejo você na próxima lição. 15. Adicionando alterações ao GitHub: Tudo bem pessoal, bem-vindos de volta. Esta lição será curta. Tudo o que vamos fazer neste aqui é verificar as mudanças de ordem. Então, começamos a usar o GitHub algum tempo. E o que fizemos foi verificar nossa inicial, quando chegamos a um certo marco, verificamos todas as nossas mudanças. Queríamos fazer isso de novo. Ticks vermelhos indicam arquivos pendentes, alterações ou edições. As vantagens verdes representam as que foram alteradas e os cadeados azuis representam basicamente aqueles que não mudaram. Tudo o que temos que fazer é obter alterações. Mais uma vez, se você não vir onde ele está na minha tela, você sempre pode ir para Exibir e clicar em Obter alterações. Em seguida, esse pacote mostrará todos os arquivos que foram adicionados sozinho para bibliotecas de terceiros que adicionamos estão todos lá. E nosso arquivo de migração e/ou arquivos de entidade. Então, vou dar uma mensagem rápida. Embora a mensagem não precise ser um ensaio, geralmente gosto de ser o mais descritivo possível na minha mensagem para que qualquer pessoa que lesse obtenha a essência do que estou fazendo nesta versão, confirme. Depois de fazer isso, posso apenas dizer cometer tudo e afundar. Depois que o gamete tiver sido concluído com sucesso, você verá essa mensagem. E então, quando voltarmos ao Solution Explorer, tudo teria cadeados azuis. Quando voltarmos, começaremos a estender nosso aplicativo um pouco mais. 16. Gerencie as mudanças de banco de dados usando Entity Framework: Nesta lição, vamos configurar nossas outras entidades para este aplicativo. Então, agora o que temos é carro, o que é essencial. Tanto tudo o que temos para o carro seria o ano e o nome do carro. Saiba se você está perto de carros por tempo suficiente, você sabe que não é apenas um cartão de nome tem uma combinação de um manso e um modelo, certo? Então, o manso seria a marca do carro como Nissan ou Lamborghini. E o modelo seria modelado dessa marca, estamos lidando com? O que queremos fazer é fazer algumas alterações no banco de dados aqui. E o que temos que sacrificar é o nome e dividi-lo em marca e modelo. Neste ponto, você queria fazer algumas considerações de design porque é fácil de ver. Ok, eu queria mudar isso para mim e vamos apenas duplicar isso e conhecer esse modelo. E será fácil o suficiente ter apenas uma corda. Mas então considere isso, quando alguém está entrando em um carro em seu sistema, você necessariamente quer que eles estejam digitando o leite e digitando o modelo? E se você tiver dois do mesmo tipo de veículos Meca e modelo? O que você quer que eles estejam digitando a palavra Suzuki toda vez? Porque então talvez o voto de licença ou o erro, um dos SAT o marca ou vice-versa. O ponto é que Nesse ponto você quer limitar a possibilidade de erro humano ao tirar dados através de nossa interface de usuário. Embora essa não seja uma decisão de interface do usuário, o que fazemos aqui influenciará forma como projetamos ou a interface do usuário. modo geral, em um formulário quando há dados que precisam ser repetidos, você usaria uma lista suspensa, o que significa que você teria uma lista suspensa com todas as opções potenciais. Você não deixaria isso para o usuário comum poder apenas dizer, oh, aqui está o valor e apenas digitá-lo manualmente. Para mim posso modelar, sinto mais confortável ou pelo menos para o MEK, que seriam as marcas porque isso é mais ácido do que o modelo porque diferentes marcas de diferentes modelos e combinações 0 para que possam digitar o modelo, mas para o microfone, pessoalmente, alguns mais confortáveis, dando-lhes uma lista das marcas potenciais. Se não estiver na lista, podemos adicioná-lo à lista, mas é melhor que eles tenham essa lista. E eles podem digitar o modelo em relação ao que escolheram na lista. Isso nos forçará a fazer algumas alterações importantes no banco de dados. Porque se eu precisar de uma lista de microfone, não posso ver cordas se encontrar. Agora, o que vamos começar a falar sobre o que chamamos de chaves estrangeiras e chaves primárias. Então, já sabemos que ambos são chave primária. Tudo bem, mas agora precisamos de outra mesa e precisamos uma chave estrangeira para que a mesa presente no carro. Então, vamos criar essa nova tabela. Então, migrações, desculpe, nada de migrações no projeto de dados em vez disso, fui adicionar uma nova classe, e vou chamar essa classe de microfone. Lembre-se de que estes óculos são apenas modelos para o que uma mesa com uma cauda será agendada nas propriedades para o que queríamos armazenar nossa voltagem. Então, o que gostaríamos de armazenar os dois mansos? Em primeiro lugar, sempre temos nosso int id público. Então teríamos o nome prop, top tub, nomes de string. Nome aqui significa apenas nome como no valor da string que vai para a média na tabela chamada mic. Faça o número um poderia ser Nissan, fazer o número dois poderia ser Toyota, etc Então é realmente o que o nome aqui representa. Se você quisesse ir e dizer Faça-me pessoalmente, eu não sigo essa convenção de nomenclatura. Algumas pessoas fazem. Não sei porque já estou na tabela chamada microfone, então não preciso me ver o nome obviamente, nome seria o nome de qualquer valor que estou colocando naquela tabela, certo? Agora temos a mesa principal, está tudo bem. Tenho que informar os contextos do banco que há uma nova tabela em tom. Eu só fui para essa linha Control D apenas para duplicar as partes duras. Mas fui chamar essa mistura. Eu também poderia chamar esse carro, pois não importa o que eu chamo de mesa. Mas eu realmente gosto de ser consistente com o nome da entidade e o nome da tabela, pois você não o vê com carro e carros. Mas, mais uma vez, você pode não necessariamente gostar minha convenção de nomenclatura e você quer, embora um, então, não há problema se você quisesse nomear este microfone de carro e mix de carros ou você tem a entidade chamada Mika, isso chamado carro misto e tudo bem. Gosto de mantê-los consistentes porque isso leva a menos erros na linha. Agora temos uma nova tabela. O que eu preciso fazer é deixar carnal que ele deve ser um quatro ou deve ter uma chave estrangeira para fazer. Entity Framework torna as chaves estrangeiras muito fáceis para nós. O que vou fazer é tudo bem, deixarei esta mensagem de validação para o modelo. Tudo bem. Mas por baixo de tudo isso, vou colocar outra propriedade, int make ID. Eu estava afirmando que o Entity Framework, torna mais fácil para nós introduzir chaves estrangeiras. Porque quando dizemos que queremos um nome e um ID de tabela, ele irá inferir automaticamente que queremos uma chave estrangeira. Então esse é o primeiro passo, pelo menos. Ele faz dizendo int mic ID, saberá que, ok, eu tenho uma entidade chamada Mek, e ela tem um ID, então a combinação significa que deve haver uma chave estrangeira. Outra parte disso, porém, é adicionar nossas propriedades de navegação. Então, nós diríamos Faça-me esta propriedade de navegação basicamente diz que se eu pegar um carro e eu quisesse saber o microfone fora do carro, fazer com que os nomes sejam realmente armazenados na tabela make. Então tudo o que eu realmente tenho que sair é aquele carro ABA e ele fez ID1. Não sei qual é o nome dele, só da mesa do carro. Tudo bem. Então, se você estiver acostumado com bancos de dados, você saberia o que quero dizer quando você olha na mesa do carro ou quando elas são chaves estrangeiras, tudo o que você está vendo são os valores de ID podem causar ID1 e, em seguida, desligar o microfone ID1. Ele já entra no código make do C. Não sabemos os detalhes. Portanto, adicionando essa propriedade e, de um modo geral, nós a adicionamos como virtual para que ela possa ser substituída, se necessário. Então você pode simplesmente ir em frente e fazer isso. Mas quando adicionamos essa propriedade de navegação, quando recupero um carro, posso dizer, por favor, inclua todos os detalhes dessa tabela adicional ou da tabela relacionada. Então eu posso trazer a propriedade do microfone com todos os detalhes. Quaisquer que sejam os detalhes que entraram em mim, talvez eu não pudesse nem colocar algo para ver qual país o microfone é. Digamos que se eu quisesse ser criativo, eu diria que essa marca é deste país. E então eu encontraria o mesmo tipo de problema de qualidade de dados aqui se eu deixasse o país por vontade própria, porque algo dos Estados Unidos da América poderia ser escrito como EUA por uma bursa, USC como outra pessoa, banda dos Estados Unidos sobre a pessoa, etc. Então é por isso que sempre que você tiver algo que você quer controlar, você vai querer colocá-lo em sua própria mesa e depois fazer uma chave estrangeira referência a ele. não vou ficar muito complicado. Vejamos ter duas tabelas e estamos introduzindo esse conceito de chave estrangeira. Neste ponto, o carro sabe que ele deve ter uma chave estrangeira para a tabela onde a navegação ou afirmou a validação dos modelos. Portanto, é necessário. Também vou exigir que o ID esteja dentro do ano. Podemos exigir um ano se quisermos. Também poderíamos sentar mais validação nessas duas seringas. Mínimo, mínimo para o ano. Digamos que não queremos nada menos que 1990 nos sistemas. Qualquer coisa que seja 191990 ou antes de 1990 não é aplicável. E, no máximo, vamos colocá-lo em 2021. Estamos no ano de 2021. Então, só estou mostrando o alcance. validação realmente funciona. Deixe-me espaço o mosaico pode ver tudo em seu próprio espaço. Lembre-se de que todas essas anotações, todas essas coisas precisam falsificar o banco de dados para afetar a etapa número um do banco de dados, ou depois de fazer essas alterações, a próxima etapa seria adicionar um migração. Ainda tenho meus comandos de migração da última migração ou do último conjunto de atividades relacionadas ao banco de dados. Nós nos lembramos de uma cidade, um projeto padrão para o projeto de dados. E ele pode pressionar para cima para obter os comandos anteriores. Estou apenas pressionando para obter a migração de adição. Vou apenas mudar um erro. Então eu fiz a tabela de mixagem, pressione Enter e meu campo de compilação. Por que eu fiz por que minha compilação falhou? Bem, isso é porque eu excluí o nome e o nome estavam sendo usados muito em outras partes do meu aplicativo. Se você estiver codificando durante isso, essa é uma daquelas conseqüências da refatoração no aplicativo Ricci e algo que você pode ter um efeito de ondulação em todo o resto do aplicativo. Então, vamos manter isso simples. Em primeiro lugar, instituímos o formulário de exclusão e assim por diante. Então, eu realmente não preciso do Excluir View e desse HTML CSS de ponto de exclusão. Então, o que vou fazer é excluir isso , excluir, excluir combustível. Eu não preciso desse. Ótimo para criar. O que eu teria que fazer é apenas pelo menos comentar temporariamente a zona. Então, em qualquer lugar em que a propriedade name estivesse sendo acessada em qualquer uma de suas visualizações, você pode simplesmente ir em frente e encontrá-la. Estava sendo usado aqui, entrava em sacolas, chegando em totais aqui. Portanto, não, a menos que ele apareça na lista. A atualização também estava sendo usada aqui no formulário que você pode verificar novamente sua lista de erros apenas para ver onde você pode ter perdido. E eu vou fazer Control Shift e B para fazer uma compilação apenas para recompilar e ver se existe um erro e não há nenhum. Então, vamos experimentá-lo com o console do Package Manager novamente. Na audibilidade bem-sucedida e temos nossa migração. O que está em nossa migração vai renomear a coluna de nome para modelo. Tudo bem, então só porque mudamos a propriedade vai vê-la à medida que eu renomeio em vez de excluir. Tudo bem, para nossos assentos Meek ID adicionando a coluna, é um int. Não é disponível e o valor padrão é 0. Mesmo que teríamos sentado três polegadas para estar em 19192021. Isso significa que, mesmo assim, ele nunca deve fazer esse disparo onde o banco de dados teria que definir o valor padrão como 0 porque o cliente disse que sempre faremos a validação. Vimos que isso já aconteceu. Em seguida, ele criará uma tabela chamada mix com duas novas colunas, dando-lhe a chave primária. E então olhe para essa parte. Está criando um índice. Um índice em um banco de dados é uma pesquisa de alta velocidade. Então, sempre que estamos ansiosos para carros que usam o make ideias são fundamentais ou estamos usando isso para dizer, me dê todos os carros com esse ID exclusivo. Ao criar esse índice nessa coluna, ele o fará muito rapidamente. Também estamos adicionando a restrição de chave estrangeira. Ele diz adicionar uma chave estrangeira nos carros de mesa, o ID do microfone da coluna onde a tabela principal é misturada e o princípio da ID das colunas. Então, em outras palavras, uma chave estrangeira significa que tornar o ID no carro estável nunca pode obter um valor que não esteja disponível na tabela de mixagem. Não posso adicionar um carro que não seja do tipo ou não na mesa mista. Se estiver na tabela mista, descobri que você tem três ícones. Adicione um carro com ID TIN. Eu meio que coloco um carro que não está presente. Então isso é um tipo de proteção. Então, você chama isso de integridade de dados quando está falando sobre design de banco um e para manter essa integridade por meio do design do aplicativo. Portanto, entre todas essas e as validações, essa integridade dos dados será mantida. Mais uma vez, o método da cúpula é basicamente o teardown. Então, se tivermos que desfazer a migração, isso é o que ela fará para revogar as mudanças que teriam feito. E depois de fazer tudo isso, vamos voltar e atualizar o banco de dados. Portanto, esse banco de dados de bits em execução e o console do Gerenciador de Pacotes, nenhum lugar ver algumas setas, não são problemas. Então, vamos ler essas flechas. Ele está vendo que ele falhou ao executar o comando Alter, onde está adicionando a referência à tabela de mixagem de chaves estrangeiras. Portanto, está nessa mistura tem um ID de coluna. E em poucas palavras, sem, o problema é que essas flechas tendem a parecer muito complicadas. A redação, se você não estiver acostumado, pode não ser tão fácil de usar. Mas a realidade é que, se você apenas prestar atenção, você escolherá certas palavras-chave. Bem aqui. Está dizendo que a altitude foi o conflito de Stephen sobre as restrições de chave estrangeira na coluna que somos treinados para adicionar, que é misturada com Meek ID. Então, qual é o problema? O problema, mesmo que as áreas que realmente estão vendo isso, ei, esse é o problema. Se formos ao banco de dados e olharmos na mesa de carros, lembre-se de que tínhamos entrado em alguns carros. Ele tinha entrado carros em nosso banco de dados ou eles não têm a idéia do microfone do que eles estão lá. E o ID do microfone não pode ser 0 porque, mais uma vez, o ID do microfone não pode ser um valor que não existe na tabela de microfone. Esse é um desses perigos quando você está mudando bancos de dados estão fazendo migrações. Vou ter que fazer uma modificação. E há duas maneiras de fazer uma modificação sempre que você estiver introduzindo uma chave estrangeira em uma tabela que já possui dados, um dos perigos é que você vai acabar com esse erro . Este é um daqueles bons Aras, eu chamo isso de um bom erro para aprender. Esse conflito ocorre porque estou introduzindo uma chave estrangeira em uma tabela que já tem regras que não precisavam da chave estrangeira. No que diz respeito, esses papéis existentes, papéis estão violando as restrições que a chave estrangeira está sendo informada de que deveria ter. A coluna de chave estrangeira está sendo informada de que não pode ser nula e seu valor padrão é 001041. Desculpe, ele é um valor inválido para nossa chave estrangeira. Por quê? Porque você não pode ter. Uma chave primária corresponde ao valor da chave primária de 0. Então, o Meek ID nunca pode estar na tabela make. Eles nunca podem ser um valor de 0. Sempre tem que ser um ou superior. Nunca pode ser 0 tentando inserir o IT pro, reativamente no banco de dados ou após o fato de que já existem linhas, ele está tentando dar-lhes o valor padrão é 0, que está causando que conflito sobre o qual está falando. Tudo bem, eu posso realmente modificar o arquivo de migração aqui. Ou posso remover a migração, alterar o modelo e corrigir o erro. Então, vou mostrar a vocês quais modificações eu faria na migração. E isso seria mudar o conhecedor de falso para verdadeiro. Então, em outras palavras, isso pode entrar, a chave estrangeira, pode entrar, mas não precisa necessariamente ter um modelo. Os carros existentes simplesmente não saberão qual modelo eles são. Praticamente não haveria. É por isso que ninguém é verdade. Então, também não preciso me sentar no valor padrão porque ele pode ser conhecido. Então, se não houver valor, então não é. Se houver um valor, então há um volume. Essa é a opção a. Opção B, seria a opção E. Deixe-me antes de continuar. Opção a, permitiria que eu saiba realmente tentar o banco de dados de atualização novamente. E então tentaria uma operação de migração nova e editada, que seria adicionar essa coluna como anulável. E esses removem qualquer potencial de conflitos. Então essa é uma das opções quando se trata ter a migração gerada. Isso não atende necessariamente aos requisitos, se você precisa modificar isso, modificar a migração e tentar novamente. Não, outra opção seria, e eu provavelmente escolheria essa opção porque é uma opção mais segura no meu livro. Primeiro, remova a migração. Então, veja, tudo bem, esqueça que eu disse para você fazer essa migração. Para fazer isso, é literalmente remover a migração de hífen. Sempre vi esse comando mais cedo quando fizemos a migração de anúncios e ele disse para desfazer essa ação migração de movimentação do usuário. Temos uma migração de qualidade. Queremos desfazer isso. Então eu só vejo remover a migração. Na verdade, ele excluirá esse arquivo da pasta de migração. Depois fui atualizar meu modelo para depois ter regras que gerarão uma migração amarga. A regra que fui modificar é que fui tornar o ID do microfone anulável. Outra coisa que está influenciando a decisão do Entity Framework de tornar isso um int que não é anulável é nossa notação para dizer que é necessário. Isso será uma abordagem perfeita para como teremos que separar a validação no nível do banco da validação em um nível do lado do cliente porque neste momento estou vendo necessário para o ano e a área de estar e Joe K, isso realmente não afetará esse banco de dados. Mas então vimos onde o simplificado está sendo refletido no banco de dados e o fato que o modelo não é anulável está sendo refletido em um banco de dados. Então, quando eu anulei isso na interface do usuário, vou precisar definitivamente, não vou carregá-los para prosseguir com a voltagem. No entanto, no banco de dados deles dizendo que é opcional, eles estão se separando em dois mundos diferentes. As necessidades da interface do usuário são diferentes das necessidades do banco de dados. Apenas tenha isso em mente. Mas vamos terminar esse conceito em resumo. Depois de remover a anotação necessária e fazer o int e int, posso saber ir em frente e executar novamente minha migração. E quando eu faço isso, minha migração não está vendo para a coluna, ela é int, mas é anulável. Nenhum valor padrão. Isso não é problema. Tudo o resto está bem. Então, quando avançamos e atualizamos nosso centro de banco de dados , ele é bem-sucedido. Você verá mais uma vez, a análise tem que entrar no que pode estar causando o problema tanto quanto o erro realmente não sugeriu. Mas essa é uma daquelas áreas que, de um modo geral, se você ver esse erro, procura quais podem ser os riscos potenciais me arruinaram introduzindo uma chave estrangeira nisso apontar no design do meu banco de dados, porque esta será uma atividade contínua. À medida que você vê algo novo, você terá que editá-lo. Bem, é fácil de gerar. Uma migração estará no banco de dados, mas torna-se mais difícil devido às regras e às restrições que estão sendo colocadas em torno das diferentes colunas versus os dados existentes, o que pode não soube sobre as regras no momento em que estava sendo inserida. introduzindo esta nova tabela que ajuda a pular e você verá que temos a mesa e o estábulo do carro. Se eu estender isso, você verá que nas chaves dos carros, eu tenho a chave estrangeira que acabou de ser introduzida. Se você olhar para o nome aqui versus o nome na minha linha 39, você verá que é o mesmo nome. Se carros sublinhados gays no mix de pontuação na pontuação Meek ID, esse é o nome da chave estrangeira. Se procurarmos o mix, veremos também que ele tem sua chave primária. Portanto, nenhuma ou colunas para carros seria a ideia de que é um modelo principal do ano inteiro. E, em seguida, faça com que Idea perceba item chave que não posso ao lado dele, o que significa que é uma chave estrangeira, chaves primárias. Chaves estrangeiras são assim. Adicionamos com sucesso outra tabela ao nosso banco de dados. Também tivemos que comprometer e remover algumas das coisas da nossa interface de usuário, a facilitada. Quando voltarmos, teremos que atualizar nossa interface de usuário para o novo campo normal. Campos porque não nomeamos mais conhecemos nosso modelo e temos microfone. E também saímos para ver como vamos separar as regras sobre o que os usuários podem fazer na interface do usuário em comparação as regras que o banco de dados está impondo. 17. Melhoria do formulário - Parte 1: Tudo bem pessoal, estamos seguindo em frente muito bem. Quando estávamos no ano passado, montamos a nova fita antes que a mistura também criará a associação de chaves estrangeiras para microfones em carros. Conheça as regras que seguimos poderiam ter sido estendidas para qualquer número de chaves estrangeiras porque algumas pessoas teriam estendido kit de antídoto. Eles não modelam aço porque não podem arriscar as pessoas escreverem não podem arriscar as pessoas escreverem a palavra Sony para o mesmo Nissan, nissan Sony. E uma pessoa coloca em uma, a outra pessoa coloca em duas extremidades. Mais tarde, veremos esse tipo de quadro de cenários agora que queríamos nos concentrar em atualizar nossa interface de usuário com nossa introdução de nossos novos campos nas formas de marcas e modelos ou Meek ID e modelo. A primeira coisa ou bem, não quero dizer a primeira coisa como se precisássemos necessariamente seguir essa ordem. Mas uma coisa que definitivamente vamos precisar seria as páginas da multidão para a média. Como podemos escrever não, carros dependem do Meek ID. Não posso muito bem colocar uma lista suspensa para o microfone em vez dos carros, a menos que haja mistura. Vou ter que criar algumas páginas para que possamos gerenciar o mix. Vou apenas seguir em frente e clicar em adicionar uma nova pasta. E vou chamar essa mistura. Então, por último do que realmente fomos um por um criando todas as páginas de código. Fizemos a página Criar, então fizemos a página de edição, etc. Para mim, fui fazer uma operação mais grossista. Então, vamos clicar com o botão direito do mouse nesta pasta, clicar em Adicionar série de páginas e, em seguida, usaremos a opção Razor pages usando Entity Framework e crude. Tudo bem, clique em Adicionar. Então ele vai dizer, ok, qual é a classe modal desta vez estamos lidando com microfone, que é o contexto de dados e clique em Adicionar. Agora, se você der uma olhada no que está na pasta, verá que todas as páginas que vimos meticulosamente adicionadas uma uma quando estamos lidando com carros, Todas são geradas para nós. Temos o lance de índice, que é a lista de mix. Temos a página de edição, que é o formulário para editar o mix, temos os detalhes. Todos eles foram gerados em uma varredura. Eu levei você através deles um por um para que você pudesse olhar para o código. Agora que temos uma melhor compreensão do que cada página está fazendo sob o código gerado está fazendo. Poderíamos apenas fazer as operações de atacado. Você pode fazer isso para suas aulas, mas não vá muito à frente e comece a fazer isso para todo o resto ainda, porque há mais coisas que precisamos considerar no design, mas não, ele está bom. Agora temos a capacidade de criar ou inserir dados na tabela mista. E depois de inserirmos dados nessa tabela de mixagem e construímos essa lista no banco de dados. Precisamos ser capazes de apresentá-los aos usuários quando eles estão entrando em carros. Uma coisa que vou fazer é adicionar este item de menu ou um item desconhecido ao tom do layout para que possamos navegar até ele. E então eu vou apenas Controlar F5 e apenas fazer um teste rápido apenas para garantir que o código esteja funcionando para mim. Ao saltar para o link, podemos clicar em Criar novo. E então o primeiro é a Toyota criar. E vemos criado. Então, não escrevemos nenhum código, só sei. Tudo o que fizemos foi seguir um simples passo de andaimes ou todas as páginas. E agora temos todas essas edições. Temos os detalhes. Como você vê, ele voltou com os botões e links padrão e assim por diante. Então eu sempre pensei em uniformidade de bolhas. Queríamos ter certeza de que nossos botões se parecessem assim para todos os nossos aplicativos para que você possa ir em frente e estilizá-los. Exercite músculos de bootstrap flexíveis não. E comece a ver tudo bem. Quero que tudo pareça da mesma forma. Não há problema. Por enquanto, porém. Só queremos nos concentrar na funcionalidade. Então, estamos recebendo, deixe-me colocar mais um. Neste ponto, talvez um administrador seja o único a gerenciar essa lista mista. Tudo bem. Agora, quando olhamos para o create for car, lembre-se de que tínhamos que entrar até o campo que ficará no nome. Mas não, precisamos ter um campo para modelo e precisamos ter um campo que seja uma lista suspensa com a lista de mix. O que precisamos fazer é pular para nossa página de criação de carros e eu vou descomentar esta seção para o nome do ponto do carro. Nenhum disco pode ser esculpido em modelos, modelo de ponto de carro. Essa é a nossa nova entrada para essa seção. Mas também vou apresentar, estou apenas copiando o grupo de formulários. Mais uma vez, uniformidade. Isso é o que foi gerado em toda vez que queremos controles. Só vou mantê-lo nesse tipo de formato. Mesmo se eu estiver digitando manualmente, às vezes você pode ter que fazer isso. É bom seguir essa convenção de codificação porque é para essa camada que você quer. Para o modelo Kardon ou para o próximo, eu diria Car dot mq ID. Agora, para o ID do microfone, queremos uma lista suspensa. Não queremos um pega a caixa. Portanto, lembre-se de que informa que temos a tag chamada select. Esta tag nos permite colocar opções. A primeira opção que vou dizer é selecionar microfone. Tudo bem, então esse é o primeiro prompt. Mas, obviamente, não vou sentar e escrever em todas as outras opções, Nissan e Toyota. Porque se eu fizer isso manualmente, isso nega o fato de que queremos ter essa lista dinâmica da tabela mista no select, vou dizer ASP traço quatro. Portanto, esses são ajudantes de tags onde posso ver, quero que esta lista suspensa seja para identificação de marca de carro. Então, a próxima coisa seria dizer, onde estou tirando os itens? Meus itens precisam vir de algumas listas. Então, vou me ver misturar. Só estou colocando isso lá fora. Esse não é o nome da lista ainda, que ainda não existe. Por isso, a linha vermelha. No código por trás, preciso enviar ou preparar pelo menos chamado mix, que compreenderá a lista de mim x do banco de dados. Então, passando por cima, vou querer criar nossos direitos de propriedade no ponto um. Ou, na verdade, prefiro ter minhas propriedades acima dos meus métodos. Só estou fazendo esse refatoração rápido. Isso porque eu prefiro tê-lo dessa forma. Se você não tem problema, então nenhum problema não precisa necessariamente seguir, mas eu gosto de vê-los todos em um só lugar. Então, sim, sabemos que temos a propriedade do carro. Mas depois fui dizer lista de seleção pública. Então, esse é um novo tipo de dados que estamos vendo. E estou chamando isso de uma mistura. Fazemos isso Gita e sentamos. Depois que eu tiver a lista de fendas em get, lembre-se de se prepara. Em vez disso, ele está lá para que possamos preparar todos os dados necessários para a página. Portanto, antes disso, não havia dados necessários para a página. Só tínhamos que voltar ao formulário vazio. Não, eu preciso realmente obter essas coisas do banco de dados, da tabela mista, preenchê-lo ou colocá-lo nessa propriedade mista. E eu acho que com base no nome aqui, oh, eu preciso dizer mixagem modelada. Para ter criado mix, posso dizer que modelado faz desculpas. Essa é uma mistura model.fit. E aqui estão nossos microfones chamados apropriadamente. Preciso preencher a mistura com os dados provenientes da tabela mista. Caso contrário, não estaríamos mais perto de realizar qualquer coisa que somos. Não. Assim, posso ver que a mixagem é igual a, não quero inicializar uma nova lista de seleção para selecionar que me permita passar uma coleção de itens. E então, assim como com a tag select ou a lista suspensa, tenho algo que é exibido e algo que está sendo preso ou armazenado. Em outras palavras, quando estamos exibindo o microfone, o usuário deve estar vendo Toyota, Nissan, Lamborghini, Ferrari. No entanto, embora precisemos rastrear e armazenar é o ID real, é por isso que dissemos que é o ASP para o IID manso, seja, o que quer que eu selecione na lista suspensa, veja seu valor e armazene esse valor no make ID. No entanto, mostrarei o nome associado à média. Para a lista, vou ver o contexto. Contexto. Por favor, dê-me todos os microfones e listar isso sou eu dizendo me dê toda a mistura no banco de dados. Então vou apenas dizer Como. Desculpe, só vou me certificar. Certo, sim, às vezes eu os confundo. Portanto, temos o campo de valor de dados e temos o campo de texto de dados. Portanto, o valor que estamos verificando é a média, é o ID em vez da tabela mista. E se você esqueceu, basta ir até a tabela mista para ver quais são os nomes dos campos. O valor que estamos caminhando é ID. Queremos trazer de volta o nome. Você também percebe que eu tenho essas propriedades adicionais, então isso é realmente opcional, mas serve o mesmo propósito de quando colocamos a propriedade do microfone nos carros, o significa que um carro terá um manso. Você não pode ter um carro que você vai chamar uma mistura diferente para ter um Nissan ou eu vou te dizer quais são algumas coisas. Então, é por isso que na mesa do carro, temos um ID para o carro e uma propriedade de navegação. No entanto, a Toyota fabrica muitos carros. Então, se estamos olhando para um registro Toyota, pode haver muitos carros que têm o Toyota ID neles, então é por isso que temos uma lista de carros até agora, qualquer registro de microfone que olhamos, podemos realmente ver todos os carros associados a ele estão todos relacionados a ele. Enquanto estamos aqui, posso silenciar esse virtual. Tudo bem, volte ao nosso código onde transportando o ID, mas queremos exibir o nome para o usuário. Isso é só eu vendo em chegar à carga linear na página. Por favor, vá em frente e execute essa consulta, preencha essa lista e envie de volta a página. Assim que fizermos tudo isso, vou salvar e controlar o F5 para visualizar. E aqui estamos nós. Sei que parece um pouco desigual, mas podemos consertar isso. O que estamos vendo, o ID do microfone. Então esse é o nosso rótulo. Nós não digitamos isso. Tudo o que fizemos foi dar o rótulo e dizer que deixe-me pular. Tudo o que fizemos foi dizer um rótulo para identificação única de cardamomo. Bem, estamos vendo o rótulo. Se olharmos nesta lista suspensa, veremos a opção selecionar microfone. Também estamos vendo outras coisas que não adicionamos como opções. Então você vê que ele está indo para o banco de dados e obtendo Toyota e Nissan. Mais uma vez, o legal disso é quando esta lista é atualizada, então se eu disser Ferrari e criar, uma vez que eu atualizar a página, ela atualizará essa lista e ela aparecerá. Tudo bem, esse é o poder desta lista suspensa. Quando queremos restringir o que o usuário pode inserir, apenas fornecemos a ele uma lista suspensa e mantemos essa tabela. Caso contrário, eles têm muito pouco controle sobre o que podem colocar nesse valor. Quero dizer, estilo sábio, o que estamos faltando é ou controle de formulário de classe na classe select é igual ao controle de formulário. Vou apenas salvar isso e atualizar e permitir que ele seja compilado. E isso parece um pouco melhor. E então também podemos ver como podemos alterar todos os rótulos. Mas vamos tentar criar um carro. Em primeiro lugar, se eu disser select mic, eu não coloco nosso modelo, não coloco o ouvido interno. Portanto, lembre-se, um modelo é necessário aqui. Se eu tentei criar, só vai me dizer, Ei, você não pode ir mais longe até que algo seja feito. Está me dizendo a mensagem errada de validação errada aqui. E isso porque eu não atualizei. Essa validação estava longe. Esse é um dos perigos de copiar e colar. Apenas certifique-se de cobrir todas as bases. Mas ei, é por isso que estamos aqui para testar. Se eu colocar a Toyota, coloquei o modelo Sea Harrier. O ano é 2001. Se tudo parecer válido e eu criar, veremos nossa lista voltando com três. Nós adicionamos dois antes e supervisionamos três. Não, na lista, nada está sendo exibido. Y não é nada exibido nessa lista. Agora vamos pular para a lista e ver. Então, tínhamos comentado o nome e o ano. O que vou fazer é apenas descomentar tudo isso no comentário, tudo. O nome dará um erro porque não há mais nome não é modelo. E olhe para isso nulo quando eu quero ver que tipo de cartão do ano. Então, é um Toyota Harrier de 2001. O que eu tenho, certo? Não. Eu só tenho o ano que é 2001, microfone no Meek ID, que é o campo no banco de dados. Mas, obviamente, não posso mostrar que os usuários fazem TI. Então, vou mostrar o que os usuários verão se eu dissesse Meek ID, porque os valores de ID são realmente para uso interno, eles não são realmente para uma visibilidade do usuário. Quando eu atualizo e vejo isso, não, os dois primeiros não têm IDs de microfone e tudo bem. Entendemos por que porque eles existiam antes de irrompermos no microfone. No entanto, só estou vendo um. O que é um? O que é um maior? Isso não significa nada para o usuário. Portanto, já estabelecemos que as chaves primárias são úteis para navegar. Então, em todo o registro que estamos vendo e em qual registro estamos segmentando. Nessa situação, isso é exibido, isso não significa nada para o usuário. É por isso que temos a propriedade de navegação que eu estava descrevendo. Quando criamos o carro, nos certificamos de colocar essa propriedade de navegação porque não, eu posso ver me dar o microfone que está associado a este carro e eu posso obter os detalhes desse microfone a forma de seu nome. Então eu posso saber apenas encontrar essa mudança rápida na minha visão. E provavelmente vou executá-lo para outro erro, mas deixe-me encontrar essa alteração, atualizar e isso está em branco. Tudo bem, vamos ver por que isso é preto. Está em branco porque ao preparar os dados, estou dizendo me dê todos os carros. Preciso dizer à consulta que quando você me pegar os carros, também quero incluir os detalhes do microfone. Pegando os carros, sim. E ele conseguiu o Meek ID, mas não conseguiu os detalhes da média. Só estou mostrando como tudo está interconectado. Então é por isso que continuo mostrando o que não funciona em como consertamos isso. Então, para obter os detalhes do microfone, tenho que ver o ponto dos carros incluir. Então eu vou dar a ela uma expressão lambda onde eles passaram por como as expressões lambda eram. Estou vendo incluir manso. Então, sempre que você tem uma chave estrangeira em uma tabela e você tem essa propriedade de navegação e deseja executar uma consulta onde você obtém todos os detalhes da tabela de chaves estrangeiras também como a tabela principal. Isso é tudo que você tem que fazer. Banco de dados Consiga os carros, inclua os detalhes para os mansos relacionados e, em seguida, dê-me tudo como pelo menos depois de fazer essa mudança. Se eu atualizar novamente, então veremos toyota. Você vê como tudo acabou de se juntar neste. Mais uma vez, deixe-me apenas rever. Incluí os detalhes do microfone na consulta. Em carros passaram por cima. Foi fácil para mim ver, me dar o carro, me dar o manso, e me dar o nome. Agora, caso eu não tenha explicado antes o que essas áreas assinantes estão aqui em cima contra eles não terem sido feitos aqui, só queremos o nome de exibição. Então, você poderia simplesmente remover isso e colocar seu próprio nome de exibição, se desejar, tudo bem. Nome aqui, o nome não significa nada. Certo. Sim, nós tínhamos nomeado inicialmente, mas tivemos nome que eu vou rotear ou Suzuki no esporte. Nenhum nome só estará armazenando a Toyota porque o modelo está lá para ver um maior. Então, isso realmente deve dizer algo mais parecido comigo. Se você quiser alterar o que está sendo exibido, você pode facilmente remover esse código e colocar o seu próprio. Já olhamos para as mesas. Sabemos o que podemos colocar em nosso próprio texto para o cabeçalho da tabela. Com essa mudança simples, quando regeneramos a tabela ou a página, não a vemos nenhuma impressão mansa. Tudo bem, então você vê como tudo está se juntando. Então o problema é basicamente temos que repetir esse feed para qualquer lugar em que ele esteja puxando dados e esperamos exibir algo. Então, sim, nós o temos na lista, mas vamos passar por isso é chamado teste de regressão. Agora, sempre que você fizer uma mudança em seu sistema, você sempre quis ter certeza de que tudo o que obteve e funcionou siderúrgica. Vemos que temos a lista funcionando. Vemos que temos que criar o trabalho. Se eu olhar para edição e detalhes, vou ver que, ok, Update ainda precisa de algum trabalho nisso. E os detalhes precisam de algum trabalho nisso. Então, vamos mudar esses antigos. Então, vamos começar com as atualizações porque já sabemos que a atualização se parece com a Criar. Eu só preciso pegar os mesmos campos que tenho no criado para a lista de seleção e o modelo e colocá-lo na atualização, logo sobre ele que comentou o código e cola. Mas não é só isso. Ainda temos que carregar essa lista suspensa porque as sementes que a completam não sabem o que é a mistura. Assim como o que fizemos com a criação, onde tínhamos aquela propriedade chamada mic. Alguém está fora para lhe dar essa propriedade chamada mix novamente. Então vou ter que preencher que faz propriedade com dados. Então, assim como o que fizemos, está no on venha aqui para a atualização. Eu vou ter que contar para obter sim, aqui ele entra no registro do carro para ser diminuído. Mas então eu vou apenas ir em frente e colocar essa mistura. Então, se você receber o registro do carro e ele não estiver retornando a dinâmica do telefone NADH, o próximo banco de dados ligou para obter o mix, então poderemos retornar a página depois de fazer essas alterações na página de atualização. Se eu atualizar, verei que temos isso acontecendo. Observe que é padrão selecionar o microfone. Se eu voltar para a List e escolher um que tenha um microfone, você vai se ligar automaticamente e me mostrar o leite que foi selecionado anteriormente. É vinculativo. É, é um pouco inteligente. Mas como os outros não me tinham, não me mostra nada, desculpe-me, o padrão uma vez que um valor se encontra uma vez por semana, a ideia estava presente para o bind automaticamente na edição para obter os detalhes. Bem, antes de chegarmos aos detalhes, vamos nos certificar de que isso ainda funciona. Fui ver que esta é uma ferramenta de 2 mil, assim como simples mudar, salvar, e vemos que ela está sendo refletida, então o editor ainda está funcionando. Isso é bom. Precisamos atualizar os detalhes para que ele saiba o que se espera dele eu possa descomentar que o SHA-1 doente foi em primeiro lugar, eu dupliquei, então eu posso descomentar. Isso não é nome, não mais nome sozinho, mas o nome do ponto e isso não é modelo. Nenhum detalhe mostrará a orelha, o nome do microfone fora do microfone e o modelo. Para nossa consulta. Precisamos informá-lo quando você recebe carros primeiro. Terceiro padrão. Mais uma vez, inclua os detalhes do microfone. Então, inclua a expressão lambda e o microfone em get, pegamos o carro com os detalhes. E então podemos ver tudo. Se eu ver os detalhes do Toyota mais alto nom, veja tudo voltando. Mais uma vez, vemos esse nome ali mesmo. A coisa é que não, eu fui até eu meio que retendo em mudar a propriedade aqui porque fizemos isso para o índice onde eu a altero manualmente. Mas então podemos querer fazer para os detalhes, mas se mudarmos dinheiro, eles sempre foram e depois o cliente ou quem quer que estejamos construindo o software para um vem e diz, eu não gosto desse rótulo, altere esse rótulo, então esses são tantos lugares quanto teremos que atender à mudança. Uma maneira mais rápida de atender a esse tipo de modificação será usar anotações. Aqui posso ver a classe MEC que sua tela. Exibição. Depois de incluir bibliotecas ausentes, controle os dados e insira. Em seguida, name é o parâmetro. Portanto, seu nome de exibição é apenas alterando que aqui está aqui acima dessa propriedade. Em qualquer lugar que o nome de exibição para ele esteja ele já atualizado. Em qualquer lugar que o nome de exibição do beta do código esteja sendo usado como se estivesse sendo usado no índice. Antes de alterá-lo para o nome de exibição de semente para isso, procurará automaticamente qualquer anotação de dados acima dessa propriedade que vê exibição e , em seguida, use esse texto. Isso realmente me lança a mágoa de precisar mudar esse dinheiro enquanto eles em todos os lugares, eu posso reverter para o nome de exibição do índice. Posso mantê-lo nos detalhes porque lá está o nome de exibição para. Então, em todos os lugares em que estiver sendo referenciado, ele usará automaticamente esse gosto. Tudo bem. Só estou te mostrando um bom jeito mais limpo em vez de redigitar a seco. Não se repita. Esse é um dos princípios fundamentais do desenvolvimento sólido. Então, o mínimo possível, você deve redigitar código sempre procure uma solução que tenha um alcance mais global, oposição a uma que exija que você continue fazendo a mesma coisa repetidamente. Agora, vamos tentar criar outra coisa modelo. Vamos chamá-lo de Tesla, ano 2221 criar. Tudo bem, então você vê que isso não é válido para mim ID. Portanto, esse é um desses erros padrão porque não colocamos nenhuma mensagem de erro sobre ele, mas ele está apenas nos rebufando e vendo que não é válido para o Meek ID, então a validação é quase automática nesse ponto. Da mesma forma, se eu tiver uma data inválida, ano diferente de você ver o ouvido de campo deve estar entre essa mensagem. Essa mensagem está chegando porque colocamos o intervalo para os detalhes. Essas são maneiras de aprimorar a interface do usuário e impor certas regras para que seus usuários preservem a integridade dos dados. 18. Melhoria do formulário - parte 2: Tudo bem pessoal. O que queremos fazer é continuar desenvolvendo como aprimoramos os fóruns e as duas coisas que temos que fazer para garantir que fornecemos a melhor experiência para nossos usuários. Saiba quando se trata das etapas de validação, as visualizações notariam que nosso é válido não é atingido quando tentamos enviar os dados inválidos. E isso é realmente porque temos os scripts de validação aqui, certificando-se de que apenas dados válidos vão além do cliente dito e isso é bom. Mas então, no caso de existirem certas circunstâncias em que ele possa pensar que é válido neste lado, mas precisamos de validação no lado do servidor. Portanto, isso é validação do lado do cliente. Você me ouviu falar sobre todos os clientes. Acho que a validação do lado do cliente ocorre no front-end, certo? Então, entre JavaScript e HTML, estamos informando que os usuários saibam o que é válido, o que não é. Se eu usar um JavaScript desativado, eles podem facilmente ignorar esse mecanismo. Além disso, pode haver momentos certas regras de validação precisam ser avaliadas no lado do servidor. Então, se você tem uma lógica complexa, como talvez você tenha outra validação para garantir que o modelo corresponda ao microfone do carro ou algo parecido. Seja o que for, é complexo. Não pode realmente ser retrato em nosso ESR nem é necessário, ou está entre esses valores. Não é realmente um booleano ou algo que seja rápido. E então teríamos que criar algumas regras de validação mais complexas no lado do servidor ou no código para garantir que ela seja válida. O que eu quero retratar agora é o que acontece quando talvez a validação do lado do cliente não esteja em execução. Para fazer um experimento rápido com isso, vou apenas comentar os scripts de validação parcial. Então, uma maneira rápida de comentar, coloque o cursor no controle de linha. Casey comentará e a chave de controle que você descomentará. Mantendo pressionado Control. Você pressiona a tecla, então você pressiona C e, em seguida, ela entrará. E então você faz o mesmo com a chave e você, e ele descomentará. Estou desabilitando esse script que está sendo executado no lado do cliente. E vou colocar o ponto de interrupção aqui para que possamos ver o que acontece quando algo for convidado no fórum. Só vou clicar em Criar e ver o que acontece. Ele salta direto para o post. Portanto, não há mensagem de validação. Lembre-se da última vez que sempre imprimiríamos toda a mensagem de validação do botão. Não, nenhuma validação do lado do cliente está ocorrendo. Portanto, nossa prova de falhas é esse estado do modelo, estado do modelo DOT é válido, é válido, a retina é falsa. Se olharmos nos estados do modelo, só para que possamos entender exatamente o que está acontecendo aqui. Lucy, status de validação em válido, quantos existem, então você tem as chaves e os resultados. Então, vamos para os resultados. Os resultados nos mostrariam as chaves e os conjuntos de validação de cada chave. Portanto, a chave aqui seria cada valor que está no modelo sendo validado ou carro de módulo. E a validação diria que o ano é necessário, modelo é necessário, faça ID embora todos eles sejam necessários. Não. Nenhum deles foi fornecido. Todos eles são inválidos. E então, se você quiser detalhar , você vê a chave, você vê o valor e, em seguida , ela vai dar alguns outros detalhes. tentativa de valor era que há muitas coisas que você não pode tirar desses estados do modelo. Então, aqui está esse erro exato. Está dizendo que o valor que é uma string vazia é convidado. Esse é o erudito que você vai chegar lá, pressione F5 ilimitado, continue. Isso é o que impede o antigo. Portanto, estamos recebendo esse resumo de validação e estamos recebendo cada erro abaixo de cada campo. Então, se eu colocar algo que está fora da reentrada, disse que o intervalo é de 1999 a 2020. Então, se eu colocar 1990 e tentar novamente, ainda é inválido. Eu pressiono F5 novamente. Não, vai nos mostrar um diferente oh, desculpe. Eu deveria ter dito 1900. Isso teria sido convidado. Deixe-me tentar isso de novo. Então crie calor, o ponto de interrupção, continue, e lá vamos nós. Portanto, o ouvido de campo deve estar entre 19902021. Então, estamos vendo toda a validação onde estamos familiarizados com este Randolph. Isso é o quê? validação do lado do servidor redefine a tabela se alguém desabilitar o JavaScript em seu navegador, ou por qualquer motivo a área com um bypass do JavaScript porque tudo com HTML e e CSS estão disponíveis para seus usuários. Portanto, trata-se de nó de codificação segura porque tudo o que preciso fazer é inspecionar o elemento. Posso ver tudo acima do código. Eu poderia modificar essas certas coisas. Eu poderia optar por desativar esse script nesta página, coisas assim. Isso é um buraco, o furo importante ou a etapa de validação do lado do servidor é garantir que não o fazemos, não devolvemos nenhum lixo ao nosso sistema. Agora, outro grande problema que é um grande problema que definitivamente temos que abordar é o fato de que eu ia começar de novo. Vamos criar novo. Temos nossa lista de microfones não é divertida. Fui dizer modelo Toyota, modelo de carro, o que quer que seja. Eu clico em Criar, inverno, remover este ponto bruto porque sabemos que ele vai ser inválido porque não havia modelo, nenhum valor para o ano fornecido. Mas o que aconteceu com os mansos? Olhe para isso, essa lista desapareceu. O que acontece é que quando estamos lidando com lista de seleção e certos tipos de listas na postagem, você sempre precisa ter certeza de que se você vai acabar retornando a página, você precisa retornar a página com todos esses dados adicionais. Porque agora os únicos dados que são bons para persistir são qualquer coisa que tenha a propriedade bind acima dela. Mesmo que eu veja a propriedade Ben acima da lista de seleção aqui, a realidade é que não há campos no meu formulário para armazenar a lista inteira. Tenho um campo para armazenar o ID selecionado na lista, mas não a lista inteira. Essa lista precisa ser atualizada toda vez que esta página for carregada. Só para dizer que não conseguimos ir e obter a lista do banco de dados e por período. Assim, ele pode ser carregado quando eu sou inválido ou o pH, o envio está em um estado inválido e o pH precisa ser retornado. O pH terá que ser devolvido sem mistura nele. Então eu fui dar um exemplo do que quero dizer aqui. Só vou colocar algum código aqui que vai dizer var mix. Após o envio é igual à mistura. Vamos ver o que está em mistura antes de Enviar. E então vamos ver o que acontece com a mistura após um envio. Assim, com as versões mais recentes do Visual Studio anteriormente no modo de depuração, você pode simplesmente clicar em Aplicar alterações de código. Em seguida, volte para o código. Vou apenas atualizar a página. Tudo bem, vamos passar por isso de novo. Vou tentar criar e vou enviar algo inválido. Vou colocar de volta meus pontos de interrupção para que eles façam uma pausa para que possamos ver o valor que vem aqui. Também vou colocar um ponto de interrupção aqui antes que ele retorne um pêssego. Então, quando eu ver, Ok, deixe-me apenas atualizar. Deixe-me fazer isso de novo, desculpe. Então crie ao meio-dia. Então, quando eu crio novo, ele atinge esse ponto de interrupção para a página. Então, se eu olhar em mix, estou vendo que a mistura é que ela tem dados. Ele ainda tem isso sugere que ele tem dados. Ele tem os itens que entrarão na lista suspensa. Tudo bem, isso parece bom. Só vou remover esse ponto de interrupção. Envie algo que não é válido. Quando o ponto de interrupção era que a instrução if, ela não a atingiu. Então, estou apenas movendo para a linha 34 para mim ou os primeiros resumos do método. Vou entrar nisso e, em seguida, vamos procurar mix, mix é nulo apenas para dirigir minha ferramenta de ponto e que, uma vez que os dados são enviados, você seleciona isso e basicamente qualquer coisa que seja pelo menos que não seja ser desossado ou que não pode ser desossado vai ficar vazio. Depois de enviar. O que precisamos fazer é atualizar essa lista. Só vou parar. E vamos fazer esse bit de código para garantir que a página seja sempre fornecida com sua lista de seleção. Ou, em um caso em que você tem vários suspensos, esse é o mesmo conceito. Isso garante que todos eles sejam preenchidos com os dados quando o pH é carregado. Então eu poderia realmente pegar esse pedaço de código e colocá-lo aqui. Se o estado do modelo não for válido, recarregue a lista de mixagem e retorne à página. Caso contrário, vá em frente para que ele não desperdice a chamada do banco de dados. Se o estado do modelo for válido, ele não fará nada disso. Ele simplesmente saltará para isso e prosseguirá. Saiba o que eu não gosto de fazer é repetir código assim. Por que parece simples e simplesmente o suficiente é arquivo de classe pequeno e é realmente apenas uma linha. Mas então o que algo muda? Lembre-se, eu disse que quanto mais você repetir o meio do código em torno do aplicativo, mais difícil será sua manutenção quando algo mudar. O que eu costumo fazer é ter métodos privados. Então, vou apenas dizer tarefa privada. Vamos apenas dizer tarefa privada. E vou fazer disso uma tarefa assíncrona. Aqui. Chame de preenchimento, listas suspensas. É só chamá-lo de preenchimento de listas suspensas. E então, dentro disso, eu faço essa chamada de método. Então isso saberia b. E eu posso encontrar esses associados assíncronos pelo menos uma pia que precisa que eu inclua essa biblioteca. E então eu posso encontrar esse trigo. Tudo bem, então é um método assíncrono. Eu queria fazer uso dos métodos assíncronos. O que eu sei é apenas chamar esse método em todos os lugares que eu preciso fazer essa população. Se eu tiver várias listas suspensas, preciso preencher. Acabei de colocá-los aqui quando chamo isso. E então ele pode fazer isso porque há outras situações em que você pode precisar de dados que não estão sendo presos na página. Talvez seja necessário que ele esteja presente no pH se o estado do modelo for convidado. Então você pode, por que estou ligando para preencher isso, você também pode chamá-lo como Senhor, dados iniciais. Portanto, qualquer consulta, qualquer operação que você precise realizar antes que a página fique visível, você coloca todo esse código aqui para que não precisemos repeti-lo em seus manipuladores. Se você tiver mais de 100, apenas 100 realmente não importa. Você não precisa repeti-lo. Não, tenho que aguardar quando estou fazendo a chamada porque é assíncrona. Mas, em cima, este está me dando uma flecha, e isso está me dando um erro porque esse método não é assíncrono. Então, vamos converter este em assíncrono. Tarefa assíncrona. E espera-se que essa tarefa retorne algo do resultado da ação do tipo i. E uma vez que eu tenha feito tudo isso, todas as linhas vermelhas brilham e todo mundo fica feliz. Só estou mostrando algumas armadilhas ou coisas a serem observadas quando você está escrevendo seus aplicativos. 19. Melhore formulários de coleta e validações - Parte 1: Tudo bem, então estamos construindo esse aplicativo e mostramos aos nossos stakeholders porque no final do dia, maior parte do que você vai construir, você terá que demonstrar para alguém. Enquanto você o testa, enquanto você o desenvolve, você o testa. Ou você é guiado pelas expectativas deles na forma de requisitos de software, ou você está sendo guiado pelo que acha que eles precisam, que pode ser perigoso. Porque nesta situação sem nenhum requisito formal dado, eles nos deram algum feedback e nos disseram que certas coisas definitivamente precisarão ser alteradas. Não, número um, eles estão dizendo que precisam de mais informações sobre os carros a serem armazenados. Conheça o ano, o microfone, o modelo. Isso não é informação suficiente. Eles precisam que digamos de que cor é o carro e forneça um número dividido de licença, que eu acho que são pontos de selante. Outro problema que eles apontaram é que erros ortográficos podem ocorrer porque deixamos o modelo como um campo de texto livre. Embora a música seja uma lista suspensa, o modelo não é. E discutimos o perigo disso anteriormente. Então, para o mesmo resultado que fizemos, faça uma lista suspensa. Vamos ter que fazer uma lista suspensa do modelador. Isso vem com seus próprios desafios também porque modelo, não podemos colocar um modelo aleatório. Por exemplo, um Nissan, nissan, Sony com um olho. São erros ortográficos. No entanto, nada está impedindo alguém de digitar na Ferrari Sunni. E se você sabe alguma coisa sobre a Ferrari, você sabe que eles não têm um modelo chamado sunita. Então eles também disseram que quando você seleciona um microfone, eles queriam ter certeza de que o modelo que eles são capazes selecionar depois se aplica a esse Meek. Esses são alguns requisitos que surgiram em nosso caminho. Nós, na verdade, já fizemos coisas em torno de algumas dessas mudanças. E vamos ver exatamente como isso funcionará. Então, a primeira mudança que vou fazer é para a entidade do carro. Lembre-se de que introduzimos o microfone, precisamos introduzir mais campos e não estamos, já estamos familiarizados com o que precisamos fazer para introduzir novos campos. No primeiro campo, estou usando o Control D para duplicar, então não preciso digitar tudo do zero. O primeiro campo seria string. Isso seria cor. A cor também é outro tópico sensível. Porque alguém pode escrever azul, alguém pode escrever B0, alguém contrariar preto e esquecer o c. Então esse é outro tópico sensível. Queremos deixar a cor do veículo como texto livre? Ou queremos bloqueá-lo e tê-lo na lista? Essas são decisões que temos que tomar para garantir que nosso sistema seja devido corretamente pelos usuários. Pessoalmente. Eu prefiro ter cores em uma lista porque as chances de os usuários inserirem cores incorretas são cores que nem existem diminuem muito. Da mesma forma que temos o identificador de chamadas. Isso vai ser uma chave estrangeira. Então deixe-me, deixe-me voltar um pouco e vou apresentar os novos campos na ordem. Tudo bem, então embaixo de mim, fui salvar o público int e não estou fazendo nenhum nível. Então lembre-se por que tínhamos que disponibilizar isso. Estamos introduzindo uma chave estrangeira após o fato, depois que já existem registros lá. Então, queríamos ter certeza de que tivéssemos muito poucos conflitos com os valores das chaves estrangeiras. Nós vamos ter outra propriedade, que será uma propriedade virtual e vai chamá-la de cor. Vai ser chamado de cor em si, digite cor. Vai ser chamado de cor, sem cor. Olhe para isso. Eu posso apenas fazer pontos de controle. Não temos uma classe chamada cor. Então eu posso ver gerar um tipo chamado cor. E perguntará a eles, você quer que ele precise em um novo arquivo? Fui vê-lo, sim, porque queria denotar novo para nós. Lá, ele apareceu como cor e esse erro desapareceu. Então essa é uma maneira rápida quando você está criando novos tipos e não os criou vtable, você está fazendo descarga ou o que precisa fazer. O Visual Studio tem sugestões para ajudá-lo a ser mais produtivo e não se concentrar nas pequenas coisas. Isso é cor. Do que eu preciso? Precisamos da lista para modelo. O modelo sofrerá o mesmo destino que o nome sofreu. Alguns apenas removerão o campo modelo. Isso vai ser um ID de modelo. Você notará que eu sempre volto e corrijo. Deixe de fora algo que não está maiúsculas ou como um erro ortográfico eu estou sempre fazendo jardinagem porque quando você faz certo na primeira vez, ele sobe firewall. Então, mais uma vez, com o modelo, não estou vinculado ao uso de nenhuma biblioteca. Na verdade, eu queria gerar minha própria confiança. E então o modelo, como você vê, é na verdade como uma palavra-chave porque é modelo. Você teria me ouvido falar sobre modelos quando estávamos falando sobre Entity Framework em assim por diante. Portanto, é meio arriscado se eu chamar o modelo de classe porque não sei com qual outro nome ou com qual outro tipo de dados posso estar em conflito. Vou chamá-lo de modelo de carro, só para estar no lado seguro. O tipo de dados que estou criando é chamado de modelo de carro. Mas então vou chamar o campo dentro do meu carro de classe, apenas modelo. Tudo bem? Mais uma vez, às vezes você o nomeia de forma diferente. Às vezes você o nomeia da mesma maneira se precisasse vê-lo, sabemos problemas, então vamos apenas nomeá-lo da mesma maneira. Este é modelo de carro, ID, modelo de carro e o modelo de carro de campo. Para nossas novas entidades, o que precisamos? Todos eles precisam exatamente como o que pode cortar. Todos eles precisam de uma identificação. Eles precisarão de um nome e todos terão essa lista de cartões. Então, na verdade, esses campos podem ser replicados facilmente em todos eles. Então, para cores, temos a cor da foto de identificação. A tela aqui seria colorida e não mansa. Então você vê, eu estou copiando e colando não fez nada de errado ao copiar NPC1L1 para entender o conceito ou o que você está tentando realizar, você sempre pode copiar, colar e acelerar sua produtividade. Tudo bem, então temos esses três campos em cores. E então eu fui fazer a mesma coisa em nossa classe de modelo de carro usando o ponto de controle para incluir quaisquer referências ausentes. Então este estaria aqui no nome da disciplina. Posso ver um modelo porque sabemos que estamos olhando para o carro, então não preciso dizer modelo de carro para o usuário. Isso é só porque estou tentando evitar conflitos e isso é uma perseguição mais experiente porque já encontrei isso antes. Então, não se sinta de jeito nenhum se você está se perguntando, ok, como eu sei quando pode haver um conflito ou não? Às vezes, é tentativa e erro. Às vezes, você faz isso quando tenta executar, você se depara com o problema, então você o altera. Não há problema. Temos cor modelo de carro, temos carro e temos Meek. Não. Outra coisa que vou apontar neste momento é o fato de que eles estão usando campos semelhantes em cada um desses modelos de entidade até agora tem o campo chamado ID. Deixe-me apenas espaçá-los tanto quanto esses três têm todos os três carros comuns que fundem não tem nenhum, nada mais em comum. Mas meu ponto é que, em vez de repetir ID, ID, ID, ID, ID toda vez, uma coisa que você pode fazer para reduzir novamente a repetição e aumentar extensibilidade e a compartilhabilidade em o código é introduzido o que chamamos de modelo base. Então, vou criar um novo item que chamarei base de uma nova classe ou outra porque estou chamando esse domínio em tutti. E então eu vou conhecer essa aula pública abstrata. Então, é abstrato. As aulas abstratas basicamente significam que elas estão lá, mas você não pode ter uma instância delas sozinha. Você seleciona ir com o carro. Podemos instigar que iniciados ou outro carro aqui eu posso simplesmente chamar o carro quando é uma classe abstrata, você não pode simplesmente chamar essa entidade de domínio baseada em entidade em qualquer lugar. No entanto, é bom para fins de herança. Então, a partir daqui, fui dizer prop int id. Saiba que tenho esse campo aqui. Eu posso para todos os outros. Todos que precisam desse campo ID para herdar apenas de B são entidades de domínio. Quando eu faço isso com modelo de carro, o que você percebe é que esse ID acende. Agora, a mensagem que ele vai me dizer é que essa propriedade aqui está interferindo com a herdada. Portanto, está vendo um conflito, não é um erro, erro. Você apenas avisa que, se você pretendia herdar o valor deste, sempre terá precedência do herdado. Mas o ponto de eu herdar que eu não quero vê-lo lá. Sempre que você tiver campos, então eles são leves mais tarde em sua carreira, você pode começar a falar sobre auditoria, onde deseja armazenar quem criou uma data de 10 watts. Foi criado. Quando você tem esses tipos de campos, basta colocar tudo isso na entidade de domínio base e, em seguida, certifique-se de que todo corpo que é uma classe de banco de dados herda da entidade de domínio base que nós todas as classes terão esses campos independentemente. Esse nó reduzirá a repetição deles. Então, da próxima vez que eu tiver outra aula, não preciso gastar tempo colocando o zumbido apropriado que herda. Se houver cinco propriedades que a classe IVR deve ter ou cada tabela deve ter em comum. Acabei de colocá-los todos no baixo. Todo mundo herda. Tudo bem, então vou fazer isso para todas as minhas entidades de domínio. Então o conjunto de carros, o modelo CAR está definido, cor está definida e faz você se sentar. Todo mundo está herdando da base. Então, se eu quisesse, como eu disse, apenas estendeu o suporte. Então, digamos que eu queria saber quando foi criado. Então prop, tempo. Data de criação? Não, eu posso dizer ok, eu sei quando este modelo foi criado, este MOOC foi criado quando este carro foi colocado no sistema, etc Estes são todos os pedaços importantes quando você está lidando com sistemas. Com essas mudanças no lugar. Vamos pular para o console do Gerenciador de Pacotes. E vou adicionar uma nova migração. Então, vou dizer que adicionou mais tabelas de dados do carro. Essa é minha mensagem. Eu migraria e qualquer mensagem descreva toda essa atividade da melhor forma possível. E, em seguida, deixe-o ir em frente e gerar esse campo de compilação de migração. Sim, é claro, habilidades para interferir porque todos os meus pontos de vista que têm modelo não vão gritar. História semelhante ao que passamos com o nome. Mas, mais uma vez, é melhor fazer isso enquanto estamos no estágio de desenvolvimento, ao contrário de quando você está em produção. Nós apenas passamos rapidamente por todos esses campos sem comentários que têm uma dependência do modelo. E vou tentar isso de novo. E desta vez obtemos nossa migração. Então, vamos examinar a migração rapidamente. Estamos vendo que estamos soltando a coluna para um modelo onde adicionando a coluna para a data de criação e ela é adicionada, sendo adicionada à mistura. Estamos adicionando o ID do modelo do carro aos carros, ao ID do chamador e à data de criação, todos eles estão sendo adicionados aos carros. E eles estavam criando as tabelas adicionais. E então sentar esses índices e as chaves estrangeiras que não estavam lá anteriormente. Claro, a cúpula está apenas desfazendo tudo isso. Devemos fazer uma migração de remoção? Depois de tudo isso, fomos fazer um banco de dados de atualização. E se tudo correr bem, terminamos, terminamos. Agora vamos atualizar nossos campos. Então, de volta ao Create. Create não tem mais modelo de carro. Agora temos ID do modelo, ID do modelo, e temos validação para ID do modelo ou desculpe, modelo do carro, Esse é o nome do campo. É ID do modelo CAR. E então, na verdade, teremos uma lista de seleção, apenas isso para os modelos. Então, vamos fazer microfone e, em seguida, selecionar o modelo. Então nossos itens ASP não virão do mix virão de um campo chamado modelos que vamos estar sentados em alguns. Também precisamos estender essa lista para ter uma facilidade para nossas cores. Da mesma forma que temos que colocar nos modelos. Temos que colocar nosso identificador de chamadas, ID chamador, selecionar cor. Então isso virá de uma lista de cores. Tudo bem, ótimo. Então é isso para ou crie. E o que vou fazer só para facilitar isso mais uma vez, copiando e colando nada de errado com ele. Vou apenas pular para a atualização e mudar esse pensamento porque realmente será a mesma dinâmica. É isso para a atualização do nosso índice, podemos descomentar isso e, em seguida, colocar o ID do modelo do carro. Então, será o nome do modelo CAR. No índice. Isso queremos mostrar o ano, o microfone, o modelo do carro. E digamos que quiséssemos colocar na imagem, desculpe a cor também, seria o nome do ponto de cor. Você verá a importância dos campos de navegação. E depois descomentamos. Portanto, este é o modelo do carro, nome do ponto, a cor, o nome do ponto. Tudo bem, então isso está apenas estendendo isso. Essa é uma parte normal de qualquer processo de desenvolvimento de software. Você vai fazer alguma coisa. Você receberá feedback e, em seguida, terá que desfazer algumas coisas e refazer algumas coisas, fazer coisas novas. É apenas uma parte normal do desenvolvimento de software. Então, atualizamos nosso índice ou atualizamos ou criamos. Então, são apenas os detalhes agora vamos apenas atualizar isso. Podemos fazer os outros pelos detalhes. Também. Saiba ao fazer isso, realmente me ocorreu que havia uma coisa que o cliente pede que não colocamos e esse é o número da placa. Colocamos em tudo, menos o número da placa, não neste momento. Mais uma vez, você tem duas opções. Ele pode desfazer todas as alterações feitas no banco de dados e, em seguida, colocar no campo ausente. E então. Refaça a migração. Não vou passar por tudo isso. O que vou fazer é número da placa C Public. Vou usar um fluxo porque a placa de licença, embora seja chamada de número, não é realmente um número. Às vezes, é alfanumérico. Posso meu país ser alfanumérico. E eu tenho uma regra geral que não uso int e double ou qualquer tipo de dados numérico, a menos que eu tenha usado esse número para alguma forma de matemática. Eu simplesmente adiciono enquanto ele é chamado de número e, embora possa ser estritamente numerais em seu país, não será usado para nenhum tipo significativo de colisões. Número completo Eu não armazenaria o número completo como um número no banco de dados. Vou armazená-lo como uma força porque alguém coloca hífens ou colchetes e assim por diante, então não é mais apenas um número. Se o número da placa vier com letras, apenas durante uma string de teste não tem consequência. Se todos os números são alfanuméricos. Estou apresentando esse novo campo e tudo o que vou fazer é apenas adicionar outra migração dizendo que fiz o número da placa. Continuo digitando o nome. Sinto muito. Mas estou recebendo um campo de construção. Isso é porque ainda não os temos. Então, o que vou fazer é comentar isso para a migração está feito. Vamos rapidamente, vamos tentar isso. Migração novamente. Nome do botão Pessoas. Eu não quero nome. Fui remover a migração e fui corrigi-la e vi o número da placa. E então obtemos a migração onde ela está dizendo que está apenas adicionando o problema da lei da coluna. Poderíamos colocar validações nele. Então, às vezes você faz alguma coisa e então você é como, oh snap, eu esqueci esse passo. Então, vamos voltar e apenas fazê-lo. Os números da placa de matrícula serão necessários. E vou sentar um comprimento de corda de dez. Isso é generoso no meu livro porque eu não acho que alguém realmente tenha um número de lata de plano de aula no meu país, eles são seis personagens por tempo suficiente que você vai reservar ou diminuir, eles são até seis, mas isso diz colocar em dez. Então, ninguém deve ser capaz de escrever um ensaio nesse campo. Vamos fazer isso de novo. Agora eu tenho que remover a migração e depois adicionar migração. É bom que a Microsoft não nos cobra toda vez que estivemos nesta declaração, podemos fazê-lo quantas vezes precisarmos para garantir que acerte no banco de dados. Então você vê aqui é invar, char tin muçulmanos e não anulável. Tudo bem. Em seguida, posso ver o banco de dados de atualização. Isso é feito. Tudo bem, então agora temos nosso número de placa de matrícula introduzido. Posso voltar para meus antebraços e posso colocar essa entrada para a divisão da licença. Tudo bem. Então eu posso descomentar isso. Gordon, entre, certifique-se, se explicado em Ticiano, coloque em lições divisões número no formulário. Em seguida, faça a mesma coisa para a atualização. Então, remova o comentário de tudo isso e introduza o campo de número dividido da lição. Mais uma vez, estou seguindo o mesmo formato. Então, mesmo que eu precise de um novo campo, vou copiar isso, colá-lo e, em seguida, alterar o que preciso mudar. Observe que tudo isso é introduzido. O que precisamos fazer é garantir que estamos carregando as outras listas suspensas. Então, neste momento, temos microfones. Preciso de um para as cores e outro para os modelos. Da mesma forma que tivemos que carregar a mistura. Temos que carregar cores e modelos. Assim, podemos facilmente fazer isso por favor, sem duplicar o esforço tanto no GET quanto no post, posso fazer isso um por favor e ver uma carga de dados iniciais. Aqui. Sente-se os modelos para ser a lista de pontos de contexto Models.swift. Eles são todos do mesmo tipo de formato e isso é realmente modelos de carros. Desculpe. Eu não nomeei. Tudo bem. Em seguida, temos cores de ponto de contexto e temos o nome de ID. Eles vão notar que estou recebendo esses erros. E se você pode me dizer por que estou recebendo essas flechas, então elogios Steve tem prestado atenção. Se você não pode me dizer, tudo bem. A razão pela qual estamos recebendo esses erros, deixe-me mudar isso rapidamente. A razão pela qual estamos recebendo essas áreas é que o contexto não sabe nada sobre modelos ou cores de carros. Então, estou aqui tentando acessar tabelas que o contexto não sabe por que não parece contextos agora, enquanto as colocamos no banco de dados e criamos entidades, ainda precisamos colocar o DB sentar. Preciso ver. Por favor, acerte essa entidade chamada modelo de carro contra uma tabela chamada modelos de carro. E cor contra cor. Agora, este é um bom ponto para apontar todas essas nuances porque é fácil perder essas pequenas coisas. E eu cometi esses erros deliberadamente apenas um ponto ou pedágio ser consistente é muito importante. Lembre-se de que isso representa o nome da tabela dizendo DB set CAR model e modelos de carro. Se eu tivesse colocado isso antes de fazer a migração, a migração teria dito que o nome da tabela são modelos de carros e o nome da tabela aqui é cores. Mas como eu já fiz a migração, veja o que acontece. O nome da tabela é modelo de carro e o nome da tabela é de cor. Portanto, tenha muito cuidado com isso. Seja qual for o nome da tabela aqui, você quer ter certeza de que você meio que espelhe isso deste lado com o nome que você dá e então esse tipo de parece incompatível comigo. Os carros, eu. Eu realmente não gosto quando é assim. Mais uma vez, eles não nos cobram de gerir migrações, casa e imigrações urina. Isso depende realmente de você e quantos arquivos de migração você realmente deseja. Mas, mais uma vez, à medida que você pratica mais, você comete menos erros como este e os verá fazer certo na primeira vez. E então você percebe que quando você precisa executar cinco migrações para fazer uma coisa, você acabou de escrever mais direto. Agora que coloquei isso em modelos e cores de carros, posso ir ao console do gerenciador de bolsos e executar uma migração. E estou vendo nomes de tabelas carted, então essa é minha migração. Quando recebo esse arquivo de migração, estou vendo isso também, apenas soltando as chaves estrangeiras, soltando as chaves primárias, renomeando a tabela e, em seguida, ela está adicionando-as de volta. Ele faz todo um processo passo a passo de como ele lida até mesmo com a renomeação da tabela. Pode parecer simples, mas nunca apreciei completamente o que os bancos de dados passam no back-end até eu realmente vi que tipo de código de migração estava sendo gerado para o que eu percebi operações muito simples, certo? Portanto, é sempre bom deixar que as migrações lidem com esse tipo de coisas. Você acabou de adicionar a migração quando precisar. Então, vamos apenas atualizar o banco de dados. E uma vez que isso seja feito, e mais uma vez, se você estiver encontrando flechas, você só entra no código. Provavelmente no formulário, pelo formulário de atualização provavelmente teria algum código que causará problemas. Você acabou de comentar, fazer o que você tem que fazer e depois voltamos a ele. Então, de volta ao nosso Create agora você vê que todo mundo está feliz. Podemos carregar dados iniciais. Não fizemos esse carregamento de dados iniciais em nossa atualização, e eu sugeriria isso. Então, vou apenas descomentar esse código que estava causando problemas. Precisamos de modelos e precisamos das cores aqui e fomos ter esse método privado. Tudo o que fiz foi copiar e colar. Então fui contar, vá em frente e gerei propriedades para modelos. Então você vê isso? Em seguida, vá em frente e gere uma propriedade, quatro cores. Agora, se eu olhar para o topo lá estão eles. Usando o Visual Studio como uma ferramenta de produtividade. Está ajudando você a se concentrar menos nas pequenas coisas e apenas fazer as coisas. Só que eu sei que tenho minhas listas de seleção. O que preciso fazer? Preciso chamar o método de dados iniciais do meu senhor. Um. Quando estou prestes a retornar a página, chamo os dados iniciais de carregamento. Isso é assíncrono depois do nosso ponderado. Então, se o estado do modelo não for válido, então eu tenho que chamá-lo de dados iniciais novamente. É isso. Tudo bem. Com isso, conseguimos muito. E mesmo assim você provavelmente poderia abstrair essa funcionalidade incorporada em um método auxiliar que faz isso por você. não vou ter isso técnico e complicado. Estou apenas dando as ideias, mas você ainda vê que temos que repetir esse método aqui. E na criação e talvez em outras páginas onde você pode precisar listá-las. Então, se você quiser reduzir a repetição e foi quando ele começou a ver, ok, como posso criar um arquivo com o método que vários lugares precisam usar? Então eu posso simplesmente chamá-lo e ter todo o código em um só lugar com tudo isso dito e feito. No entanto, conseguimos muito para ter estendido as tabelas. A mesa do carro que criamos novas mesas e facilitamos para a nova neve da lista suspensa. Quando voltarmos, vamos fazer o andaime para as novas tabelas porque fizemos isso com microfones para que pudéssemos manter a lista de mixagem. Precisamos fazer isso para as cores e para os modelos. E então também veremos como podemos controlar qual modelo aparece quando um microfone é selecionado. 20. Melhore formulários de coleta e validações - Parte 2: Oi pessoal, bem-vindos de volta. Da última vez, paramos apenas colocando novas mesas e colocamos nas listas suspensas, mas precisamos realmente colocar praias da multidão ao redor dessas listas. Vou fazer um com você e depois vou desafiá-lo a pausar o vídeo e fazer o resto sozinho. Então, vamos fazer o andaime para nossas páginas de modelo de carro. E então podemos adicionar uma nova pasta. Então, vou dizer modelos de carros. Em vez disso, fui adicionar uma nova página Razor, páginas Razor usando o Entity Framework bruto. E então estamos modelando o modelo de carro. Vá em frente e pressione Adicionar e salvo quaisquer erros, o que mais uma vez seria porque você provavelmente só precisa ir e reverter para versões anteriores que teriam funcionado. Você pode ver que seus modelos de carro foram andaimes. Eu encorajo você a fazer uma pausa ou apenas fazer a mesma coisa por conta própria para cores. Se tudo correu bem, então você deve ter uma pasta na sua página chamada cores. E todas as páginas crud. O que vou fazer é ir rapidamente para o layout e adicionar os itens novos o suficiente. Então, vou remover a privacidade porque realmente não estou usando essa privacidade vinculada. Então, temos carros, temos modelos mistos, temos cores. Claro que ele acabou de mudar o caminho para a raiz do índice de barra de nome desdobrado. Em outro desafio que eu daria a vocês é se vocês estiverem interessados em estender da mesma forma que fizemos a exclusão dos carros. Portanto, lembre-se na página de índice que fizemos todo o formulário de alerta e exclusão do conjunto no jQuery para preencher o formulário Excluir e o manipulador personalizado para a exclusão. Eu o encorajaria a tentar fazer isso com os outros. É aí que entra a prática em modelos de carros. Quando estou olhando para a lista de modelos de carros, se eu quisesse excluí-los? Bem, podemos colocar jQuery e tudo e colocá-lo em manipulador personalizado. E você não precisaria da página Excluir. Estou encorajando você a experimentá-lo sozinho. Fizemos isso uma vez, revisamos como o fizemos e aplicamos o conhecimento porque é assim que você melhora como desenvolvedor. Vamos testar o devido ou a aplicação. Vamos para modelos e estou clicando em modelos e nada está acontecendo. E isso ocorre por causa do nome da pasta errado no layout. Então meu mau Shun, atualize. Tente novamente. Se eu for para modelos lá estamos. Agora estamos nos modelos de carros para isso, fui adicionar um novo modelo e isso seria uma Sony para a Nissan. Agora, note que o criou. Não quero que o usuário me diga quando foi criado. Isso é algo que deve ser automático, que eu quero que isso aconteça em segundo plano. Eu não quero que isso não deva estar na tela para o usuário ver e ferramenta que precisa estar acontecendo em segundo plano. Portanto, tenha isso em mente mais tarde, quando começarmos a olhar para os modelos. Porque quando estamos usando os modelos de dados, essa é uma das limitações que precisávamos para o banco de dados ou não o queremos para a interface do usuário. Há momentos em que teríamos que criar uma separação entre o que mostramos ao usuário e o que realmente armazenamos. Essa é uma dessas situações. Não queremos mostrar ao usuário esse campo, mas precisamos armazená-lo em qualquer lugar. Vou continuar vendo o modelo é Sony. Vá em frente e crie um ISI notes intermediário criado é necessário. Por que isso é necessário? Porque não colocamos a necessidade deles sobre isso. No entanto, o tipo de dados que ele usa é o tempo, que, assim como o int, fornece um requisito automático. Só estou mostrando que você detém a dinâmica de todas essas coisas quando colocamos as coisas. Se necessário, para considerar o quadro completo ainda, ou quando encontramos esses tipos de problemas, como podemos trabalhar com os nossos próprios, eles são mais para entender para trabalhar com eles próprios. É por isso que eu requeri data criada desculpe, está sendo teimoso e nos dizendo que o calor é necessário, então tudo bem por enquanto. Só para ir além desta casa , basta colocar uma data de criação. E lá vamos nós. Então, podemos adicionar algumas coisas. Spider, que é a Ferrari, acabou de fazer isso hoje Criar. E temos a Toyota. Harrier foi o primeiro em nosso sistema. Que outro? Desculpe, não me lembro qual é a mistura que temos, então deixe-me olhar para a mistura. Temos Nisan. Eu apaguei os extras, então temos pelo menos um a 2171 Ferrari. Isso é bom. Em nossos modelos. Nós temos esses. Não, preciso de algumas cores e vou manter isso simples. Só vou dizer preto e azul. E azul. Quando vou criar um carro, carros e digo Criar novo. Eu recebo a lista suspensa para mim. Eu pego o modelo do carro. Mas estou vendo todos eles. Eu poderia facilmente dizer Toyota spider. Então vemos o identificador de chamadas, preto e azul, o ano, digamos 2020. E o número da placa, como eu disse, no meu país, pode ser alfanumérico, então pode ser 1234 AB. Esse é o formato geral que criamos. Pelo menos vemos que ele foi criado, mas não estamos vendo modelo, não estamos vendo cores. Onde estamos vendo cores modernas? Foto um que acabamos de criar. Não estamos vendo isso pelo mesmo motivo. Não vimos o microfone inicialmente porque em nossa consulta quando estamos recebendo pelo índice, então deixe-me pular para o índice para os carros nessa consulta. Temos que incluir. Então, tenho que me certificar de que digo incluir. O que estou fazendo é apenas quebrar linhas para que eu possa controlar D sobre isso e conhecer minha vida muito mais fácil. Trabalhando de forma mais inteligente, não mais difícil. Quando chegar, os carros incluem o microfone, o modelo do carro, a cor e, em seguida, a versão mais recente do Visual Studio Code, aplique alterações de código. Vá em frente e clique em atualizar, e estamos vendo pelo menos com retorno de cor. Então, vamos depurar e ver por que não estamos vendo o modelo. Então eu fiz todos os Includes. Você pode ir em frente e reiniciar se você já estiver executando no modo de depuração, coloquei um ponto de interrupção aqui que, quando os dados forem carregados, ele pause e me permita entrar e interrogar cinco carros. Quando o carro que acabei de adicionar tem que fazer ID, mas não tem um ID de modelo de carro. Isso significa que algo deu errado com o formulário entre o formulário que está sendo enviado e ele chegar aqui, algo deu errado. Tudo bem. Então, vamos até Criar e ver o que pode estar faltando. Então esse é o problema. Uau. Copie o NPS. Embora seja bom. Apenas tenha muito cuidado. Eu ainda estava vinculando-a ao campo errado, então deve ser microfone. Eu salvo isso, atualizo ou aplique alterações de código. Vamos tentar isso novamente. Vá em frente e carregue o formulário Criar. Chegamos ao bloco de aranha 1990. E vou reutilizar o número dividido da lição. Remova esses pontos de interrupção. Então, ele só vai em frente e carrega e lá vamos nós. Está chegando botão ou a ligação está acontecendo como esperamos. Isso é bom. Isso é maravilhoso. As batalhas lutaram. Se formos a Editar em nenhum lugar vendo tudo o que tínhamos Putin. Se eu mudar isso de preto para azul e da Toyota para contratar porque eles percebem, oh, eu cometi um grave erro e clico em Salvar. Então vemos, estamos de volta à estaca zero. Estamos prestes a estocar um porque atualizei a criação e uso o mesmo código aqui na atualização. A atualização ainda tem esse erro. Testes de regressão sempre importantes sempre que você introduz alterações em seu sistema, volte e certifique-se de que costumava funcionar siderúrgicas. Então deixe-me tentar isso de novo. Salve e lá vamos nós. Não, a edição está funcionando, cria esses recursos funcionando, todos esses recursos funcionam. As necessidades de funcionar? Vamos verificar. Tudo bem, então tudo funciona da forma como levantamos. É o próximo grande item de ticket que, quando criamos, queremos ter certeza de que apenas o respectivo modelo relativo ao microfone existe. Isso significa que quando crio um modelo, preciso informá-lo a que faz ele pertence. E então ferramenta quando seleciono um microfone ao criar o carro, preciso ter certeza de que estou carregando apenas os modelos relacionados a todos. Tudo bem, então isso é muito importante, isto é, foi muito importante. Eles se destacaram na reunião. Então, vamos ver como podemos fazer isso. Então, a primeira coisa que precisamos fazer é introduzir um ID de microfone. Então, precisamos criar uma relação entre o modelo e o microfone e pensar nisso conceitualmente. Porque, quero dizer, se você tem um carro e sabe que você tem certas marcas fora dos carros dessa vez, certos modelos. Esse é o nosso relacionamento. Então, se você fosse fazer uma pausa de palavras cruzadas, Laura, uma daquelas atividades de correspondência de palavras cruzadas onde as marcas na cabeça, nos modelos do outro lado e deveria corresponder às que se relacionam com as que se relacionam um para o outro. Será o mesmo conceito uma chave estrangeira quando você desenhar essa linha entre Toyota e Harrier ou Nissan e Sony, que está usando que eles estão relacionados. Então essa relação é vista como uma chave estrangeira, que é o que temos feito até agora com o carro. Deixe-nos. Saia do modo de teste e volte para o modo de extensão, entre no modelo do carro. Fui apresentar uma chave estrangeira. Já tenho esse tipo de chave estrangeira aqui em marca, identificação e carro. Então eu só estou copiando isso, pulando para o modelo de carro. E depois fui apresentá-lo. Agora eu tenho esse campo para informá-lo que ele deve estar relacionado a um microfone. Da mesma forma. Por causa desse relacionamento, posso ir até o MIC e informá-lo que ele tem uma lista de modelos de carros e ver como isso funciona. Então, com isso feito, tenho certeza que você adivinhou, precisamos de uma nova migração. Então adicione migração, relacionamento de modelo, essa é minha mensagem. Em seguida, obtemos o arquivo de migração, que não está fazendo nada divertido. Então, já sabemos que podemos olhar para ele. Só sabemos que tudo bem, está fazendo a coisa certa. Podemos atualizar o banco de dados e, quando isso for feito, podemos nos mover na multidão para nossos modelos, modelos de carros. Precisamos estender a criação de Peytchev, uma lista suspensa para a mistura. E precisamos e também do Editar, desculpe. Então eu já tenho esse tipo de código. Mais uma vez, trabalhe de forma mais inteligente, não mais difícil. Então, vou pegar este grupo de formulários. Vou pular sobre os modelos de carros e, na verdade, vou remover a data de criação. Então, você pode simplesmente remover o campo. Você não quer sentir isso na página, você a remove. Aqui. A ligação seria modelo CAR dot make ID foram retirados da mistura. Isso não parece existir, mas tudo bem. Fui copiar isso também. Vá até a guia de edição. Não quero que a data seja criada. Preciso manter a porta de identificação. Lembre-se, mantenha sempre o oculto. Mas eu não quero isso sexual e só queria fazer parte do ID. Tudo bem, então vou ter esses dados iniciais de carga para que a consulta inicial que executamos quando tivemos que preencher os dados da página. Então, vou pular para modelos de carros. Fui usar o método, fui remover o excesso. Não preciso desses dois. Só preciso de microfones. Então fui criar essa propriedade. Tudo bem. E, em seguida, inclua qualquer referência ausente. Então aqui vou apenas fazer meu senhor, chamada inicial de dados. E farei a mesma coisa antes de retornar a página. E isso está tudo na criação de uma pia, algum tipo de excesso de velocidade por isso porque isso é coisa que acabamos de fazer e eu estou realmente apenas copiando e colando o código que já passamos detalhe. Portanto, não estamos fazendo nada de especial neste momento. É a mesma coisa. Estamos apenas reutilizando o código que escrevemos e sabemos os conceitos de se fizermos isso para a consulta, temos que fazer isso também para a edição, que é Intindo que ele vai colocá-lo aqui, sangrou e gerará esta nova propriedade. E então fazemos nossa chamada, nossa carga de peso, os dados iniciais. Fizemos essa chamada aqui também nos portões antes de devolvermos o pH que terminamos. Terminamos de facilitar o make ID para nossos modelos. Então deixe-me correr, saltar para nossos modelos criar. E você verá aqui que estamos recebendo a lista do microfone. Temos o modelo teórico de capacidade, alguém para dizer Sony. E você está relacionado com a Nissan. Não quero criar esse. Tudo bem. Então, na verdade, vou excluir todos os anteriores. Portanto, ele não clica no meio deles, abra-os em novas guias, exclua. Então eu ainda não ampliei essas coisas, a funcionalidade do lead ainda. Mas isso não é problema. Ainda funciona. Então, exclua. Tudo bem. Oh, eu pensei que eles vão funcionar bem, eles não estão no deletamento conflito com algo e o marido acabou. E acho que isso é só porque estou excluindo algo que não deveria estar bem. Excluído. Esse erro de exclusão é realmente porque criamos um carro que tem um relacionamento com essa cerveja que está na minha. Então deixe-me apontar isso da migração. Como eu disse, sempre que vemos flechas, não estou patinando políticas de rodapé flechas porque há momentos em que você aprenderá os conceitos sem ver nenhum Arizona quando você pegar o Arizona e muito a faça isso, é bom ver o Arizona entendê-los. Quando criamos as migrações, a maioria, se não todas as chaves estrangeiras que foram adicionadas, foram adicionadas com o indevidamente está se referindo a realmente restringir. Se você não estiver tão familiarizado com bancos de dados. O que acontece é que você tem a ação referencial que permite que você diga, quando eu excluo o registro pai, o que significa que você já exclui um carro. Eu não precisava de modelo de carro. Em seguida, exclua todos os carros que têm essa associação. Se eu fosse excluir uma cor, digamos que eu exclua esse preto e adicione 50 carros no banco de dados como preto. Se você quisesse. Quando eu excluo preto, ele excluiria todos os 50 carros como bloco, então você veria uma cascata. Ação em cascata significa excluir tudo relacionado a esse registro. O que nossas migrações nos dão restringir, é por isso que estamos recebendo essa seta porque está dizendo que você não deve carregar a ferramenta, remover um registro que tem 200 registros. Então, algo está contando com esse registro. Então eu saberei que está confiando no Harrier necessário que não possamos excluir Harrier até que eu exclua todos os carros que são operadoras. Então o Dr. Glenn exclui todos os registros reais do carro que são contratados, depois retorno e densidade. Sim, eu queria fazer o pneu. Isso é basicamente o que isso está dizendo. É um erro, mas não é realmente, realmente, um erro. Tudo bem. Vou apenas ir em frente e adicionar novos. Percebo que porque tirei a data de criação, é padrão para uma escritura. Portanto, não está me dizendo que é necessário porque não está nesta tela pensar que é necessário, mas quando nada é fornecido através dela, ele obterá um valor padrão assim, assim como dentro de T, se nada for fornecido, ele será padrão para 0. Isso seria aranha. E a aranha é realmente relativa à Ferrari. E o outro que tínhamos, vamos adicionar outra barreira. E este é a Toyota ou deixe-me usar outro. Deixe-me usar lexoffice ou supra. Lá vamos nós. Então, supra Toyota criar, temos pelo menos três registros que estão diretamente relacionados ao mix. Um que ainda é tipo de status livre. Então, quando vou a carros e vou criar, a expectativa é que eu não deveria estar vendo tudo na lista suspensa assim. Se eu clicar em Toyota, eu só deveria ver que a Toyota se relacionou se eu clicar na Ferrari pelo menos switches e propriedade sobre os modelos Ferrari, é o que o usuário espera. Obviamente, isso não está acontecendo agora, vamos implementar a lógica para atender a isso acontecer. 21. Adicione listas suspensas em cascata com JQuery - Parte 1: Tudo bem pessoal. Então, quando estávamos no ano passado, estávamos sentando nosso formulário e configurando nossas listas suspensas para cores de modelos mistos. Não. O próximo grande item de ticket é que eles querem que, quando selecionarem o microfone da lista, ele filtre automaticamente a lista de modelos para exibição. Vamos rever o que temos agora. Temos nosso formulário que tem todos os microfones listados em todos os modelos listados. Então, não quero rasgar um buraco. Eu mudo o microfone. Ainda estamos vendo todos os modelos. Tudo bem, então isso significa que quando eu escolho ao sol, ele só deve estar vendo ensolarado com base nos dados que estão no banco de dados agora, quando eu escolho ferocidade, essa lista deve reconfigurar e mostrar apenas aranha. Isso é o que precisamos implementar. E a ferramenta que vamos usar é JavaScript ou jQuery. Jquery tem esse recurso chamado conjuntos ajax daqueles que realmente fazem o que chamamos de chamadas assíncronas, disse o código do lado do servidor do lado do cliente. Em outras palavras, estaremos dentro da seção HTML estática do cavalo, mas estaremos atingindo o serviço ditos mitos, carregando a consulta, obtendo os dados e, em seguida, trazendo-os bucais com o declínio e disse tudo em tempo real, vamos começar essa festa indo até a nossa página Criar para os carros. E o que vamos fazer é substituir o valor de id para os modelos. Também vamos adicionar o valor de id para a mistura. Agora, uma explicação rápida. Lembre-se de que o traço ASP quatro é aquele auxiliar de tag que, quando a página for renderizada, nos dará o atributo name, bem como o atributo ID. Agora, quando você tem esse tipo de nome de cano duplo, como ponto de carro Meek ID. O ID em si vai sair como o carro sublinhado Meek ID. Eu não quero um ID tão complicado, então eu sempre posso substituí-lo pelo meu simples. Então, estou adicionando ID igual a mix à lista suspensa de mixagem. Id equivale a modelos aos modelos de luta. Em seguida, preciso adicionar algum JavaScript. Lembre-se de que o que queremos realizar que quando você alterar o valor do ID do microfone, vamos carregar ou alterar dinamicamente os valores disponíveis na lista suspensa do modelo. Vou começar em meus grupos de aplicação sexual com uma tag de script. Lembre-se de que é isso que esta seção é dedicada para me dizer que queria escrever JavaScript. Sempre crie essa seção. E então você coloca sua tag de script e, em seguida, você pode continuar. Vamos começar com nossos manipuladores de eventos. Então, estou atento a um evento de mudança de valor na lista suspensa mix. Vimos que podemos assistir a um evento de clique em um botão. Então, praticamente você pode assistir a qualquer tipo de evento em qualquer tipo de controle, o tipo de evento que você escolher usar, o ISR em relação a qualquer operação que você esteja realizando. Quero que, quando eu alterar o valor do ID aqui ou o valor do Meek ID, ele faça outra coisa. Estou vendo. Observe meu elemento com o osso ID Sumer não gostaria de um elemento por ID. Vemos uma hashtag, depois vemos a combinação de ID, vemos o quanto isso é mais fácil. Então o evento que estamos assistindo é um evento de mudança, vai assistir para ver quando o valor é alterado. E então especificamos que queremos executar essa função sempre que isso acontecer, função para obter o vermelho giratório. Como eu disse, uma cláusula ao ar livre de aposentadoria desde o início. E então não me esqueço. E então quebre algumas lentes e então podemos começar a escrever o código aqui. A primeira coisa que eu queria fazer neste evento é obter o valor. Ele mudou. Qual é o valor do nariz? Vou dizer que var make ID é igual a isso. Este objeto representa qualquer controle acionado pelo evento, esse valor de ponto. Então eu quero sentar os valores padrão dentro do modelo. Então, a mentira do código rígido que o que eu vou fazer é, na verdade apenas tirá-lo do select. Portanto, não sou difícil codificá-lo porque sempre vamos mudar os valores. O que eu quero que o HTML lá seja esse bit de texto padrão. Então eu vou dizer, me dê o elemento pelos modelos de identificação. Lembre-se, selecione modelos de ID, me dê esse elemento e defina o HTML nesse elemento para ser opção. Então isso ficará assustado, basta anexar o HTML, seja qual for o controle. Ele apenas adicionará o HTML, o que você colocar aqui com isso dentro das tags. Sempre que quisesse manipular o que está dentro de uma etiqueta, talvez eu tenha uma div vazia. Queremos colocar outro elemento lá na hora. Isso é exatamente o que estamos fazendo. Agora temos a lista vazia. Sim, está recebendo os itens dos modelos e eu poderia deixar ou remover isso porque na primeira carga eu não quero que ele tenha nenhum item removido que sempre que isso for alterado, então deve pelo menos sentar esse padrão. Tag Html. E então vamos ser a chamada do Ajax para ir e ajustar os valores do banco de dados e trazê-los de volta aqui. Então, para fazer isso, fui ver um ponto cifrão obter JSON. Portanto, este é um método jQuery que me permite chamar um URL. Eu ia colocar aspas vazias para o URL. Também me permite passar dados. Então, neste caso, preciso obter os modelos com base no ID do microfone, o nome do parâmetro. É que vou usar esse cólon de identificação do microfone. E o valor e a passagem dele é Meek ID. Portanto, esse é o nome do parâmetro. Esse é o valor que notei quando destaco isso, ele também destaca a variável. Esse é o valor de qualquer valor que veio do evento de mudança. Isso é o que estou passando para esse método. Então eu tenho uma vírgula, e então essa função basicamente diz, quando for bem-sucedida, farei isso. E é preciso, ou tem a capacidade de usar um parâmetro chamado, estou chamando-o de dados. Os dados aqui representariam o que voltasse da chamada do lado do servidor. Vou deixar essa concha de, de uma função aqui. Dentro desta área é onde vamos fazer com a magia de preencher a inclinação. Mas esse é o modelo básico. Portanto, temos um URL, qual deles colocando-o onde passando o valor make ID que será usado para filtrar a lista de modelos. Então, quando chegarmos, mas eles se auto-modelam, vamos implementar a ação nessa área. Fui fazer uma pausa aqui um pouco. E vou pular para o arquivo de código para essa criação. E o que precisamos colocar aqui é um método que realmente será chamado sempre que o evento de mudança ocorrer. Portanto, lembre-se de que o ajax nos permite fazer serviço. Eu tive chamadas do código do lado do cliente. Aqui. Vou colocar o que chamaremos de outro manipulador. Portanto, lembre-se de que esses métodos são chamados de manipuladores. E este será um resultado JSON. Public AsyncTask retornando o resultado JSON. E isso vai acontecer, em get. Então lembre-se que eu estava dizendo que você tem em get, que é uma palavra-chave no post, que é uma palavra-chave. Quando quisermos um 100 personalizado, vou dizer sobre o Git. E vamos chamar esses modelos, ou você pode até chamá-lo de um carro mobilizado se quiser ser explícito. Então, em obter modelos de carros, isso precisa de um número inteiro que seria Meek ID. Esse é o parâmetro que estamos vendo que vamos enviar. Precisamos receber esse valor dentro do parâmetro lá. Em seguida, esse método precisa retornar resultados JSON. Então, por que precisamos executar a consulta? E dois, precisamos atender para fazer alguns resultados. Podemos fazer isso em uma linha, farei isso em duas apenas para mostrar que os modelos VAR seriam iguais aos modelos de carros de ponto de contexto. E então é fácil dizer isso para listar. Então você vê que as duas listas assíncronas só retornarão cada coisa na lista, que é o que estamos fazendo aqui, mas isso não é necessariamente o que queremos. Queremos que ele seja filtrado. Então, preciso injetar o que chamaremos condição ou cláusula onde. Tenho que dizer ponto onde. Então colocamos nossa expressão do Lambda. Então q é meu token desta vez. E fui ver onde a coluna do MC ID corresponde ao valor que foi passado através do parâmetro. Depois de chegarmos a todos esses, direi que retorne novo resultado JSON com os dados dos módulos. O que isso fará é realmente pegar todos os objetos do banco de dados, os dados do armazenamento do banco de dados em vez de modelos. E então isso apenas retornará tudo isso na forma de pessoas chamadas JSON. Isso está reclamando porque preciso, vou esperar a chamada para esse método. Não, tenho uma ideia do caminho que preciso chamar para obter os dados de volta ao JavaScript, agora posso dizer getJSON, seu URL ou o caminho que você deve chamar. Seria carros de corte, slash create. Acho que parece familiar. Seus flashcards seriam que a barra da pasta de carros cria seria nosso arquivo Criar, mas nosso método Criar arquivo ou criar que tem o on Git e o post on também tem em get car models. E este é o nosso manipulador para essa situação. Então eu tenho que ver. Uma barra pessoal de barra Criar. Em seguida, passarei uma string de consulta na URL para ver o manipulador que você deve chamar na Criar página é igual aos modelos de carro. Observe a convenção de nomenclatura aqui. Chama-se On get. Essa é uma palavra-chave, essa é uma expressão-chave que as páginas do Razor estão procurando, mas o método em si é chamado de modelos de carros. Estou vendo que seu manipulador é modelo de carro, então não preciso colocar a guitarra, a parte OnPause. Só estou vendo modelos de carros chamados. Depois de fazer tudo isso, temos o URL definido e temos os dados, ou pelo menos o que precisa ser possível como um parâmetro que devemos obter. Mas esses dados, o que vou fazer é percorrer os dados e preencher a lista suspensa manualmente. A razão pela qual eu colocaria essa linha é que toda vez que eu faço realmente motor a lista suspensa mista, eu quero redefinir. Então, basta chamar essa linha vai esvaziar todo o HTML e ele vai ficar apenas o que eu coloquei aqui como HTML. Não, preciso me encaixar nos dados. Mas no resto do HTML, o ponto cifrão cada um é uma maneira que vou ver para cada um em JavaScript. E a coleção estaria vindo de mais variáveis aqui, dados. Portanto, os dados representarão o novo resultado JSON retornado. Para cada um. Basicamente, os objetos nos dados executam essa função onde eu recebo uma chave e vamos chamá-la de valor, chave e valor. E então abrimos e fechamos isso e ponto e vírgula. Então, não me esqueço. Então, neste método forEach, basicamente vou definir como deve ser uma opção. Então, a opção var é igual a e vou ver a opção cifrão. Então cifrão, opção de cinta aberta, opção de entranhas abertas, assim como a etiqueta. Então, queremos essa tag upsilon lá. Vou adicionar um atributo. Portanto, lembre-se de que um atributo que é muito essencial para uma opção suspensa seria o valor. Estou adicionando esse atributo e vou dizer que seu valor é o valor ponto d. Tudo bem? Porque lembre-se de que, quando isso retornar, a lista de modelos ou uma tabela nos devolverá o ID, cortesia da herança da entidade de domínio base também está dando o nome de vodka. Sim, é dado sobre Meek ID e lista de carros. Tudo bem, mas precisamos que eles realmente precisam do ID para o valor e o nome da tela. Posso inferir que o resultado JSON, que está apenas retornando resultados do mesmo para nós ou resultado de um monte de objetos da mesma classe que acabamos de ver. Ele definitivamente terá a seção de valor, um campo de ID. E então eu fui adicionar ponto txt ser o nome do valor para cada opção, para cada valor ou cada coisa que voltou através dos dados. Obtenha o valor. Em seguida, crie uma opção na qual você está colocando o valor como o atributo e o texto, que será o que estava entre o aberto e o fechamento. A seção que diz selecionar modelo, que leva a ser um nome válido. Depois de criar uma opção, a próxima coisa seria anexá-la. Vou ver modelos pontuarem, mas apenas acrescentar opção. Então, acrescentar conhecimento será adicionado ao final do que estiver lá dentro. Então, quando eu digo HTML de ponto, ele vai esvaziar Totalmente irá redefini-lo para qualquer valor que eu quiser aqui. Se eu quisesse em branco, poderia dizer que seu HTML não está em branco. Seu ísquio, não há adoção. No entanto, neste caso, não quero limpar os banheiros. Ele já está limpo com o padrão. Não, eu só queria acrescentar as outras opções, o padrão. Agora, com tudo isso feito, o que vou fazer é introduzir um pequeno método aqui que eu uso para depurar chamado console.log. Sempre que você está tentando fazer seu JavaScript ou jQuery e não tenho certeza se o que você está fazendo está funcionando ou quais valores estão sendo passados estão sendo definidos. Você sempre pode fazer um console.log que será impresso na área do console do seu navegador, mostrando o que você está imprimindo. Então eu fui fazer um registro de console para o Meek ID apenas para garantir que estamos recebendo pelo valor do carrinho sempre que houver uma alteração. E também farei o logon do console nos dados aqui quando a chamada JSON for bem-sucedida. Porque então você verá como JSON realmente se parece se você não estiver familiarizado. O que estou falando quando vejo Jason, vamos declarar até ser uma aldose para controlar F5 ou melhor, eu vou fazê-lo no modo de depuração, definir um ponto de interrupção aqui para que possamos ver exatamente quando esse método é chamado. Podemos ir em frente e entender melhor como o Ajax funciona. Tudo bem, então estamos na página millenia, veja aqui um, não há nada nesta lista suspensa porque um deles, removemos nossos itens ASB dele. Então itens ASP, então o microfone, mas para os modelos Não há itens ASP. Portanto, mesmo chamando o banco de dados em segundo plano e carregamos dados iniciais, não dissemos a ele de onde ele deveria estar obtendo seus reagentes de dentro. Também removemos a opção padrão dessa lista vinculada. Então, estamos recebendo uma lista suspensa em branco. Fazer é bom. Agora, quando clico em Toyota, veja o que acontece é saltar para o meu ponto de interrupção. Isso significa que a chamada Ajax está encontrando o manipulador com sucesso. Só vou pular para a última linha que possamos ver o que está nos modelos. Veja aqui, isto é, na verdade tem o único modelo Toyota que está no banco de dados. São todos os dados que estão retornando tudo no banco de dados. Então, poderíamos refinar isso um pouco mais porque realmente não precisamos de todas essas coisas. Nós realmente só precisamos do ID do microfone e do nome. Tudo bem, mas tudo bem. Vamos seguir em frente e continuar ou lamentar, só precisamos do ID e do joelho. Não precisamos nos arrepender se eu apenas apertar F5 e permitir que ele continue. Agora você verá esse texto padrão sendo carregado. Um inalterado. Ele seguiu em frente e definiu o HTML. E depois dois, fez a chamada Ajax, que depois recupera essas coisas. Então isso significa que eu vou ver supra saber quando falo sobre log do console, se você clicar com o botão direito do mouse, vá para Inspecionar elemento ou aquecer se 12 e clicar em Console, então você realmente verá o console. Mensagens que estão sendo impressas aqui. Este é um erro ao tentar carregar as coisas incríveis da fonte. Então isso é minúsculo neste momento, o que você vê aqui que o console está registrando as ideias do microfone. Primeiro, se eu mudar isso para Nissan, você vê que é Ferramenta. Se eu mudá-lo de volta para Toyota é cada um deles. Então, cada vez que fizemos a alteração, estamos registrando o console, podemos ver qual valor está sendo escolhido. Sob isso. Você notará que eu sou uma construção muito mais complexa e é assim que o JSON realmente se parece. Se eu expandir isso, é o que chamamos de objeto JSON. Json é JavaScript Object Notation, que é um padrão muito, muito popular para o transporte de dados pela web, http agora. Nesse caso, o que fez foi pegar todos os dados da classe e serializá-los em pares de chave-valor. Então, o nome do campo e o valor que o campo teríamos. É por isso que você vê o nome com um valor de Meek ID com o valor make, etc. Então, é o mesmo tipo de restrição que acabamos usar aqui quando estávamos fazendo a chamada, essa é essa. Observe a chave ou um parâmetro dois pontos. E o valor desde que estou usando uma variável, mas neste caso surgiu nos valores literais. Depois de obter esse objeto da chamada ajax, podemos saber apenas acessar os valores individuais ou os valores por suas chaves. É, é um objeto e também é como uma matriz. É uma matriz desses objetos JSON. Se eu tivesse vários, diga que sim no sistema. Então deixe-me ir lá e criar mais alguns modelos. Acabei de criar mais dois Toyota no sistema. Então olhe para o que acontece quando eu toco em você respondeu Nissan, mas estou mudando o dinheiro para a norma Toyota visto que existem três Toyota no sistema. Não fiz uma pausa nem nada literalmente, acabei de criá-los. Não há no banco de dados. Toda vez que atingir a necessidade de ocupar, ele recuperará os valores mais novos. E há objetos JSON. Então, estamos vendo cada um dos carros em sua própria representação JSON e sendo representados aqui na lista suspensa. Então é isso que chamaremos de lista suspensa em cascata. As pessoas que solicitaram esse recurso não sabiam que queriam uma lista suspensa em cascata. Eles certamente não apreciariam o nível de esforço que vai para criar tal construção. No entanto, como desenvolvedores, sempre teremos os requisitos e cabe a nós encontrar a melhor solução. Então, neste caso, jQuery foi a solução mais fácil para algo que, como eu disse, jQuery ou JavaScript. Isso não é algo que você sempre escreverá necessariamente, mas definitivamente é útil quando você tem certas situações que precisam de soluções rápidas e limpas. Apenas por meio de limpeza, o que vou fazer é apenas remover esses logs do console porque eles são realmente para fins de depuração. Você não quer deixá-los em seu código. Porque quando seu aplicativo se torna público ou o castor pode vê-lo e quiser obter informações privilegiadas ou informações potencialmente confidenciais em seu próprio navegador, console registra o seu site. Você não quer isso. Depois de depurar Daniel, consertá-lo e você sabe, ele funciona. Você sempre pode ir em frente e remover seu console.logs. É isso mesmo. Então, uma outra atividade de limpeza ou algumas atividades de limpeza, começando com o FID que eu realmente gostaria esses padrões estivessem lá o tempo todo. Então, o que eu faria também é replicar isso. E mesmo assim você poderia colocá-lo em um método. Mas o que vou fazer é colocar isso fora da nossa função de mudança de mistura. Isso significa que assim que a página for carregada, sempre estaremos nesta opção. Essa é uma opção. A outra opção é que acabamos de colocá-lo de volta quando a página for carregada. Só temos a opção padrão aqui que diz selecionar modelo. Mas é claro que não tem itens ASP, então está vazio. Essa é a única opção que estaria lá. De qualquer forma, quando você mudar, sempre esse valor antes acrescentar os valores provenientes do banco de dados. Não, fora disso, outra limpeza que eu gostaria está nos dados iniciais do Senhor. Não preciso ligar para os modelos. Se vou carregá-los dinamicamente, não preciso chamar essa consulta quando a página estiver sendo carregada. Portanto, essa é uma consulta de lista antecipadamente. E isso só vai levar a um tempo mais rápido. Fizemos tudo isso no Create. Vamos seguir em frente e conhecer as mesmas mudanças na atualização. E então é aqui que ele pode ficar um pouco complicado novamente. Vou repetir tudo isso? Então, agora, o que seria, estaríamos inclinados a fazer é apenas copiar isso, colocar em atualização e copiar isso, desculpe, esse método de resultado JSON e colocar em otimista. Eu concordaria que talvez esse método de resultados JSON precise ser duplicado. Certo, posso aceitar isso. Mas quando voltarmos, veremos a melhor maneira de realmente compartilhar o código entre as atualizações e a criação, modo que, se houver necessidade de manutenção, mais uma vez, há um ou muito poucos pontos de contato e, assim, reduzindo os esforços de manutenção a longo prazo. 22. Adicione listas suspensas em cascata com JQuery - parte 2: E estamos de volta. Então, nesta lição, o que vamos fazer é modificar nossa atualização para poder fazer a lista suspensa em cascata. E o que não queremos fazer é repetir todo esse código entre as duas visualizações porque vamos apenas sujar caminhão. Temos muito baixa a lista suspensa do modelo para repreencher cada vez o valor da lista própria do microfone é alterado. Isso é obtido na página Criar. E isso também precisa continuar na página de atualização porque é praticamente a mesma forma, a mesma coisa que o esperado. Agora, o pH da atualização tem um requisito adicional que, quando vemos que temos o microfone e esse valor já seria fornecido quando selecionamos um carro para atualizar ou editar, selecionaríamos um carro. O pH ou este formulário de atualização será carregado com todos os valores para o carro. Ele vai carregar com um valor para o microfone. Mas, por padrão, essa lista suspensa estará vazia. Então lembre-se de que estamos nos movendo, os itens terão que carregar dinamicamente. E também quero ter certeza de que ele está carregado com os, apenas os modelos. Esse é o nosso parente a qualquer microfone selecionado. Então, se isso fosse a Toyota, então eu só deveria estar vendo os valores da Toyota quando a página de edição for carregada. Então, essa é outra modificação que teremos que garantir que consideramos quando escrevermos nosso código para atender a esse script compartilhável. Em primeiro lugar, vamos ter que colocá-lo em seu próprio arquivo. E discutimos isso desde os primeiros dias, quando falamos sobre frio para mim, o JavaScript compartilhável em vários arquivos ou páginas, certo? Então, o mesmo conceito se aplica aqui. O que faremos é ir ao nosso dub, dub, dub root. Em nossa pasta JS, basta clicar com o botão direito do mouse. E eu vou, se eu tivesse um novo arquivo JS, então basta adicionar novo item. E, francamente, costumo escolher qualquer coisa aqui porque conheço a extensão do arquivo que é de uma só vez. Em vez de tentar encontrar exatamente o único. E você pode apenas pesquisar aqui e ver JavaScript. Então você obtém o arquivo JavaScript. Tudo bem. Mas, em última análise, o que você quer é algo com o ponto de extensão js. Vamos chamar esse script de modelos em cascata. Adivinhe brincadeira. Desculpe, deixe-me pegar o script de lista suspensa do meu modelo em cascata vermelho girando . Então, estou nomeando isso explicitamente porque quero que fique bem claro o que o arquivo de script terá. Script de lista suspensa do modelo em cascata. Pressione Enter e, em seguida, ele gerará esse arquivo para nós. Esta coluna final está vazia. Se você usá-los outro modelo, basta limpar tudo, alterar o mais longe. O mais importante é que ele tenha o ponto JS como uma extensão de arquivo. Saiba o que vou fazer é pegar tudo isso, revesti-lo, e então vou colá-lo dentro de nossos arquivos GIS. Então isso é simplesmente suficiente e eles sabem que temos o arquivo js. O que faremos em As páginas cria e atualização será substituir a tag de script pelo componente SRC. Ele apenas diz que o Script SRC é igual a uma inteligência que o ajudará a preenchê-lo. Você apenas controla especificamente não vê nenhum prompt. Lista suspensa do modelo em cascata de barra script.js. Você pode simplesmente copiar isso e certificar-se de colocá-lo em um lugar semelhante na página de atualização. Observe que, como a maioria dos modos, não estamos fazendo arte para Quito para a operação de atualização. Temos que garantir que o formulário de atualização pareça com o formulário de criação. Uma parte disso é garantir que os mesmos controles sejam, os controles correspondentes têm os mesmos valores de ID que são vistos no formulário de criação. Uma atualização garante que o mix tenha ID igual a mix. E certifique-se de que o modelo tenha ID igual a modelos. Acabei de fazer essas modificações. E então vamos voltar para o arquivo JS e depois continuar ou trabalhar. Agora algumas coisas a considerar. Um, sim, quando estamos criando, está tudo bem porque vimos isso funcionar. Tudo começa com os valores padrão. E então, quando mudarmos a mistura, espera-se que vá em frente e Fitch os novos valores. Ele conhece o caminho. Portanto, não precisamos alterar o buffer porque ele já existe na página Criar. As atualizações podem, na verdade, apenas chamar esse mesmo caminho em todas as solicitações de arquivo JSON ou outro. E isso deve ser bom. Não precisamos modificar nenhuma dessas coisas concretas. No entanto, temos que considerar que quando o formulário não estiver em branco, como no caso de uma atualização, haverá um ID de microfone presente antecipadamente. Com esse ID de criação, precisamos nos certificar de que preenchemos essa lista antecipadamente. podemos esperar que o evento de alteração em uma atualização tenha esses valores presentes. Ou seja, esses são dois fatores. Outro fator é que precisamos ter certeza de que o valor selecionado pelo usuário quando ele criou. O veículo é o valor que é apresentado. Então, enquanto estamos preenchendo todas as opções, como talvez tenhamos Toyota, temos quatro opções para a Toyota. Apenas um deles foi realmente selecionado. Temos que nos certificar de que esse é o que é visível para eles. Como vimos na página de atualização, a lista suspensa sempre mostrará o valor selecionado durante a criação. Portanto, temos que nos certificar de replicar esse tipo de lógica aqui com alguns ajustes. O que faremos um é tomar esta declaração de Meek ID. Vou colocá-lo acima do escopo do evento. O evento acontece aqui, não faz a função alterada. Essa função é o nosso evento. Não farei com que o ID seja global para esse byte. Então, ao fazer esta declaração na parte superior do arquivo sem chaves, é de propriedade dela ou qualquer coisa, porque nosso escopo é realmente aberto e fechado resumos de que a disfunção do evento está dentro do escopo deste evento de alteração porque o colchete abre aqui e fecha aqui e tudo dentro disso está dentro de seu escopo. Então, ao colocar esse antigo conjunto de, não há escopos possuindo essa variável. Todas as funções e todos os outros bits de código que escrevemos podem acessá-lo à vontade. Então está tudo bem. Agora que fizemos isso, o que precisamos fazer também é atender a esse reutilizável. Então, neste momento, ele está vinculado à confiança do evento de mudança. Não quero que ele seja chamado apenas quando houver um evento de mudança. Eu queria ser chamado automaticamente quando houver um evento de carregamento. Além disso, o que vou fazer é cortar isso. E por baixo do evento de mudança, vou fazer uma função personalizada, basta ler a função Lord. E vamos chamá-lo de Lord models. Só estou dando um nome. Você pode fazer o que ele estará fazendo por nós. E vamos apenas dizer Colar. Agora que isso está em um método, posso chamá-lo bem assim, então eu posso ver sempre que isso for alterado, quero carregar modelos antes de poder carregar modelos, no entanto, tenho que obter o novo valor do Meek ID. Então, estamos apenas ajustando aqui. Lembre-se de que esse objeto realmente se refere a qualquer coisa que desencadeou o evento. Agora, isso está fora dos eventos, então não pode ser isso enquanto estamos aqui. Então, vou copiar essa linha e ver quando esse evento é acionado, o valor desse controle que a acionou e, em seguida, tudo o resto pode fluir. Não há problema. No entanto, quando é global e está sendo declarado depois de dizer manualmente me dê o controle com o mix de ID e me consiga os valores. Então, estou apenas apontando aqueles com base em onde você está fazendo as mesmas linhas de código, a maneira como você acessá-lo teria que ser diferente. Quero dizer, poderíamos tê-lo acessado assim dentro do formulário mostrado, então isso não seria um problema. Só estou mostrando como você pode reutilizar a sintaxe de maneiras diferentes. Portanto, temos que acessá-lo pelo nome aqui, mas depois temos opções dentro do nosso evento click. Então, com essas modificações feitas, eu não sou Lindsay ir mais longe. Vou apenas ir e testar e garantir que a criação de siderúrgicas à medida que a levantamos. Testando o Create, vou mudar o Toyota e ainda estou vendo a Toyota surgir, da Ferrari. Então, tudo funciona no Create. Então, com esses pequenos ajustes, temos rotina e toda a funcionalidade que teríamos deixado na última vez. Sem problemas. Então, crie ainda funciona, limpou alguns dos meus registros, especialmente aqueles com nossos modelos financiados e assim por diante. Acabei de limpar o banco de dados dele, então é voltar para ele. Portanto, não, o objetivo seria que, quando clicarmos em Editar, vejamos a Ferrari chegando. Mas o que não estamos vendo nossos dois modelos ou o fato de ser aranha. Lembre-se do bloco de aranha Ferrari. Quando clicamos em Editar, vemos para RT, vemos preto, mas não estamos vendo aranha, não estamos vendo nenhum valor aqui. Então, precisamos que isso aconteça automaticamente. Claro, quando eu fizer o evento de mudança, isso acontecerá, mas não queremos ter que esperar a mudança de n para que isso aconteça. Vamos modificar o código de acordo. E o que faremos é chamar Lord modelos. Em partidas. Assim que o script for carregado, queremos carregar os modelos automaticamente em um, obter o ID de Meca. Portanto, é automaticamente quando a página de edição é carregada, esse script obterá o valor aqui. Em seguida, os modelos de carga diriam, vá em frente e conheça a política chamada JSON na ideia de Micaiah e obtendo as opções. Tudo bem, então deixe-me apenas à distância ver se isso fez a diferença. Acabamos de atualizar a página. E se você olhar, deixe-me atualizar novamente, construindo essas atualizações corretamente. Então eu estou apenas refrescante para o Ari está carregado e se você olhar, você verá aranha na lista. Existe. Da mesma forma para o Toyota, se eu clicar em editar enquanto ele diz modelo selecionado, ele terá todos eles na lista. Então, pelo menos essa parte está funcionando. Não, precisávamos ter certeza de que estamos selecionando o correto ao carregar a lista suspensa. Aqui está uma maneira legal de passarmos o valor que vem através da nossa vinculação e do lado do serviço para o nosso script do lado do cliente e , em seguida, usá-lo para informar nossa decisão. Nesta tag de script, podemos passar os parâmetros de valor aqui. Vou dizer que o ID do módulo é igual a. E, em seguida, na saída de aspas para adicionar sinal, modelo ponto carro ponto carro modelo modelo ID do modelo. Bem aqui. Estou apenas passando nosso parâmetro quando você chama esse script, atenda esse valor disponível para ele. E é assim que ele deve ser chamado. Bom e legal. Então, o sinal at mais uma vez, é usado como parte da sintaxe Razor sempre que você o vê, é assim que podemos acessar o C-Sharp. Você pode usar isso no sinal e se declarações aqui para soltar, seja lá o for, nós vimos vários lugares, mas é assim que podemos realmente usá-lo a nosso próprio favor. Queremos quaisquer valores lá e estamos misturando com a sintaxe JavaScript padrão. Conhecendo o arquivo JavaScript em si. O que posso fazer é dizer que o ID do modelo vd é igual ao documento é uma palavra-chave estática que representa esse documento no qual estou, ou o documento, ou seja, a página. O que sempre dizemos document.ready quando queremos inicializar nosso JavaScript ou jQuery, em vez disso, documentar o script atual do ponto e obter atributos. Portanto, os atributos representariam esse parâmetro. Estamos chamando isso pelo nome. Então, estamos vendo esse atributo e estamos armazenando qualquer valor possível com esse atributo dentro do ID do modelo. Então, abaixo da opção, fui introduzir uma instrução if que diz se o valor ponto ID. Portanto, lembre-se de que quando estamos recebendo todos os carros como dados ou da chamada JSON. Isso executa a consulta contra o Meek ID e , em seguida, retorna tudo na forma dos dados chamados esféricos. Em seguida, estamos iterando os dados e vendo me dar cada par de chave e valor. chave seria o nome e desvaloriza o que realmente queremos. Cria uma variável de opção que representa uma tag de opção HTML com o valor do atributo armazenado na ID do ponto do vale. E leva isso está apresentando o nome que veio com esse peer chave de valor. Então eu estou vendo se o ID da opção atual que você está criando, se a ideia do núcleo convidado que você está avaliando ou outra coisa é a ID do modelo. Em seguida, essa opção, adicione uma propriedade, dê a ela o nome selecionado e escolha. Portanto, prop, um ATTR ou atributo pode parecer muito semelhante. Eles fazem a mesma coisa, mas só estou mostrando maneiras diferentes escrever código semelhante. Aqui. Só estou dizendo opção essa propriedade, Adicionar selecionado verdadeiro. Então vamos em frente e o acrescentamos. Com essas alterações feitas. Vou salvar tudo e depois podemos voltar para a nossa edição e identificaremos, atualizaremos, atualizamos e funcionaremos assentos. Fui voltar para a lista Toyota Supra. Quando clico em Editar, super é carregado automaticamente, mesmo que a lista esteja cheia, supra é a selecionada. Se eu voltar para a nossa aranha está tão no, mostre-me aranha. Então foi Fichte todos os modelos do JavaScript e depois os avaliou e viu isso, aquele muito o que foi selecionado. Se eu fizer apenas um elemento de inspeção, você verá nessa opção, ele tem o valor comprado a propriedade foi definida para selecioná-la, então é por isso que ela flutuou para o topo. Tudo bem, então isso é basicamente tudo o que precisamos fazer para nossa lista suspensa em cascata funcione tanto para a criação quanto para a atualização em geral, esse é o conceito por trás, eu acho que sendo deixado cair em sua sempre que você estiver usando um sistema em que você seleciona uma opção e essa opção influencia o resto do formulário ou o resto das opções. Isso é tudo o que eles estão fazendo. Eles estão fazendo é assistir para ver. Você alterou o valor nesta lista suspensa? Éfeso carrega todos esses comandos. Esses comandos podem estar ocultando partes, ocultando elementos do formulário. No nosso caso, estamos reorganizando completamente os elementos de outra parte do formulário. Seja o que for que você precisa fazer. Está bem aqui na ponta dos dedos. Essas coisas estão lá, Canadá difícil de memorizar e se você não usar muito, você pode não necessariamente tê-lo em fogo rápido e rápido. Lembre-se toda vez que você precisa fazer algo que seja, mas a realidade é que, uma vez que você entenda o conceito de JavaScript inteiro, pode ajudá-lo a conhecer páginas da Web dinâmicas e segurar elas podem trazer para frutificar sua ideia ou uma visão para uma página ou um formulário ou o que quer que seja. Você só precisa ir lá e pesquisar HomeAway, fazer isso e dividi-lo em tarefas menores. Sim, foi uma grande tarefa. Pensar em tudo o que caiu nisso vai mudar os riscos disso. Mas poderíamos facilmente detalhar e dizer, ok, quais são os cenários que precisamos explicar? Quem eu tenho cone para esse cenário? Cenário número um, as opções devem estar disponíveis em todos os momentos. Para a edição. E quatro para criar, ambos dependem do mesmo código. Em vez de escrever esses dois lugares, eu apenas coloco em um método e chamo o método de dois lugares. Então, algo muda um furo de parafuso que vamos formular ou opções ou assim por diante, onde você só precisa encontrar o Chines, por favor. Então, essas são coisas que você apenas com prática e exposição, tornar-se-á natural e segunda natureza para você. 23. Corrigido exposições de rótulo de dados: Tudo bem, então estamos nos aproximando do final das partes básicas do aplicativo. Nós configuramos um bruto, fizemos algumas coisas legais em JavaScript. Não, é realmente apenas sobre embelezar o aplicativo. O primeiro embelezamento portátil desta aplicação para mim seria consertar os rótulos. Então, meio que nos esforçamos para garantir que esses rótulos estejam definidos corretamente na lista de carros. Mas então, se olharmos para modelos mistos, as cores serão feitas apenas mostrando o nome do microfone. E então, se você olhar para os outros estão vendo data criada, bem como nas cores. Então, eu provavelmente gostaria de corrigir isso, torná-lo espaçado e mais legível por humanos, ou apenas removê-lo porque eu não acho que os usuários realmente precisam saber neste momento quando ele foi criado. A data de criação é mais para uma auditoria do sistema do que para o consumo do usuário. Podemos passar e esconder alguns desses. Outra coisa que eu gostaria de priorizar seria nos fóruns para Alice criar carro. Estávamos vendo que estamos vendo fazer modelo do carro IID, identificador de chamadas. Agora lembre-se de que esses valores de ID são mais para esse sistema do que para o usuário. Então, o usuário virá aqui e se perguntará, o que isso faz ID, mas depois eles estão vendo nomes. Em vez disso, os rótulos devem ver cor mansa ou algo do modelo de carro. Em vez de Meek ID, esse número da placa, que para mim deveria ser um pouco mais legível por humanos. Eu acho que seria bom colocar alguma validação para garantir que dois veículos não obtenham o mesmo número dividido de licença. Acho que isso prejudica a qualidade dos dados. Tão pequenas coisas assim constituiriam a atividade de limpeza. Vamos começar com nossas interfaces para o modelo e a cor criada pela ação. Isso é simplesmente o suficiente. Podemos simplesmente pular para essas páginas são aquelas São páginas. Então, para o modelo, vou pular para a página de índice e apenas removerei a coluna que mostra a data de criação. Vou remover essas duas colunas. Vou fazer a mesma coisa para o índice de cores, removê-lo criado e removê-lo. Isso. Parece bom até agora para mim. Nesse ponto, essa atividade é boa e tudo para criar carros e atualizar ou quatro formulários para os carros onde tínhamos um ID de modelo. Você vê aqui que diz o rótulo Lear SP Sir, traço ESP para identificação do modelo de carro. Tudo bem, então já analisamos como podemos alterar o nome de exibição do índice para o qual é um nome de exibição. E dissemos que o nome é pollster show como o modelo da palavra em vez de seu nome padrão, nome. Isso é simplesmente o suficiente. Tudo o que temos que fazer é em todos os lugares que teríamos esse valor de ID. Só fazemos com que ele saiba que é suposto me ver. Aqui, quando estamos criando o modelo, teríamos a lista suspensa para o ID do microfone, mesmo princípio. Nós apenas damos a ele o microfone do nome de exibição, que a lista suspensa conheça o LC MC em vez disso. Então, se eu pular para o modelo, acabei de fazer uma trapaça e digo que essa é a atualização. O aplicativo. Estou rodando sem depuração. Mas quando vou a modelos e clico Criar novo, lá vamos nós. Não está dizendo fazer em vez de Meek ID. Então, vamos dar uma olhada nos carros não caracterizados , dizia identificação, ID modelo do carro e ID de cor. Então, o que eu quero fazer é ir até a classe de carro e sobre Meek ID, fui ver seu nome de exibição é igual ao MC. Para a cor, seu nome de exibição é igual à cor. Para o ID do modelo do carro, seu nome de exibição é modelo de carro. Então, quando eu salvo tudo isso e volto, ele vai atualizar automaticamente e você vê tudo agora, parece um pouco mais de número de placa legível por humanos . Vou dar a ele um nome de exibição. E esse nome de exibição vai dizer o número de espaço dividido no espaço da licença. Aqui. Se eu quisesse que fosse um pouco mais sofisticado do que apenas um ano, pude ver que seu nome de exibição foi fabricado aqui. Só estou mostrando que quando você vê essas boas interfaces limpas, isso é tudo o que eles estão fazendo em segundo plano. Dotnet torna tão fácil para você atender a essas mudanças em segundo plano e fazer com que ela seja fabricada aqui. Isso torna muito mais fácil para você ser consistente em toda interface do usuário com os rótulos e a aparência de tudo. Então, é realmente isso para essa atividade em particular. A próxima atividade importante para mim seria mudar os botões ou ter a consistência com nossos botões. Então, passamos por essa grande revisão com cartões onde configuramos esses belos botões de aparência limpa para criar, novo, para a edição, para o nosso Criar ou uma lista de dinheiro para a página de edição, salvar ou um dinheiro para listar os detalhes, idiotas ou um dinheiro para listar, temos todos esses. Mas, em seguida, introduzimos outras páginas que nos levarão de volta ao material padrão. E se quiséssemos realmente mudar, manter esse visual, ou melhor, é fácil mudar ou eles parecem porque fizemos isso. Vemos segurar para mudar a aparência deles. Mas o que precisamos fazer é garantir que todos sejam consistentes. A consistência é fundamental. No web design. Você quer garantir que todas as suas páginas tenham esse tema comum por trás delas. O que vamos fazer é olhar para o fim de semana inteiro esses botões e colocar em fóruns mais reutilizáveis. Porque se eu tivesse o que eu tenho 1234 lugares diferentes com o botão Criar. Então eu tenho um botão Criar na lista de carros, um para estar na lista de modelos e cores mistos. Mas e se eu quisesse mudar o design geral de um sinal de mais para outra coisa ou algo ou no botão, eu teria quatro lugares diferentes para atender a essa mudança. Quando voltarmos, veremos como podemos abstrair que é Alt e usar temperado ganho em todas as páginas. 24. Limpa a interface do usuário: A última vez que estivemos aqui, estávamos tratando nossos rótulos em nenhum lugar voltando para limpar todos os quatro botões e o layout geral de todos os nossos pH, as listas e como tudo flui. Estamos falando de ter um modelo geral para seções de furo ou botão. Olhe. Nesta lição, veremos o que temos parciais. Parcial é exatamente o que o nome sugere. É como uma parte de uma página. Já estamos usando parciais porque nossas visualizações, essas PFAS de visualização são tecnicamente parciais porque é apenas parte de tudo o que é necessário para uma página HTML. E então o que estamos fazendo é aleatoriamente ou não aleatoriamente, desculpe, renderizando-os dinamicamente dentro da seção específica do pH geral que queremos. Então esta é a nossa página principal e é aqui que definimos todos os estilos globais e tudo bem. Mas, em seguida, estamos renderizando os parciais com base em onde estamos navegando, mostramos o parcial para fazer com que pareça com a mudança. As páginas estão realmente mudando quando tudo o que realmente estamos fazendo é mudar a seção dentro do corpo da renderização. Agora podemos trazer esses conceitos não um pouco mais para a página real. E é isso que vamos fazer para obter os botões de índice. Neste momento, estudei completamente os botões de índice para a página de índice de carros. É fácil o suficiente copiar. Pule para modelos de carros, vá para o índice e substituiu os botões aqui. Isso é fácil o suficiente. Então, mais uma vez, é fácil fazer isso para todas as outras páginas. Porque realmente e verdadeiramente os botões precisam ser parecidos e nosso roteamento é bastante consistente, exceto o fato de que usamos o andaime padrão aqui para a edição para os modelos de carros e tudo else sobre onde altere isso para atualizar para a edição para os carrinhos. Na verdade, vou desfazer isso. Foi apenas trazer para casa o ponto em que você poderia mudá-los. Renomear um arquivo é bem simples. Vou ter que dizer que foi renomeado o arquivo superior, o arquivo de código também será renomeado. Mas outra consequência disso é que eu gosto de manter consistente com o nome do modelo em algum lugar para mudar isso do modelo opiáceo para editar o modelo e usar o ponto de controle e eu renomeei refatoração através e através. E, em seguida, qualquer caminho que levaria à atualização de que HTML CSS precisa levar ao cabeçalho. Por padrão, teria. Só estava dizendo isso para dizer que se vamos ser consistentes, precisamos ser consistentes. Você não pode nomear um, como Índia, China e outro é mudança e assim por diante. Isso torna mais difícil para você ser consistente com seu código. Vamos mudar os botões para todos os índices. Mas, mais uma vez, não quero copiar e colar o código. O que vamos fazer é na pasta compartilhada. Compartilhado o propósito do Sheard é que os diferentes parciais estejam acessíveis em todo o aplicativo. Na pasta compartilhada. Vamos apenas ir em frente e adicionar, vou dizer novo item. E a partir da escuta escolheria a vista da navalha. Se você observar a diferença entre matrizes de árvores B de visualização, a extensão é a mesma dentro da descrição, diz que há uma página vem com modelos de página. Então, o que estamos usando para conhecer o IRI. Então, páginas onde chegamos ao CSS HTML e ao CSS HTML. No entanto, o aumento da visão só virá com o HTML CSS e tudo bem. O que vou chamar isso parcial é parte de índice sublinhado , desculpe, botões de índice. Ao nomear o líder da convenção com o sublinhado. A consistência é fundamental. Botões de índice sublinhado. E só assim é muito claro, este é um índice parcial de títulos, z parcial de duas tripulações, o principal sublinhado e os fins financeiros da palavra parcial. Então, podemos ir em frente e adicionar isso. Quando temos esse aumento de visão, precisamos especificar um modelo. O modelo basicamente representa qualquer tipo de dados ou dados que governará o tipo de dados que está acessível nessa parcial. Em nossa facilidade regular de uso teria modelo no modelo San. E você veria que eles estão usando alguns tipos de classe complexos. E é por isso que podemos fazer coisas maravilhosas acessando dados e manipulando-os. No entanto, tudo o que queremos no pH são os botões de índice. E todos os botões de índice realmente precisam que contariam como dados dinâmicos, seria o valor de id que cada página teria nossa necessidade de gerar para cada item. Então, tudo o que vou fazer é dizer, dizer modelo. E estou fazendo dele um número inteiro porque estamos esperando um valor inteiro como o valor id. Os botões ou o código que vou usar para os botões virão do carro porque esses são os botões que já projetamos bem. Vou apenas ir até aqui, copiá-los. E eu estava vendo que tudo precisa ser consistente. Então, alteramos a edição, atualizamos para editar o link, e nós nos certificamos de alterar o nome da página também para que ele não seja mais atualizado, não é editar que todos compartilhem o mesmo arquivos básicos ou nomes de arquivos praticamente em toda a linha. Alguém para copiar isso, coloque-o em vez do parcial. Então você vai começar a ver linhas vermelhas aparecendo onde item.name DID era porque eu estava vendo bem, não vejo nenhum item ou qualquer variável ou objeto no item nomeado Pease. Não sei o que, mas lembre-se de que nosso modelo é o número inteiro que está basicamente representando o ID delta do item. Então eu posso apenas dizer no modelo de sinal, porque o modelo vai ser apenas um número inteiro. Isso estava perto de mostrar que sempre que precisar de dados em sua página ou parcial, você só precisa defender um modelo e usar seus tipos de dados a seu favor. Modelo e modelo. Edite detalhes, exclua. Todos eles estão em nossa parte na página que gostaríamos. E eu fui testá-lo no discurso do carro primeiro, onde queremos incluir o parcial, você tem que dizer no sinal porque temos que ler algum C-sharp e vamos esperar ou ajudante HTML. E temos uma pia parcial. Então, sempre que estamos usando um assíncrono, temos que preceder com um peso. Então esse método usa dois parâmetros ou tem várias sobrecargas que estamos usando na sobrecarga que vai tirar o nome do parcial, que é os botões de índice parciais. Então também vamos dar a ele o modelo. O modelo é genérico. E pode ser qualquer coisa. Não está fazendo as suposições que o modelo tem que ser qualquer coisa. Estou dizendo qual é o valor que eu quero passar. E ele descobrirá quando chegar à parcial real que tudo bem, o valor fornecido é o tipo de modelo que está esperando. Se eu disser Interior e eu fornecemos uma string, ela não será carregada se eu disser tipo de valor de dados Juan e eles fornecerem outro valor de dados. Então, se eu quiser, se eu disser que o modo é o tipo de dados, mas forneça um valor de um tipo de dados diferente. Isso não funcionará. Isso é apenas deixar você saber é muito genérico, mas rigoroso o suficiente para saber que o que você me deu não é o que eu estava esperando. Fizemos essa modificação na velocidade do carro. Se eu controlar o F5 e olhar para ele, estou recebendo 500 erros, então estou recebendo exceção não convidada e, você sabe, não me esquivo das setas. Quero que vejamos qual é o erro. Nessa situação, estamos recebendo algumas informações sobre onde ele procurará um int, para um parcial. Então, esses são lugares legais que você pode colocar um parcial de tal forma que, quando você vê que este é o nome parcial, ele o procurará nesses lugares. Ele está olhando em páginas barra de carros barra botão índice parcial. Não, não é. Bordas de terapia barra páginas barra compartilhada lá e as visualizações barra compartilhada cortam o nome. Sabemos com certeza que o colocamos em páginas slash índice compartilhado, parcial. Mas então eu disse no botão In parcial no código, quando chamo os botões, Esse é o meu erro ortográfico ali mesmo. Apenas vá em frente e modifique isso, salve e depois volte e atualize. E em nenhum lugar vendo dois conjuntos de botões. Portanto, nosso código está funcionando ou parcial está funcionando. Então, agora vamos provar ainda mais para que a parcial funcionará. Então, para modelos mistos e para as cores, vou pegar essa linha de código, uma linha de código. Vou colocá-lo em todos os outros índices. Então, se já está em carros, deixe-me colocá-lo no índice Para quatro modelos, um pouco de madeira para colocá-lo no índice, quatro cores. Vou colocá-lo no índice para mim. Então, quando eu salvar e controlar, atualizar cada um deles, você começará a ver esses links aparecerem. Qualquer coisa que não seja refrescante, ele é porque eu não salvei. Então, deixe-me voltar. Veja botões nodais aqui em cima, botões nodais aqui em cima. Então você vê com um esforço mínimo, nós cortamos esses botões. Deixe-me ver se eles ainda funcionam. Se eu clicar em Editar, ele navegará até a página de edição. Se eu clicar em Detalhes, ele navegará em detalhes. Sp, ele fará isso para todos eles porque mais uma vez, consistência é fundamental para a navegação. As propriedades são as mesmas em todos os lugares. Todos eles estão procurando o ADA, mesma construção ou valores. Mas, em seguida, em relação ao mecanismo de roteamento interno à pasta para um modelo de carro e para carros e para cada um dos outros. Ele sabe para onde ir quando é clicado. Mas é um código de linha de base. O que posso fazer agora é remover os padrão. Eu só vou passar por cada um dos índices e você verá um monte de mais limpos esse visual, estamos reduzindo três linhas de código repetido. E no caso das cartas, ainda mais pistas. E vou remover essa linha comentada. E isso parece muito melhor. Saiba que todos estão na mesma página com os botões. Saiba mais cedo que eu teria dito, são encorajados quando estamos fazendo a outra ferramenta bruta, tente replicar toda a funcionalidade de exclusão e o botão de exclusão com o clique no formulário e tudo em todas as outras páginas. Sabe se quiséssemos compartilhar esse pedaço de código nas páginas, o que teríamos que fazer? Bem, não podemos realmente compartilhar o formulário. Eu não recomendaria tentar cortar o formulário. E definitivamente não podemos compartilhar o manipulador, mas podemos compartilhar o script. Então, vou criar um novo arquivo JS. Novos itens, desculpe e procure JavaScript. E esse novo arquivo JavaScript será script de botão de exclusão de índice. Então podemos colocar o, deixe-me voltar para o código aqui. Toda essa função, vou cortar isso, colocá-lo dentro do script do botão de exclusão de índice. Neste ponto, na verdade, temos algumas oportunidades disponíveis para nós porque eu não disse que compartilhamos um formulário, mas deixe-me avaliar, deixe-me fechar tudo o que não é necessariamente necessário para isso ponto. No formulário, estou sendo muito específico quando digo que o nome é ID do carro. Não é necessariamente o ID do carro. Eu poderia chamá-lo facilmente de ID de registro. A ideia de registro neste momento é um nome muito mais genérico do que apenas carro. Em vez de olhar para a frente, apenas o carro IBM procurou um ID de registro. E vou dizer Sit the record ID para ser igual a quaisquer IDs de dados no botão. Então lembre-se de que todos estão usando o mesmo modelo de um botão. Assim que eles clicarem no botão, ele terá esse ID. Podemos usar o mesmo formulário, sentar isso em um fim de semana, basta enviar esse formulário de exclusão. Agora posso criar outra parcial. Você vê, então deixe-me, antes de criar essa parcial, Deixe-me ver SRC é igual ao botão de índice de barra G Delete dot js. Apenas certificando-se de que temos isso. Este formulário pode realmente entrar em um parcial porque estou colocando-o em uma parcial porque não quero copiar este formulário em todas as páginas e se algo mudar com o formulário, temos que fazer tudo mais uma vez. Então, é melhor colocá-lo em um parcial e pesado para um lugar neste ano e eu fui ter outra visão de barbear. Então, vá adicionar nova visualização de barbear. Assim que eu vejo. Lá vamos nós. E no formulário de exclusão de pontuação ou índice, exclua formulário, parcial, soma, nomeando-o bem o suficiente para que eu possa ver o nome mais tarde e figura, oh sim, é para isso que servia. Essa parcial não precisa usar nenhum conjunto de dados. Nem preciso dar um modelo a ele. Sempre vai ter esse formulário de exclusão que está procurando por um manipulador em qualquer página em que ele esteja chamado delete está passando por cima de algum registro nomeado. Chame um ID de registro ou uma variável nomeada chamada ID de registro. Isso é tudo isso parcial é quatro. Na página de índice, tenho outra maneira de incluir parciais, o que é uma maneira muito mais simples de dizer que nome parcial é igual e o nome da parcial em mãos. Em vez de digitar, ele verifica o erro alternativo. Acabei de clicar nele, pressione F2 para renomear copiar o nome e colar que ele está funcionando de forma mais inteligente, não mais difícil. Então eu posso pegar este bloco. E enquanto estiver na página de índice de carros, posso colocá-lo em todas as outras páginas de índice. Usabilidade trimestral. Então agora o antebraço está aqui e o script está observando o botão de exclusão de nossos botões. Então eu posso simplesmente ir em frente e colocar isso em todas as páginas de índice. Tudo bem. Estamos nos aproximando lá estavam chegando. Mais uma vez, estamos promovendo código, reusabilidade e modelagem. Queremos colocar em todo esse esforço antecipadamente. Você pode demorar muito tempo, mas a longo prazo é por uma boa causa. Saiba que temos o Excluir Fórum e todos estão vendo o ID do registro. Deixe-me ir para o código atrás de carros, já que foi aqui que tudo começou e depois fomos ao controle e o motor colapsa tudo. E então temos nossa exclusão sem pausa usando IDs de carro. Em vez disso, fui ver um ID de registro porque lembre-se disso que o nome vai se vincular. Estou apenas pegando ID de registro e vou renomear refatoração em todo o método. E este está procurando o carro e então ele vai tentar removê-lo e redirecionar para a fama do pH. Eu posso pegar esse método e esse método ES, nós adoramos. Você repete esse método por completo. Teoricamente, poderíamos criar uma página de resultados que tenha todos esses métodos genéricos e recordá-los. Então, como mesmo com os carros para obter o resultado JSON, em vez de ter que repeti-lo na criação e atualização, eu poderia colocá-lo em um manipulador genérico que nós apenas nos certificamos de chamar esse caminho de todos os lugares. Mas tudo bem. Você sabe, embora pareça uma boa ideia e pareça lógico, pode haver limites para o quanto você quer fazer tudo o que você é utilizável engenharia. E às vezes seu contexto determinará se você precisa ir tão longe. Nada neste contexto, não vou tão longe com esse método específico. Em vez disso, vou permitir que cada página de índice mantenha sua própria implementação das exclusões porque diferentes páginas ou registros diferentes podem ter requisitos diferentes para nossa exclusão, certo? Então, como por exemplo, modelos, se eu fosse excluir um modelo, provavelmente teria que Elite todos os cartões relacionados ao modelo antes de poder excluí-los modelo. A lógica dentro disso pode ser um pouco diferente. Nessa situação, a exclusão aqui precisa olhar para modelos do carro e excluir os modelos do carro. Então, qualquer coisa que esteja no carro, vou renomear o modelo do carro. Isso é implementação. Essa exclusão está presente na página de modelos de carros onde quer que já esteja nos carros. Então, nas cores, é o mesmo princípio, apenas adicionamos isso e o ID do registro permanece o mesmo. Eu renomeio isso para cor. E estamos olhando na tabela de cores por todo o lado. E então fazemos a mesma coisa. Mas não menos importante para mim, onde mudamos a mesa para misturar qualquer coisa que dita cor ou qualquer outra coisa que você possa ter copiado e colado todo esse tempo. Mistura de narizes, saiba que cada página de índice sabe que tem o método de exclusão procurando um ID de registro. O ID do registro vem do formulário que acabamos de colocar em um parcial. Então, cada um deles estaria procurando esse formulário de exclusão e ID de registro sentado para o valor. E mais uma vez, o roteiro não é cortado em toda a linha. Então deixe-me ir em frente e testar isso. Selecionamos um microfone ainda para ambos. A lista não está preenchendo, isso é suspeito. Então, vamos em frente e inspecionar o elemento, olhar para o console e, em seguida, estamos vendo que esse ERCP não pode ler propriedade, obter atributo off null soul. Acredito que o erro tem a ver com o fato que estamos passando, no nosso caso, estamos obtendo o ID do modelo para ser qualquer que seja esse atributo quando ele é transmitido na página de atualização. Com certeza, para o ATPase, em vez disso, estamos transmitindo esses atributos, mas não o fizemos na página Criar. O que eu fiz foi introduzir esse atributo nesse script no Criar pH onde eu passo o ID do modelo é igual a 0. Isso é de muito poucas consequências considerando que na época estavam criando um, nenhum dado é apresentado. É por isso que não posso usar o ID do modelo do carro ponto do carro porque o carro está vazio, não é. Então, acabaríamos com a mesma exceção de conhecimento logo abaixo de C lado afiado. Em vez disso, estou apenas dando a ele um valor padrão de 0 porque realmente não precisamos dele. Nenhuma extensão disso vai para, ou uma extensão dos requisitos de modificação vai para o nosso script. Se voltarmos ao script, vamos avaliar exatamente o que está acontecendo. Quando o script é carregado pela primeira vez, ele está recebendo os cuidados médicos apresentados. Ele carrega modelos e, em seguida, obtém o atributo e, em seguida, executa o JSON. Mas olhe para isso. Toda vez que vamos mudar o mix, vamos chamar modelos de carga, que tentarão obter os atributos novamente e depois fazer a mesma coisa. Nós realmente não precisamos do atributo mais de uma vez. Realmente só precisava da primeira vez que o pH foi carregado. Porque depois disso, não nos importamos com o que pode ter sido selecionado. O que eu deveria fazer é pegar isso e colocar este script global em execução, pegar o microfone, obter o ID do modelo, depois modelos Lord. Então ele faz isso. Quando as misturas mudaram, conseguimos fazer o IID. Redefinimos os modelos HTML e carregamos modelos, que faz o Fitch. Isso realmente só precisa de uma só vez. Então esse é outro refluxo, então você provavelmente quer considerar porque eu acredito que esse erro teria quebrado a folha de estilo em cascata da porta para cada vez que o valor for alterado. Se você perceber isso antes de mim, então elogios significa que você fez mais testes do que eu. Essas alterações feitas, vamos voltar para o nosso aplicativo web e tentar criar para o carro novamente. E então eu faço Toyota, e então eu vejo, Ok, Nissan e Ferrari hokey são folha de estilo em cascata é Buck. Deixe-me ir até a edição e certifique-se de que as ligações sejam piores se eu mudar o incômodo e aparecer para a nossa coluna vertebral. Bom. Estamos em processo de teste ou bloco bruto Toyota Corolla. Este é um número menos dividido em 2001, e acabei de adicionar três outros apenas para acelerar o processo de adição de ferramentas. Vou testar a exclusão. Então, queríamos ter certeza de que a funcionalidade de exclusão ainda funciona na velocidade do nosso carro. Então, exclua, estamos recebendo alertas de nossas suítes, isso é bom. Se eu clicar em OK, ele será excluído. Isso funciona para nós. Isso é bom. Agora, se eu for para as outras páginas, vou criar um teste aqui porque eu lidero as outras. Então isso cria ainda funciona, isso é bom. A exclusão funciona ou observa isso? O mesmo alerta de suíte está chegando. E se eu clicar em OK, ele está chamando o farm de exclusão e redirecionando para a página e tudo perfeitamente. Agora vemos como podemos colocar. Claro que codificaremos alguém para excluir o mais alto da lista de módulos que funciona. Depois fui criar uma nova cor. Ainda temos a escritura criada, então essa é outra atividade de limpeza que eu teria ignorado onde precisamos remover o campo de entrada para escritura criada em alguns deles. Mas temos o teste e o Excluir funciona. Assim mesmo. Teríamos configurado alguns parciais para garantir que os botões pareçam consistentes. Assim, esse mesmo conceito pode ser estendido até mesmo para o botão Criar livro ou Criar aqui com um sinal de mais. Embora esses pareçam limpos, mas e se quiséssemos que todos eles pareçam da mesma forma? Então, em vez de criá-lo ou qualquer inimigo neste estilo para o botão criar não é o código mais alto, mas mais uma vez, é uma questão de buraco. Você quer reestruturar seu aplicativo o máximo possível. Nessa situação, você provavelmente provavelmente apenas chave de refeição e conteúdo apenas copiando e colando o botão Criar talvez de ideias diferentes para as diferentes misturas de Cree nas diferentes páginas. Mas, em última análise, eu provavelmente tentaria colocar isso em algo que é reutilizável, especialmente porque este não precisa de dados. É apenas um botão ou uma etiqueta âncora que tem aquele top kill Partisi ASP, pitch dash. Dividir à frente e fiz a edição eu mesmo. Eu não queria guiá-lo por cada um porque, como eu disse, todo granularmente obter com a modelagem e os botões e compartilhar a capacidade. Isso depende de você em sua tolerância para tal atividade. Eu fui em frente e fiz isso e vou orientá-lo por isso caso seja algo que você realmente, realmente estaria interessado em fazer. Independentemente disso. Vou fechar todas as guias e podemos apenas olhar pelo site compartilhado, criar outras. Então fizemos isso juntos, botões de índice parciais, sabemos o que sabemos e entendemos que passamos os dados como um número inteiro e podemos acessar esses dados por meio de um módulo de palavra-chave. Agora, para o botão Criar parcial já permanecerá a tag p com o botão criar. E isso vem do que fizemos juntos para os carros. E então, em cada página, acabei de fazer a outra maneira de referenciar a parcial, que é ver o nome parcial é igual a isso. Então, como não há dados necessários para o botão Criar, não preciso colocar nenhum modelo ou nada do tipo. Você também pode incluir parciais como este. Eles são como HTML estático. E, de um modo geral, quando eles precisam de dados, você precisa fazer isso assim. Tudo bem? Então esse HTML estático procurando Target, acabei de colocar isso nos modelos de carros. Coloquei isso no índice de carros em qualquer lugar que eu precisasse. Acabei de colocá-lo onde quer que eles criassem. O que eu acabei de colocar o parcial. Uma vez que eu entendo, se eu quisesse mudar o design, eu apenas vou mudar o design um lugar e em todos os lugares é afetado. Esse é o criador. Fiz isso pelos detalhes e todos os botões de detalhes teriam essa div com a tag âncora para ir para a página de edição. E ele teria pego o ID da rota na forma do ID do registro. E, em seguida, adicionamos o dinheiro ao botão List. É por isso que este exigiu um modelo em qualquer página de detalhes que parcial foi usada? Eu teria que esperar. Assíncrono parcial chamado o botão de detalhes parcial e, em seguida, apenas passo o ID conforme necessário. Outra parte da limpeza foi que eu removi os campos de data de criação dos fóruns de criação e do índice e assim por diante. Então essa foi outra parte da limpeza que eu meio que fiz fora da câmera. Mas, mais uma vez, seja livre para ser criativo. Sinta-se à vontade para ser criativo porque é o seu aplicativo, você sabe melhor e seus clientes são a voz que você precisa seguir. Então faça o que você acha que é certo e você pode fazer limpezas isso, ou fazer modificações na sua interface que não estou considerando que estão fazendo com a minha. Então, o outro teria sido os botões Editar, que são simples, estritamente HTML. Estes seriam os botões Editar no final do formulário, aquele a ser salvo, aquele para voltar para a Lista. Então, em qualquer formulário de edição, eu só veria botões de edição parcial, parciais. Basta colocar isso e lembrar que o grupo de formulários eu fiz toda a div, os botões e coloquei dentro dessa parcial. Assim, você pode simplesmente se encaixar nessa parte de qualquer formulário de edição. Todo e qualquer formulário de edição pode obter isso parcial. Mais uma vez, consistência. Já olhamos para as edições. Temos índice, exclusão e pronto. Esses são todos os parciais que eu tenho. Esses são todos os modos que eu fiz. E, francamente, a interface do usuário parece da mesma maneira. Um usuário nunca saberia que realmente fizemos tudo isso em segundo plano. Tudo está renderizando e funcionando conforme o esperado. Existem botões na página de detalhes e nossa exclusão funciona como sabemos, deveria. Tudo bem. Acabei de notar na página de detalhes dos carros que está bem. Então alguns DTAs ou não voltam. Então, vamos consertar isso enquanto estamos aqui. É por isso que estamos aqui depois. Tudo bem, então vamos voltar para o detalhe do nosso cartão, trás da escola e acho que tem a ver com o fato de que não estamos incluindo dados suficientes em nossa consulta aqui. Vou pular para indexar e pegar emprestado o código que faz o incluir. Em vez de escrever gratuitamente do zero. E vou colocá-lo aqui. E lá vamos nós. Então, estamos fazendo nossos carros, incluímos tudo e, em seguida, obtemos o primeiro ou o padrão por ID. E salve isso. Volte e atualize e saiba que os detalhes estão mostrando uma coisa boa. Acabamos de clicar e olhar para os botões. E bem, esse apareceu, certo? Então, se formos para qualquer página, veremos o mesmo tipo de dinâmica. Os botões estão lá, todos da mesma forma. E isso levou, eu não limpei este. Não há problema. É por isso que estamos aqui. Então deixe-me pular para as cores. Decolar a data de criação. Tudo bem. Acho que é isso para essa atividade. Na verdade, você provavelmente pode tentar se você está interessado nos botões de criação porque você vê que eles criam botões aqui, não parece que gostaríamos que eles olhassem lá que está nos carros. Eu não fiz os botões de criação para os outros. Então, se é que você compra os botões parciais inteiros e tendo tudo reutilizável, sinta-se à vontade para experimentar esse por conta própria. Tudo bem pessoal, então em nenhum lugar no final de outro marco, colocamos em algumas tabelas adicionais. E está se tornando uma aplicação maravilhosa. Analisamos mais JavaScript e jQuery. Nós analisamos como fazer alguma causa avançada hotel isso. Este lado do servidor e o lado do cliente conversam entre si enquanto o aplicativo está sendo executado no que se manifestou está sendo executado no que se manifestou na forma da lista suspensa em cascata. Analisamos como podemos compartilhar modelos em várias páginas usando parciais. Há muito mais o que fazer e há muito mais a aprender. Mas os passos e a prática do bebê é o que vamos chegar a ele em verde. Então, neste momento, o que faremos em nosso repositório do GitHub, Oliver altera todas as nossas migrações e entidades e todas as alterações que fizemos com o banco de dados ou scripts. Tudo não será adicionado ao nosso repositório. Acabamos de colocar uma boa mensagem que pelo menos nos dá sinopse de quais são as mudanças. E então vamos cometer tudo e afundar. Quando isso for concluído, podemos prosseguir para o próximo módulo. 25. Configure reposições de acesso de dados: Tudo bem pessoal, bem-vindos de volta. Então agora queremos avaliar onde estamos no projeto. Configuramos alguns recursos para colocar, tudo bem. Mas agora precisamos ter certeza de que vamos colocar alguns conceitos fundamentais para colocar alguns conceitos fundamentais que, quando estendermos nossa aplicação, não causemos tanto mal quanto temos o potencial de faça se não acertarmos a base. Quero focar agora mesmo em nosso uso do B2B é contextos diretamente em nossas páginas? Não, sim, funciona. E foi projetado pela Microsoft, pela equipe do Entity Framework Core para permitir injeção direta do contexto na página. E isso seria no que chamamos de monitor de escultura, ou seja, durante a vida útil de uma solicitação, durante toda a vida deste código em execução obter sua instância de contexto exclusiva. Tudo bem, então toda vez que ela acessa esta página, você obtém uma nova instância e ela pode fazer seu trabalho e depois ela desaparece. Artistas automáticos, abre uma conexão, faz o trabalho e fecha a conexão. Lembre-se de que os custos do banco de dados são caros, então eles queriam ter certeza de que você é mais eficiente em relação a um banco de dados chamado quanto possível. E sim, eles fizeram um trabalho maravilhoso disso. A coisa, porém, é que às vezes você perceberia que você começa a repetir consultas. Então, por exemplo, quando temos que fazer isso, solte-o sobre este, temos que obter modelos mistos e cores de carros. Se tivermos que obter microfones em mais de uma página é difícil repetir essa linha de código. Então, sim, a repetição acontecerá. Mas, mais uma vez, qual é sua tolerância ao risco ou possuir essa repetição? Porque temos que obter essa lista de seleção dentro do, para os carros. Também temos que fazer isso para um modelo de carro. E estamos recebendo os modelos, quer estejamos criando nossa edição, temos que ir e eu essa mesma chamada de consulta. Algo pode mudar. E se tivéssemos mistura? Tivemos alguns deles que não somos muito ativos ou alguns critérios em nosso próprio, quais queremos. Então você pode correr o risco de ter que manter. Se algo mudar com a forma como você obtém o mix do banco de dados, você terá que atender a mais de uma polegada chave em mais de um agrado. E se você esquecer uma dessas coisas, então você pode correr o risco de não manter a aplicação tão facilmente quanto ele poderia ter sido mantido. Há uma série de coisas que eu estou recebendo que realmente é a razão pela qual as pessoas criam o que chamam de rapper ou repositório em torno das operações de banco de dados para as quais você pode ter 1 de referência para operações gerais. E você pode ter outros específicos por tabela. Mas então ainda é 1 de manutenção, 1 de contato. Por isso, é mais fácil manter a longo prazo. Então, para começar essa atividade, configurar o repositório é o que vamos fazer em nossa solução é adicionar outro arquivo em outros projetos ou outros, e será uma biblioteca de classes. Eu tenho o meu em meus modelos recentes, onde você sempre pode pesquisar modelos e queremos uma biblioteca de classes C-Sharp. Você clica nesse clique em Avançar e, em seguida, vamos chamá-lo carbo King up dot repositórios. Então eu bati Next e queremos que seja, podemos deixá-lo como a.net cinco, tudo bem. E crie. Assim que tivermos esse novo projeto, podemos começar a dissecá-lo configurando algumas novas pastas. Acabei de excluir o arquivo padrão que o acompanha. E a primeira pasta será contratos. E o outro seria Repositório. Pause os Tories. Tecnicamente falando, o que queremos fazer aqui é seguir o conceito de segregação de interface. Esse é o eu em sólido. Continuo falando sobre sólido. É um acrônimo com o velho dizendo que todas as letras que eu tenho quebrado não. E cada vez que estamos implementando um deles, eu o aponto para a direita. Então, analisamos a separação de preocupações, que é o S. Nós analisamos a injeção de dependência, que é o D, nenhum lugar olhando para o olho, que é a segregação de interface. É por isso que temos contratos e temos repositórios. O contrato de fornecedor conceito é que você está, você está assinando um contrato para fazer algum trabalho. Você ainda não fez o trabalho. No entanto, o contrato é aquela declaração de que você vai fazer o trabalho e isso é o que você vai fazer. Nesse ponto, vamos chamar essas interfaces porque a interface tem as declarações do que é possível, que será a redação no contrato. Em seguida, o repositório real, ou o que chamaremos de implementação, herdará. O contrato ou a interface e seja o trabalho real. Então você teria assinado o contrato. O contrato é um ditado do que você vai fazer. Mas depois você está fazendo isso e você está fazendo isso pela orientação do contrato. Então essa é a esperança de que a analogia fez sentido para você, mas você verá exatamente o que quero dizer quando isso se concretiza. Vamos primeiro começar com criação de uma interface nesta pasta Contratos. E então vamos chamar, vai ser o que estou usando a classe aqui, mas nós realmente vamos chamá-lo de repositórios genéricos. Então, nomeando convenções sábias, sempre que você tiver uma interface, você geralmente coloca um I maiúsculo e, em seguida, seja lá o que for chamado, vendo AI um repositório genérico. E isso será uma interface pública, não uma interface pública de classe. Esse repositório genérico terá as funções básicas que todas as tabelas de banco de dados onde quer que sejam executadas. Vimos que podemos adicionar, remover, remover, editar e atualizar, basicamente usando ou repositório ou usando o contexto do banco de dados. Portanto, essas são as mesmas operações que devemos permitir nosso eucariote de repositório genérico, exceto que vamos escrever o código uma vez que eu fui para o genérico de contabilidade do resort é que nós estão escrevendo para que isso possa acontecer contra qualquer tabela que seja passada. Então agora vamos entrar no que chamaremos de genéricos em C-sharp. Para tornar algo genérico, o que você faz é usar esse tipo de colchetes. Então, esses são os colchetes angulares ou o maior que e o distanciamento. E então, dentro desses colchetes você vai dar algum token. Então, estou ligando , por favor, siga. Então este seria seu genérico Tolkien. Geralmente fale usando pessoas usadas como modelo t ou t ou entidade T, álcool, entidades T. Então a TI significa que é genérico. O que é genérico? Qual é o tipo genérico que estou esperando que seja algo de entidade de tipo. Em seguida, verei uma entidade onde eu venho dizendo me dê o repositório genérico e ela é relativa a algum genérico chamado de entidade. E então eu fui especificar onde a entidade T está. Eu poderia dizer classe, eu poderia dizer int, qualquer tipo de dados que eu especifique aqui. É basicamente dizer que isso é genérico, na medida em que corresponde a esse tipo de dados que estou procurando. Se eu disser classe, isso significa que a equidade literalmente passa qualquer classe na qual não é necessariamente o que eu quero fazer. Em vez de dizer classe, verei o objeto de domínio base. Ou é, lembre-se apenas de camionagem. Lembre-se de que temos a entidade base. Desculpe, eu disse objeto. Ele deve ser baseado em uma entidade. Lá vamos nós. Deixe-me uma entidade. Cada entidade que está em nosso banco de dados deve, pelo menos , ser a entidade de domínio de besta. Dessa forma. Garantimos que sempre obteremos algo que é realmente uma entidade de banco de dados. Não quero nenhuma outra classe a menos que seja uma entidade de banco de dados. Então é isso que estou especificando aqui. Linhas vermelhas porque não tenho nenhuma referência a este projeto. Então, lembre-se quando estamos sentados com Bridget, onde adicionar uma referência ao projeto de dados? Bem, existem repositórios institucionais que terão uma dependência do projeto de dados. Então, preciso adicionar essa referência. Eu posso apenas adicionar referência e ele adicionará a declaração de uso para mim e para tudo. E então essa linha vermelha desaparece. Tudo bem, com boa aparência. Em seguida, queremos ter os métodos que sabemos que vamos precisar. Mais uma vez, esta é a interface ou apenas o contrato. Portanto, esta é apenas uma declaração do que é possível. Não é o código real. O primeiro que vamos ter é que vamos usar minhas terminologias assíncronas. Portanto, é uma tarefa que retornará uma lista. Fui chamá-lo deste, pegar tudo. Queremos obter tudo no banco de dados que vemos, obter tudo. Não há problema. Acho que não preciso fazer mais nada com este. Vamos deixar isso, se precisarmos estendê-lo mais tarde e o fim de semana, desculpe, isso deve estar retornando uma lista da entidade do tipo T. Então, seja qual for, seja o que for, passamos como um objeto de domínio base para a entidade T, então esse método retornará dinamicamente o que o T NTT está recebendo tudo. Em seguida, o próximo básico será obter, um, vai querer que um registro vá dizer int id. Então, queremos chegar a um registro por ID. E então eu vou apenas ir em frente e preencher o resto deles para que você possa pausar, replicar isso. Mas, em última análise, queremos apenas adicionar outra tarefa com retorno de um booleano para dizer que o registro existe e passamos o ID. Queremos que algo insira a entidade T, algo a ser excluído quando receber o ID. E eu não sei, não quero atualizar quando ele receber a entidade D. Esses são os métodos gerais que esperamos realizar em cada tabela. Mais uma vez, este é o genérico. Próxima etapa. Precisamos configurar uma classe que implementará esse comportamento genérico. Dentro da pasta de repositórios. Vou adicionar uma nova classe desta vez, e ela será chamada de repositório genérico. Então vá em frente e adicione isso. E então este repositório genérico de classe pública. E tem que ser genérico também. Portanto, é relativo ao In NTT. Ele o coloca na arte que colchete a entidade e herda do repositório genérico. Tudo bem, então lembre-se que mais uma vez temos o contrato e depois temos a implementação. Assinamos que este é o trabalho que vamos fazer. Nenhum trabalho começa. Esta é a herança onde estamos vendo, ok. Seja o que for que o contrato disse precisaria fazer. Preciso ir em frente e fazê-lo. A herança I repositório genérico. E então vamos em frente e controlamos o ponto nos usos. claro que teremos que especificar que isso é genérico para a entidade t onde t e t são do tipo BCE domínio não significa entidade. Semelhante ao que acabamos de fazer, exceto apenas um pouco mais de nuance, porque eles são vistos para o cólon é a herança inicial e delta um é apenas a mesma decoração que temos que faça apenas para garantir que todos saibam disso. Basicamente significa que a entidade é o que a entidade deve representar. Então, a razão pela qual podemos usar a base, deixe-me uma entidade mais uma vez é que ela está sendo usada por todas as entidades. Portanto, tecnicamente, enquanto cada entidade tem seu próprio tipo de dados em sua base, elas são realmente o mesmo tipo de dados na forma de entidades de domínio de abelhas. Portanto, isso é como um identificador exclusivo para qualquer coisa que seja uma entidade aqui, adicione uma nova classe amanhã que seja uma entidade. Basta torná-lo herdado da entidade b assumindo, e automaticamente todos eles compartilham a mesma identidade. Agora essa linha vermelha aqui vai ser porque está dizendo que preciso implementar. Então, uma vez que você tenha uma interface que tenha métodos lá, você precisa implementar. Então você assina o contrato e tudo o que precisa para começar a fazer o trabalho. Só tenho que fazer pontos de controle. E diz implementar interface, pressione Enter e veja isso. Ele apenas gerou cada stub de método em relação às declarações e feito aqui. Se eu fizer alguma alteração em vez do contrato, preciso ter certeza de que atendi a mudança relativa aqui na implementação. Antes de começarmos com nossas implementações, o que precisamos fazer é injetar. Então, se eu precisar de uma conexão com o banco de dados, preciso fazer algo semelhante ao que estávamos fazendo em nossas páginas onde nós a injeção da porta do nosso contexto e tudo isso foi gerado para nós. Expliquei o que estava fazendo, mas foi gerado para nós desta vez. Não há esquerda e direita genéricos para dizer a nós mesmos. Então, vamos começar com esse nulo. Para começar, basta escrever um CT OU pressionar Tab duas vezes. Você consegue o seu caminho, você chama o construtor. Então eu preciso injetar em uma cópia da minha reserva de carro no contexto de banco de dados. Só vou dizer que reserva de carro no contexto do banco de dados. E isso está dentro do parâmetro fora do construtor. Vou chamá-lo de contexto. Tudo bem, estamos acostumados com o contexto da palavra. Não vou mudar o nome aqui. Então eu só faço duto de controle. E eu posso ver cria um atribuir contextos de campo, embora quando eu faço isso, você vê que parece da mesma forma que olhou em nossas páginas. De fato, legível em particular, é só que você pode tirar o excesso, seja lá o que for. Concordo, se você estiver usando o vapor do Visual Studio e as necessidades concordam, isso significa que ele é realmente opcional porque você já tem o namespace. Isso é tudo o que realmente está acontecendo lá, mas é a mesma coisa, carbocação, um contexto, contexto e então ele o inicializa. Agora note que usa um sublinhado aqui, mas ele não nos deu um sublinhado no geral. E, pessoalmente, prefiro usar o sublinhado porque gosto de ver os campos diferentes outras variáveis regulares ou propriedades através disso na pontuação, eu costumo usar sublinhados. Vou substituí-lo aqui. Ponto de controle. E vamos fazer o refatoração do Visual Studio para qualquer outro lugar igual a ser usado. Essa é a única razão pela qual você verá o sublinhado e os nazistas na praça desses um mês para você. Você não precisa fazer isso é minha convicção pessoal realmente. Vejamos outra linha em que temos que inicializar o banco de dados sit. Tão privado, somente leitura. Portanto, campos somente leitura, mais disruptivos que o nome seja, um campo somente leitura significa que, uma vez que você definir algo como não lideramos só pode ser definido dentro do construtor e em nenhum outro lugar. Uma vez que esse arquivo é chamado, debate é chamado, o construtor é chamado. Esses campos somente leitura serão inicializados e seguida, eles não podem ser alterados depois. Então, se você escrever código, inadvertidamente alterá-lo, isso apenas causaria um erro durante o tempo de execução que T está tentando fazer algo ilegal. O compilador pode não dizer, mas o aplicativo definitivamente falhará porque não é possível. Fazemos um banco de dados privado somente leitura em relação à entidade t0. Portanto, lembre-se que a entidade D representa a entidade para a classe, para o banco de dados, e vamos chamar esse dB. Então duto de controle. E estou adicionando a instrução using para problema do Entity Framework Core. E então, em vez do construtor, o único lugar em que posso definir o valor, vou inicializar isso para C. B B é igual ao ponto de contexto. E podemos chamar esse método chamado sit. Sit cria um conjunto de banco de dados relativo à entidade t0, sem problema. Conjunto. E entidade T. Estou recuperando a base, a conexão. Portanto, essa é a conexão com todo o contexto do banco de dados. E então dB seria a conexão com a tabela específica em relação a qualquer tabela em que estou solicitando uma ação. Isso. É assim que tudo se conecta. Então, vamos começar a implementá-los e isso não demorará muito porque geralmente estamos familiarizados com o código que precisa ser carregado ou rasgado na exclusão. Vejamos a operação de exclusão que teríamos implementado em nossas páginas. Lembre-se de que temos algumas páginas de exclusão. Você poderia movê-los se quisesse. Mas nós tínhamos feito nossa própria exclusão no índice de qualquer maneira. E o que ele fez? Em primeiro lugar, ele telefonou e depois garantiu que não era nulo e depois o removeu. Isso é o que a exclusão geralmente precisa fazer um teste para encontrar o registro e, em seguida, diz para remover o registro. Portanto, é a mesma coisa nesta implementação. Em primeiro lugar, diremos que a entidade var é igual a, podemos ver ponto de banco de dados sublinhado. Agora db dot significa a tabela exata em que estou. E você percebe que temos todos os métodos disponíveis para nós. Então, diremos encontrar e usaremos apenas um assíncrono For onde eles definem isso como nossa tarefa. Não há problema. Então encontre assíncrono por ID. Então dizemos sublinhado ponto DB, remova a entidade. Tudo bem, parece bom. Então, neste momento , está reclamando porque achar assíncrono, não sou uma espera. E em um momento nossos pesos, ele vai começar a reclamar novamente. Deixe-me colocar isso ocorreu, por favor. Variável esse peso. E vai começar a ser concluído novamente porque o método não é assíncrono segundo ponto de Controle de Doenças e o converte em AC para mim. Isso é um osso e alguns para ir. O próximo é existe. O que existe parecia, acho que na edição tivemos que fazer algo com um existe onde dizia que contextos de retorno pontilham a tabela com essa condição. Não há problema. Então, na verdade, vou copiar esse código e podemos alterá-lo apenas para ver por que ele parece um pouco diferente. Então, sim, vamos voltar. Não estamos retornando nada de ponto de contexto desta vez. Em vez disso, estamos retornando o banco de dados sublinhado porque isso representa a saída, a tabela específica desta vez, o que significa que eu não preciso desses modelos de carros porque eu realmente não sei em qual tabela eu estou até atingir essa implementação e inicializar a BBC fez a suposição de que são contextos, não modelos de carros, pode ser qualquer coisa. Então, o DB representará isso qualquer coisa. Mas então qualquer ainda é o método que preciso usar. De fato, não há nenhum assíncrono. Lá vamos nós. E então ele olha para a condição. Qualquer acing isso precisa esperar e depois Controlar pontos para encontrá-los à tona assíncrono , e todos estão felizes. Tudo bem, juntar-se bem e diga Veja como o código parece muito parecido. Mas, mais uma vez, é genérico porque aqui está definitivamente à procura de modelos de carros. E talvez não saibamos necessariamente com qual entidade está lidando no momento. Vamos continuar com nossa implementação para que possamos fazer e ficar relativamente simples. Tudo o que temos que fazer aqui é dizer que a entidade var é igual a o, ela encontrar um coletor. O que estou recebendo alguns erros aqui. Um, porque isso é um erro mortal. Isso não deve estar retornando, pelo menos obter todos que retornam a lista faz com que você retorne apenas um que não é problema. Tem que atender à mudança na interface e na implementação. Portanto, get não deve ter lista lá, ele deve apenas retornar a entidade da tarefa T. Tudo bem. Então podemos simplesmente modificar isso aqui. Porque se subirmos, vemos que essa reclamação sazonal porque as duas paradas do método não são parecidas quando fiz essa correção, não é mais reclamar. Tudo bem, em seguida, controle ponto para tornar o método assíncrono. E então todos devem ser felizes. Mas isso está dizendo que nem todos os caminhos retornam um valor. Então eu poderia realmente mudar a frase, digamos retornar. Sim, lá vamos nós. Em seguida, temos algo semelhante para isso conseguir tudo. Então, vou dizer retorno. Em vez de db.find um coletor, seria db dot listar uma sincronização, mais uma vez, assíncrona, mas inclusões, inserção e atualização do McCoy terão código semelhante. Inserir, estamos apenas dizendo dB em assíncrono e estamos adicionando a entidade que será passada e vendo então use seu oh, espere, eu fiz o método Async e air void. Eles não estão retornando nada, como apenas uma tarefa. Este é vazio. Portanto, não há métodos assíncronos de atualização reais. E isso é por causa de toda a simultaneidade ou potencial coisa de simultaneidade que discutimos nos dias anteriores. Porque você não quer arriscar atualizar operações no mesmo registro, no mesmo segmento ou em threads diferentes. Portanto, a programação assíncrona criará um encadeamento diferente. É por isso que você pode ter várias operações de anúncios, várias operações de recuperação acontecendo simultaneamente, mas uma atualização é meio que excluir é um pouco arriscada. Você notaria que esses dois não são necessariamente filmes assíncronos, não os assíncronos. E não há nada assíncrono, o dobro do anexo aqui. Isso precisa acontecer um de cada vez, garantir consistência. Então agora temos todo o nosso repositório, repositório genérico criado. Eu só vou fazer uma compilação Control Shift e B apenas para garantir que tudo esteja sendo construído corretamente. Lá vamos nós. Não, não vou mais longe. Acho que são muita inflamação para absorver. Então você pode apenas revisar tudo e ver como todos esses pontos se conectam entre si e como tudo está amarrado. A última coisa que vou fazer, no entanto, é adicionar uma referência para nosso novo projeto ao nosso projeto de busca de carboidratos. Isso me fará reorganizar as dependências porque vou adicionar um projeto ou uma ferramenta de um amigo, repositórios um. Certo? E então o problema é que os repositórios fizeram referência aos projetos de dados. Então, se eu remover a referência de dados e depois fazer uma compilação, veremos que ela ainda será bem-sucedida. Portanto, neste momento, não precisamos de uma referência direta do nosso aplicativo da Web para o nosso projeto de entidade porque ele está falando com os repositórios. Os repositórios terão essa ferramenta de referência do diretor, esses dados. E, em seguida, o projeto de dados tem as referências de terceiros ao Entity Framework, Core e tal e assim por diante. Portanto, a hierarquia ainda está intacta. Se você olhar, verá que nenhuma de nossa cota está realmente quebrada. Mas, em última análise, o que queremos fazer é não ter esse contexto de banco de dados diretamente injetado em nossas páginas. Quando voltarmos, estaremos refletindo nosso código para que ele seja um nem um barco e registre o repositório que criamos. E então vamos trocar o código para usar o repositório. E, em seguida, para operações mais complexas que as que exigem incluem em alguns dos campos e assim por diante. Vamos olhar para todo. Precisamos modificar nosso repositório em nosso código para facilitar essas situações especializadas. 26. Adicione o código de reposição.: Pessoal, bem-vindos de volta. Então, o que acabamos de realizar foi configurar um pequeno wrapper em torno do contexto do banco de dados de revisão e remover algumas das referências diretas antes entre nosso aplicativo web e o banco de dados. Então, colocamos esse ouvido médio, que algumas pessoas descreveriam como a camada de lógica de negócios. Porque se tivermos algo especial a fazer, qualquer operação especial, não gostaria de escrever o código desnecessariamente no aplicativo da web. Nós só queríamos chamar um método e depois deixar esse método atender às decisões e fazer qualquer coisa que precise ser feita que seja de natureza extravagante por falta de um pouco de expressão. Então, isso seria o que nossa camada de repositório realmente representa. Sabe, esse Lear pode crescer. Apenas meio que obstruímos muitas das operações em dois arquivos no momento. Mas há potencial de crescimento e você verá que ele precisará se estender com base em algumas das operações que temos que realizar para disponibilizar os repositórios para injeção de dependência em nosso aplicativo web. Como o que podemos fazer com o contexto do banco de dados. O que precisamos fazer é avançar ou iniciar e registrá-los como um serviço de escultura. Portanto, nos serviços de configuração, lembre-se de que o modificamos para adicionar o contexto de banco de dados que precisa permanecer. Mas o que podemos fazer é dizer serviços. E podemos ver adicionar escopo entre parênteses. Vou dizer que tipo de repositório genérico com colchetes vazios. Então estou avisando que, onde você vê a interface, ela é implementada pelo repositório genérico e também com os colchetes apertados. Portanto, você pode ver código semelhante escrito de maneira diferente, na qual você realmente diz adicionar escopo, tipo de colchete aberto e sua implementação. Mas como estamos usando genéricos, é assim que isso tem que ser feito. E é apenas outra maneira. É basicamente o mesmo tipo de código. Mais tarde, quando tivermos repositórios específicos e você verá o outro estilo de escrever essa linha. Mas, por enquanto, acabamos de adicionar escopo. Portanto, existem alguns tipos de modelos de injeção. Modelos de injeção significando que os serviços de furo são injetados em sua emoção vitalícia ao que chamamos de nossa solicitação ou garganta, o tempo de execução da aplicação. Para contexto, adicionamos escopo. Então, tivemos que adicionar escopo na escola. Isso significa que para você realizar uma operação até que você termine essa operação, você usará uma instância disso, seja lá o que for que estamos nos dando. Nesse caso, você usa uma instância do repositório genérico enquanto estiver realizando uma operação ou um conjunto de operações em uma página. Transient significa que cada operação com a qual você vai começar sempre lhe dá uma nova. Portanto, adicionar transitório é bom se você estiver fazendo isso com o serviço de acompanhantes. Como o contexto do banco de dados tem escopo e o repositório genérico depende do escopo, poderíamos facilmente atender ao repositório transitório ou esculpir. Não há problema. O outro é singleton. Singleton, o que significa que serei uma instância para todo o aplicativo. Há momentos em que você gostaria que, talvez como com um arquivo de configuração, algo que nunca foi alterado. Ele nunca esperou ser dinâmico. Você faz isso uma única vez. Você não precisa mudar isso toda vez que algo acontece ou toda vez que o PhD e o GCF para obter uma nova instância dele. Isso é mais para nossas operações de banco e certos outros tipos de serviços, como um serviço de e-mail, você definitivamente desejaria que isso seja transitório porque se vários e-mails precisarem ser enviados uma vez, você quer vários objetos ou incenso, ele está fora disso. E eles devem fechar assim que terminarem. Você pode misturar e combinar. Você não precisa necessariamente se lembrar de todos eles e apenas descobrir qual deles o tempo todo eu sou negro. Mas certos princípios podem ser usados para descobrir qual deles é melhor para que tipo de serviço. E esse banco de dados é definitivamente melhor como Sculpt. Se você quisesse uma pista, se você passar o mouse sobre o contexto de adição de banco de dados, você realmente veria que ela diz que ela tem escopo por padrão. Qualquer coisa que seja dependente do contexto do banco de dados, apenas faça esculpir eu, você deve ficar bem. Agora que incluímos nosso repositório genérico, vamos ver como ele funciona. Então, vou pular para um que seja muito simples. Vamos começar com microfones. Eu no nosso mix Create Page four, o que vou fazer é, em vez de injetar o contexto do banco de dados diretamente, vou mudar o sal, então vou remover o contexto do banco de dados de a injeção. E vou dizer que me dê um repositório genérico de para incluir referências ausentes. E posso ver a ferramenta relativa. Sei que estou em mistura, então em relação à classe média. Então eu posso chamá-lo assim. Achei que ele repositório e depois Control pontos. Deixe que ele inicialize um campo criado. Então eu posso remover as referências ao contexto e ao repositório no repositório de pontuação, elas apenas renomearam isso. Não, ele é renomeado em nenhum lugar usando repositório em vez do contexto. E como esperado, temos algumas flechas aparecendo bem. Não, esta foi uma operação de criação. Então isso significa que, em vez de ver ponto mix de pontos de contexto me adicionar, eu posso saber ver a inserção de pontos do repositório. E então foi assíncrono depois do nosso peso. Isso é muito importante que não implementemos um Salvar alterações em nosso repositório. Portanto, lembre-se de que toda vez que aumentamos os dados precisamos chamar as alterações salvas. Se saltarmos e eu puder apenas fazer o Control F12 para pular para a implementação do método. Observe que não há alterações salvas acontecendo em nenhum lugar, certo? Então, estamos atualizando onde inserindo, estamos excluindo nosso não salvamento. Então, levantamos esse onenote. Não há problema. É por isso que é bom pegar essas coisas. Não. Vou apenas ir em frente e vou fazer desta uma tarefa que retorna um int. E serão as alterações salvas. E isso fez isso porque se as alterações por padrão geralmente retornam um número inteiro de qualquer maneira, então estou apenas representando isso. Bem, isso é como nossa função superior. Então, se eu pular para a implementação, ele vai reclamar, Ei, método Union Avenue, por favor implemente o ponto de controle enter. Não é implementado. E então tudo o que realmente temos que fazer é retornar o contexto. Então, sublinhamos contextos. Pensou em Salvar Alterações é coletor. É assíncrono, então eu tenho que esperar, é claro, Control dots MC method Async e remover o excesso de espaço. Lá vamos nós. Não, podemos ver se o GnG não é problema. O que podemos fazer é, em vez de chamar as alterações Salvar toda vez que eu chamo, fazemos a inserção aqui e, em seguida, temos que chamar o Salvar alterações em uma linha separada. Sabemos que esses métodos precisam salvar as alterações. É fácil o suficiente para mim ver após a inserção, depois, se você adicionar, vá em frente e chame seu método local Salvar alterações. Esse é o nosso peso. Isso reduzirá o número de vezes que eu, você verá as alterações Salvar em todo o aplicativo porque sabemos que quer fazer uma inserção, os tinges precisam ser salvos através tudo aqui. Não há problema. E então tudo estaria sendo executado no mesmo contexto. Portanto, não importa quantas operações você faça usando a instância do repositório WAN, ela sempre salvará as alterações no final do d. Então, vamos esperar, ver se g e g, Então a inserção, e ela sempre salva as alterações com a atualização. E então olhe para isso, uh, nós salvaríamos as alterações com a atualização, um, porque não é assíncrono, então não há problema que possamos refletir à medida que avançamos. E a exclusão também não é assíncrona, mas esta foi assíncrona porque fez algo assíncrono. Então, agora podemos trazer a atualização de pontos de controle nulos. Podemos fazer o método assíncrono. Mas em vez de fazer isso, o que eu fui fazer é modificar a interface e torná-la uma tarefa. Apenas deixe excluir é uma tarefa, então isso a tornaria mais consistente. Assim, podemos ver a atualização da tarefa assíncrona. E então todo mundo está feliz sabendo que nossos criam. Não precisamos dessa linha porque, uma vez que fizermos a inserção, sabemos que a inserção e o salvamento das alterações acontecerá. Isso é tudo em uma linha. Se precisarmos fazer uma alteração em um todo inserções são feitas. Temos 1 de referência. Se houvesse vários lugares no aplicativo, você precisa fazer esse tipo de operação. E ele queria que todos os lugares fossem consistentes. Em vez de fazer alterações de código em todos os lugares, temos 1 controle de 121 de referência para mim, essas alterações. Mas alguém para lhe mostrar algo. E se Por toda vez que eu precisasse salvar a mudança, lembre-se de que tínhamos adicionado ações criadas e deixe-me voltar para a besta. Quero dizer, entidade que tínhamos dito escritura criada. Lembra disso? Não. Não. Não. Não fizemos nenhuma modificação para facilitar o criativo pois eu mesmo o tenho removido da interface porque eles o viam como um obstáculo. Porque realmente e verdadeiramente os usuários não devem ser capazes de vê-lo ou interagir com ele. É realmente para o nosso sistema interno. No entanto, quero ter certeza de que toda vez que gravar estes sendo criados, desvalorize, está tudo bem? Voltando ao que eu disse, em vez de fazê-lo em vários lugares e por tudo o que posso encontrar. Tudo aconteceu em vez do repositório NIH. Então, isso me dá um pouco mais de controle sobre as operações. Dito isto, vamos modificar nosso método Salvar alterações para adicionar mais dados, manipular os dados ou o que quisermos fazer antes. Na verdade, ele vai para o contexto do banco de dados e salva. Aqui, podemos obter as entradas que são um barco a serem salvas do contexto dizendo apenas para pagar. Então, não sei quantas coisas serão salvas nesse ponto porque poderíamos ter feito várias operações, seja lá o que for. Então, vou salvar para cada entrada no ponto de contexto. E depois há essa coisa chamada camionista de mudança. Então, isso é, na verdade, o Entity Framework está realmente caminhando que quando eles lhe deram uma entidade, Ele realmente está vendo que você modificou essa entidade? Alguma coisa sobre essa entidade mudou? É por isso que não faríamos a atualização? Estamos vendo anexar e, em seguida, alterar os estados para modificá-lo que o Entity Framework saiba que isso foi modificado. Então, quando você vê se as alterações aqui batendo, ele saberá automaticamente que tipo de instrução gerar com base no estado da entidade. Então, o instrutor T é o que está sendo usado como esse registro para ver essa mudança. Este não o fez isso não mudou. Instrutor é que posso dizer que me dê as entradas e então esta é uma coleção para que eu possa usar colchetes não, para analisá-las em algo específico. Então, quando digo algo específico, posso dizer que me dê todas as entradas. Esse é o nosso carro. Consiga todas as entradas do modelo de carro, mas não sei o que está sendo salvo. Isso é genérico. Então, em vez disso, vou dizer qualquer coisa que esteja sendo salva que seja do tipo entidade de domínio base, que pode ser qualquer uma de nossas entidades que temos. Veja, apenas usar esse pouco de herança está nos permitindo fazer coisas genéricas maravilhosas, certo? Um pouco de código para servir muitas tabelas e apenas ser flexível. Estou dizendo que me dê cada entrada que está na estrutura da cadeia que muitas vezes é melhor para mim uma entidade. E então eu posso estender isso para dizer que estamos prontos para criar. Eu só quero aqueles que têm o estado da entidade como estados entrada de contextos modificados. Posso ver isso é onde a expressão Q lambda Q dot state é equivalente. E, em seguida, o estado das entidades que é dado a nós pelo Entity Framework Core. E aqui estão todos os estados potenciais inalterados, adicionados, o toque modificado, excluído. Tudo bem, então eu quero que, quando ele estiver sendo adicionado, eu quero todas as entradas que, quando elas estão sendo adicionadas, eu posso ver Entidade de ponto de entrada. entidade aqui é maravilhosa. O genérico e os corpos baseados nessa entidade de domínio. ponto que ele criou é igual ao ponto de tempo. Então, tudo está se unindo. Então, uma vez que eu faço isso, isso me permite não precisar sentar e nós dois estamos sentando essa data criada em cada registro ou em cada vez. Algo é capaz de ser criativo o suficiente para ir a cada código de criação Bij para ver antes de enviá-lo pelo McDonald criado é igual a d hora não, e descendentes, e eu só estou fazendo isso em um lugar. Uma vez que algo for criado, isso acontecerá. Em seguida, ele salvará as alterações. E você pode estender isso para aquele em ambas as coisas porque poderíamos ter uma data modificada. Então você poderia facilmente dizer: Leve-me onde o estado é adicionado ou modificado. Se o estado for adicionado, o novo conjunto, isso se for modificá-lo, você disse que não modificou, etc ainda voar. Então, só estou mostrando que isso é maravilhosamente flexível. Então, neste momento, vou fazer uma compilação rápida e vamos pular e testar nossa mistura e ver a diferença, certo? Não, as únicas mudanças que fizemos foi criar o Pj. Tudo bem. Então, crie novo. E vou dizer testar novo repositório. Este não sou eu. Mas vamos seguir em frente e clicar em Criar arte. Portanto, ainda existem trabalhos. Vamos olhar no banco de dados e ver o que veio pelos deuses sentar-se durante o período de data. E assim, fazer drill-down para o banco de dados e já deve ser carbocação clubbed. Em nossa tabela de mixagem, o registro mais recente deve ter o deet e lá vamos nós. Todos os outros tinham a data padrão, esse problema nos dados do carrinho, o carimbo de data/hora exato de quando ele foi criado. Foi assim que foi fácil saber se mudamos toda a cotação de criação e vou desafiá-lo a fazer isso da mesma forma que modificamos o modelo Criar aqui. Para mim, vou desafiá-lo a fazer o mesmo pelas cores, fazer o mesmo com modelos de carros. Deve ser fácil fazer o mesmo para carros. Sim, porque o CTO é simples o suficiente. Cara que suporta todas as criações e se você se sentir bem, vá em frente e faça a mesma coisa para a edição. Porque é praticamente a mesma coisa onde quer que você tenha contextos que a segurança depende do contexto, adoro fazer coisas. Aqui está o mesmo anexo com o estado das entidades modificado Cmd, G e G. Isso é tudo o que fizemos em nosso método de atualização. Onde quer que você os tenha, tente trocá-los pelo código do repositório. Então, vou fazer isso e quando voltarmos podemos comparar o que foi feito. 27. Refacção de páginas: Bem-vindo de volta pessoal. Então, quando estivemos aqui da última vez, tivemos uma tarefa que deveríamos completar outras páginas. Espero que você tenha tentado por conta própria. E se você tiver problemas ao longo do caminho, que não seria surpreendente, não sinta como se não estivesse fazendo o trabalho corretamente ou assim por diante. Existem certas partes que precisarão de um pouco mais de explicação do que algumas. Mas, em última análise, espero que você tenha tentado e espero que entenda o que estamos tentando realizar aqui. O que vou fazer é revisar o que fizemos da última vez. E então vamos percorrer cada uma das mudanças gerais. E há algumas alterações que exigem um pouco mais de código para ser escrito. Então, vamos fazer isso juntos. Vamos começar revisando o que fizemos da última vez que estamos lidando com microfones e modificamos a página Criar, certo? Então fizemos a injeção do repositório em nossa página Criar em relação a mim, que é um repositório genérico em relação ao microfone. Em seguida, poderíamos substituir todo esse código extravagante de obtê-lo e mudanças de história e densidade por uma linha de código. Apenas a inserção. Vamos seguir em frente. Então eu configurei minha página de exclusão. Sabemos que não precisamos excluir bits. Na verdade, vou excluir a página de exclusão ali mesmo. E então vamos ver os detalhes juntos. Então, detalhes que fazemos a mesma coisa, fazemos nossa injeção. Então, substituímos a injeção de contexto pela injeção de repositório genérico. E então, onde teríamos feito o primeiro ou o padrão, obtenha isso. Acabamos de substituir isso pelo nosso repositório de pesos ponto obter o volume do ponto ID. Se eu estiver avançando muito rápido ou você ainda não o fez, sinta-se à vontade para pausar e replicar à medida que eu avançar, mas certifique-se de que você está internalizando as explicações do código à medida que eu avanço. Vejamos a edição. mesma injeção. Tenho certeza que você começa a perceber nosso tema comum em todo o shopping. Não, tudo o que temos que fazer é injetar nosso repositório em relação a qual entidade onde um barco usar na página. Então para o on get esta linha basicamente ele nós, como os detalhes, obtemos a mesma linha. Não mudei nenhum trimestre padrão nos cheques. Todos esses ainda são necessários. Estou apenas substituindo o código em relação ao contexto e no post, em vez de alterar o estado para modificá-lo e, em seguida, salvar as alterações, eu apenas coloco a atualização lá. Porque na atualização, ele vai seguir em frente e ver se g e g estão mesmo assim. Portanto, não precisamos nos preocupar com nada de errado com isso. Tudo o que fazemos é mudar isso para atualizar dentro de um try catch e tudo deve funcionar da mesma maneira. Outra alteração de gerenciamento de barra teria sido com o existe. Existe não era assíncrono, era apenas o bool make privado existe e ele obtém o ID. Então eu mudei para dizer, vou esperar, repositório que existe com o ID que tornou o carregador de mitos assíncrono. Portanto, usando o ponto de controle, ele anexou automaticamente assíncrono ao nome do método. Nenhum problema o tornou assíncrono, sem problema. Então, outra coisa que você teria fazer é garantir que você chame um peso nesse método. Ligue para o topo aqui. Os nomes e tudo seriam capazes, você quer usar o IntelliSense, mas você só precisa ter certeza de que você colocou nessa linha. Essas mudanças praticamente as mesmas alterações para as mesmas páginas, para cores porque essas duas páginas ou essas duas entidades não têm dependências. Cores, a mesma coisa, exceto que estamos injetando nosso repositório pronto para ter que colorir. E então usamos a mesma linha lá para uma necessidade lateral da exclusão. Então, vou remover isso para os detalhes. Temos a mesma coisa. Onde acabamos de obter os detalhes da cor para a edição, temos a mesma injeção onde obtemos a cor. E depois atualizamos a cor quando necessário. O índice. Eu pulei o índice para o microfone, também índice para Meca e cor. Muito simples. Participe ou injetamos ou repositórios. lista será obter tudo. Não há problema. Acho que isso deve ser misto. Talvez eu tenha lido isso. Se não, então você pode ir em frente. Eu fiz essa mudança. Então isso faz com que você obtenha tudo e, em seguida, ON delete, tudo o que temos que fazer é chamar a exclusão. Se o ID do registro for igual a saber, não vamos telefonar. Caso contrário, basta chamar a exclusão passando no ID do registro. Isso é tudo o que há para isso. Bom, simples e consistente. Então veja, eu não quis dizer que ela está ouvindo as cores. Não há problema. Vamos fazer isso juntos mais uma vez. E, literalmente, vou copiar essa linha porque é basicamente o mesmo código. E posso substituir tudo isso por essa linha de código. Porque todo mundo está sendo chamado repositório e você pode ser específico, se quiser. Não estou dizendo que você precisa chamá-lo repositório e todos precisam chamá-lo de repositório. Você pode querer obter específico e chamar este repositório de cores, criar repositório, etc. Não há problema. Mas no final do dia, o código base e a aparência, a estrutura sempre será consistente. Fizemos isso por cores. Fizemos isso por mim, não faz problema. Vejamos modelos de carros. E também um modelo de carro é um pouco mais complicado, pois temos que carregar dados iniciais. Então você vê que fiz algumas das mudanças e deixei algumas desconhecidas. Só pense que ele é aqui que você estava. E se não, sinta-se à vontade mais uma vez, pause e replique o que você vê na minha tela. Já substituímos o código de inserção no método post. É um modelo de carro de inserção de repositório, tudo bem, mas então precisamos obter a lista de mix, que significa que preciso de um repositório que possa me dar o mix. Embora sob as prisões do repositório seja relativo ao modelo de carro não misturado. É aqui que você provavelmente gostaria específico com o nome do repositório. Então, neste caso, eu gostaria de chamar este repositório de modelo de carro e vou apenas renomear, e vou apenas copiar, colar três, usar esse nome e renomear sono de acordo. Todo mundo sabe que este é um repositório de modelo de carro. Então o repositório do modelo de carro insira isso. Preciso de um repositório relativo ao mix. Não há problema. Posso facilmente ir aqui. Só vou copiar esse bit, que você diz que eu repositório genérico em relação a mim. E fui chamar esse repositório de mixagem. É aqui que a nomeação especificamente entra em jogo e, em seguida, pontos de controle permitem que ele crie um campo atribuído. E a injeção acontece. Claro que usamos nosso sublinhado. E depois de fazer tudo isso, não, eu posso simplesmente pular aqui e me ver x é igual a uma nova lista de seleção. Aguarde o ponto do repositório mix chegar a todos. Olhe para isso. Todos estão felizes. É isso. Assim, você pode ter mais de um repositório na mesma página. Então eu tenho um repositório que fala com a tabela de modelos de carro. E eu tenho um repositório falando para fazer eu adivinhar o que ambos são a mesma base de código. Isso é realmente tudo o que eu precisava fazer para a criação. Então eu tenho que repetir esse feito para o editor. É claro que sabemos o que fazemos é criar dois basicamente após replicar com a edição. Só vou copiar e colar como quase nunca ******. Fui fazer isso ainda mais rápido. Vou pegar tudo isso, aparecer e substituir tudo isso no Editar e, em seguida, apenas renomear o campo do construtor ou nome do construtor. Meu repositório, o que eram repositórios? Nenhum repositório de modelo de carro. E então repositório de motor de carro novamente. E então esse seria nosso repositório misto de peso. Dot pegue tudo. fatoração pode ser tediosa, mas há maneiras de acelerá-lo quando você copia NPS, cota semelhante, você sabe exatamente o que mudá-lo. Vamos dar uma olhada nisso. Levei alguns segundos para editar e criar até o zero. Vou remover a página de exclusão para mim. Não preciso disso para os detalhes. Já alterou todos os detalhes porque tudo o que precisamos é de um modelo de carro. Mas então há outra coisa que você pode precisar olhar, que é a gordura que o modelo de carro tem mistura. Então, precisaríamos incluir os detalhes da mistura nas tabelas do modelo do carro. Acho que não tínhamos feito isso antes. Eu mudei para o repositório. Mas isso é algo que definitivamente teremos que implementar para que implementar a página de detalhes mostre o microfone corretamente. Então, nunca modificamos a interface, então nunca tivemos que modificar os dados voltando. Realmente e verdadeiramente, este deve ser nome do ponto do modelo CAR porque queríamos ver, e este é o modelo do carro e este é o microfone. Está relacionado a esse ponto. Definitivamente precisamos modificar a forma como obtemos os dados porque nosso Getty está apenas recebendo os dados. Mas já vimos que, quando queremos obter os detalhes dos registros relacionados, temos que fazer uma inclusão e assim por diante. E não sabemos o que incluir o genérico porque não posso comer apenas incluir algo na mesa porque tabelas diferentes têm propriedades diferentes que estão incluídas. Então, definitivamente fomos atrás algum código personalizado para um modelo de carro nesse cenário. E então, por extensão, teremos que estendê-lo para o índice também porque quando obtemos toda a página de índice, provavelmente queríamos não apenas exibir o nome, assim como com os detalhes, você provavelmente queria exibir o microfone também. Quero dizer, isso depende de você. Este provavelmente é opcional. Não vou estender o índice para mostrar o microfone, mas teremos que fazer isso pelos nossos carros. Então eu não terminei de assistir todos os carros, e você pode ver aqui que eu tenho alguns deles são tipos de dados errados. Fez alguma refatoração, alguma refatoração global que misturou várias coisas. Mas quando você olha para isso, você vê que estou recebendo um repositório de carros. Não mudei muito sobre o código aqui. Mas então temos o mesmo problema em que precisamos da mistura, das cores, dos modelos que faltavam suspeitosamente. Precisamos trazê-los. Isso significa que eu precisaria de uma mixagem de reexecução ou leitura antes dos modelos e nosso repositório para cores. Sim, nos livramos de um SEO tomando todos os contextos porque conceitualmente os contextos nunca devem interagir diretamente com o controlador ou a página. Mas então criamos um modelo em que criamos tal delineamento entre os três tipos de dados que precisamos injetar três instâncias diferentes do repositório. Como sempre vê, há momentos em que você faz algo porque faz sentido, mas então importa o quão granular você precisa se basear em seus objetivos. Não resistir a isso. Vamos apenas ir em frente e obter esses repositórios adicionais. Eu não queria te aborrecer se você me ver fazer isso, mas isso é basicamente o que parece e eu só vou criar as linhas. Você pode ver onde cada linha começa e pára. Basta dizer que é muito, muito claro. Nós apenas vamos em frente e injetamos repositório por tipo que precisamos. Vamos em frente e inicializamos esses campos. Não, em relação a cada chamada, vamos fazer uso do repositório do carrinho. Então aqui vou dizer sublinhar o pirata. Então este é o repositório de carros. Este é o Create, então inserções e estamos passando no carro. Tudo bem, qualquer análise que a inteligência sempre o guiará para observar a necessidade do tipo de dados é necessária com base no repositório ou consumida. Lá vamos em frente e inserimos nosso carro. Não ouça. Estamos fazendo em modelos de carros. Então, sabemos que esta é uma área de lista suspensa em cascata. Então, neste ponto, definitivamente precisaria de algum código personalizado. Porque quando recebemos r obtém tudo, estamos recebendo todos os registros uma vez, mas depois estamos recebendo com base no ID. Recebemos um necessário com base no ID da chave primária aqui. Nós não estamos fazendo com que todos os modelos de carros se uma linha completamente diferente é igual a valores diferentes. Então, definitivamente precisamos ter algum código personalizado para isso, mas ainda não estamos lá. Vamos garantir que todos os nossos métodos comuns sejam iguais. Então, para a mistura, então fui ver em um ponto do repositório do mixer de pontuação obter tudo. Então eu posso substituir cada um desses. Vou apenas copiar e colar um nome da indústria, esses modelos de carros. Sou um desses repositórios e este foi o Colors. Cores. Cores. Temos cor? Cor? Deixe-me apenas copiar e colar no sem sentido. É um lento lá. Tudo bem, então pelo menos estes são corrigidos. Agora vou fazer uma pausa ali mesmo. E se você olhar para a página de detalhes e olhar a página de índice, e como eu disse, para a página de edição e até mesmo a Criar onde temos as listas suspensas em cascata, temos que ter certeza de que estão procurando as coisas do cartão no momento atual. Então, quando voltarmos, veremos como podemos estender nossos repositórios. 28. Complete completas: Tudo bem pessoal, então estamos em dinheiro e o que vamos fazer nesta lição é colocar alguns repositórios personalizados. Deixe-me falar sobre repositórios de clientes. Há momentos em que, para determinadas entidades ou certas operações, precisamos ter um código personalizado que não pode ser genérico. Então, o caso em questão seria para nossa criação, onde temos nossa lista suspensa em cascata. Definitivamente precisamos de alguns métodos personalizados aqui para facilitar o hardware olhando os modelos de carros nesta situação específica. Isso significa que vou ter que estender ou modelos ou modelos de carros para ter seu próprio repositório com seus próprios métodos personalizados. Outro exemplo de por que isso pode ser necessário seria como quando queremos olhar para os detalhes ou até mesmo a lista dos carros, temos que incluir esses detalhes específicos para o carro ao olhar no modelo de detalhes. E quando estamos lendo sobre a lista no índice, definitivamente precisamos das Incluições também. Esses são motivos para estender seu código. Isso não é, este não é realmente um termo oficial na programação, mas eu chamo isso de dor Driven Development. Qualquer um ou outros desenvolvedores com ele. Em Driven Development, o que significa que você faz o que é necessário para o objetivo em questão. E você fica chique quando ele vê necessário, mas você não começa apenas fundos porque você pode exagerar em algo que é muito simples. Então, neste momento, vemos a necessidade desse refator. Então, vamos em frente e faça isso. A primeira coisa que vamos fazer é voltar ao nosso projeto de repositórios. Fui para contratos com o botão direito do mouse e depois adicionarei um novo item e item na forma de uma interface. Este eu vou chamá-lo de repositório de modelos de carros. Sabemos o que precisamos para torná-lo interface pública I repositório de modelos de carros. Então, agora, o que faz esse contrato? Qual é o trabalho que esse contrato precisa implementar? Bem, eu fui dizer que você precisa implementar um método que é uma tarefa que retorna uma lista de modelos de carros, alguém para chamá-lo de obter modelos de carro por mansos, e é preciso um parâmetro int make ID. Agora com isso, esse contrato em vigor, preciso de uma implementação que vou chamar de repositório de modelos de carros. E esse será criado na pasta repositórios. E eu só percebo que escrevi repositórios errados neste momento. Sinto muito por isso. Repositórios que sabem quem adora algumas ramificações por baixo estão sendo usados, mas tudo bem. Podemos criá-los facilmente. Então vá em frente e crie esse novo arquivo. Vou apenas ir em frente e corrigir o, corrigir esse erro ortográfico como estava. Então saiba quando você tem sua classe de implementação, bem, precisamos fazer é herdar da AI, um repositório de modelos de carros. Então isso é bastante fácil, mas isso vai ter ser uma herança do WE porque, por exemplo, esse repositório de modelos deve ser capaz de realizar tudo o que o genérico pode fazer. Ele deve ser capaz de fazer tudo para o genérico pode fazer, bem como qualquer coisa personalizada. Nosso novo contrato é reservado para operações personalizadas em relação ao modelo do carro. Mas então ainda precisa ser capaz de realizar tudo o que o genérico pode fazer, que é salvar mudanças, isso e aquilo e aquilo. O que precisamos fazer quando temos nossa implementação é herdar do repositório genérico em relação ao modelo de carro. Tudo bem, então estamos vendo a implementação do repositório para o nosso modelo de carro. Quero herdar disso, incluir quaisquer referências ausentes, bem como meu contrato de fantasia. Então, quando você olha para isso agora, e eu faço a interface de implementação de pontos de controle, ela só implementará o trabalho prescrito por este contrato. No entanto, eles funcionam aplicados pelo repositório genérico também estão lá em segundo plano. Oh, está reclamando para mim que não há argumento dado que corresponde com se eu estiver herdando de algo que tem um repositório genérico de injeção, ele tem uma injeção para o contexto. Se eu chamar o repositório de modelos de carros, que está herdando disso, o repositório de modelos de carros precisa fornecer tudo o que a classe base precisa. Resumindo a história, e não foi o construtor que vai pegar os contextos do CMDB ou apenas copiá-lo. Contexto de banco de dados de reserva de carro, vá em frente e insira quaisquer referências ausentes, mas também cria um campo atribuído. Então vou ter que fornecer o melhor método. Com uma instância do contexto, é quase como se uma cadeia de margarida fosse como uma entrega. Então Albert chamando o contrato para o modelo de carro i, saberá que sua implementação é esta. Quando isso é chamado, ele vai, ele busca o contexto do contêiner do COI e diz: Ok, base, que é nosso Repositório genérico. Aqui está uma cópia do contexto que eu tenho. Então, ambos estão no mesmo segmento de contextos, certo? Não. E então também tenho a implementação do custo dos métodos para o repositório. Neste ponto, obtenha modelos de carros por microfone. Nem vou fazer muito trabalho duro. Eu só vou saltar de volta para criar passeios em carros. Temos o método create que tem todos esses. Só vou copiar tudo isso. Volte para o meu repositório de modelos de carros. Vou colar tudo isso. Assim, os modelos VAR serão iguais aos nossos pesos, contextos ou renomeação. Vamos renomear isso nos contextos quadrados. Então eu espero os modelos de carros de ponto de contexto onde tudo isso, e então vou apenas retornar modelos. Estou recebendo esse erro porque não é o assíncrono, torne o método assíncrono. E lá vamos nós, Tudo não é bom. Então, agora temos um repositório de clientes que pode nos fornecer a funcionalidade personalizada para essa consulta SQL personalizada. Esse ponto na criação de outra divisão e veja se tudo, todas as mudanças que o fazemos sempre pressionando Control S neste repositório. Não preciso ter o repositório genérico para um modelo de carro porque isso será usado mais de uma vez. Este modelo de carro sim, repositório de modelos de carro está sendo usado para que nossas necessidades sejam usadas para obter toda a lista de modelos de carros, bem como obtê-los em relação ao ID de identificação. Na verdade, posso substituir o olho genérico repositório de modelos de carros AI. Este não é o genérico, este eu preciso do método costal, obtendo-o pelos mansos. E então eu não posso simplesmente nenhuma linha vermelha porque ainda tem acesso a tudo bem. Estou recebendo uma linha vermelha e acho que isso é porque não consegui herdar. Peço desculpas, eu deveria ter herdado do repositório genérico neste momento em relação ao modelo de carro. Tudo bem, então da mesma forma que a interface estava herdando ou a implementação herdada do genérico. A interface é herdada do olho genérico, para que possa ver todo o trabalho que o genérico pode fazer, além de lhe dar seu próprio trabalho. E, em seguida, deixe-me voltar para a implementação. Não há erros aqui porque eu já estou fazendo referência à implementação, que basicamente a ideia é interpretar que é aí que o trabalho para ele ficar alto e todos os outros para o R genérico, bem como os métodos personalizados definidos pelo contrato personalizado, serão implementados aqui. Quando eu pulo de volta para o Create. Não, a linha vermelha se foi. Lá vamos nós. Tudo bem, então para esta parte disso, eu posso realmente devolver um novo peso. Meu ponto de repositório de carros obtém modelos de carros da Meek, dando-lhe o Meek ID que entrou como um parâmetro. O que elimina todo esse código. Não preciso desse código. Você verá mais uma vez, se esse código mudar, eu só tenho um lugar para alterá-lo ou ele apenas me parece, isso parece muito mais limpo do que ter a nota escrita do código de contexto em vez da página. Isso parece muito mais limpo. Mais uma vez, se funcionar, é bom. É apenas uma questão de quais são seus objetivos e você precisa e sustentável até certo ponto ou quais são os problemas que você está tentando resolver? Não faça isso apenas porque você conhece o padrão e eu preciso segurar para fazê-lo, porque ele está resolvendo um problema que você tem. Esse é o nosso ajuste aos modelos de carros. Para criar BH em vez disso, observe que eu sou um modelo de carro genérico porque temos esse novo repositório que é personalizado e ele precisa ser injetado. Preciso deixar o aplicativo que temos outro que possa ser injetado. Eu esculpi para o genérico, recebendo um erro aqui porque isso muda o namespace, não há problema. Mas também preciso adicionar escopo para que o novo cliente nasça, certo? Então eu fui dizer Adicionar suporte de tipo escolar, modelo de carro, repositório de modelos de carro, coma. E a implementação disso será repositório de modelos de carros. Essa é a diferença em termos de dimensões. Então, porque este é genérico, quem recebe atrás de um diferente, mas de um modo geral, é assim que você verá a interface ou o objetivo de emparelhamento de contrato e implementação quando eles estão sendo registrados no o contêiner do COI. Tudo bem, então isso é realmente o que temos que fazer para garantir que ele funcione. Vamos voltar para a parte de detalhes do carro. Bem, as partes de detalhes dos modelos de carros têm uma história semelhante em que, em qualquer lugar , temos o modelo de carro genérico, poderíamos realmente usar nossa classe específica que acabamos de definir o repositório de modelos de carro. Em vez do genérico. Isso é o que estamos usando sempre que estamos lidando com modelos de carros porque métodos personalizados, como obter o modelo do carro com os detalhes, não são necessários. Neste repositório. O que vou fazer é saltar de volta para o nosso contrato. E eu vou criar outro método que vai dizer retornar apenas o modelo do carro. E fui ver o modelo do carro com detalhes. Então temos que lhe dar a ideia do modelo de carro que queremos recuperar com detalhes. Agora, uma vez que eu tenha feito isso e coloquei essas pequenas guias aqui para que eu possa navegar facilmente para o arquivo. Então, se você não tem essas banheiras que acabei de mostrar, você pode ir para Ferramentas, Opções, ir ao editor de tomadas C, depois C-afiado do que avançado e garganta até o fundo. E diz mostrar herança de março, e é experimental. Então, eu vi isso funcionar para algumas pessoas e não para algumas pessoas. Isso é só para que você possa habilitar isso. Por isso, torna a navegação entre as classes pai e filho , na medida em que a herança é muito, muito mais fácil. Tudo bem, então agora há um novo método a ser implementado. Só vou controlar implementado. E então verei aqui que, se eu estiver recebendo com detalhes, o que você precisa retornar é meu contexto. Modelos de carros de ponto, dot find não são encontrar modelos de carros que incluem e eu fui incluir minha propriedade de navegação para o microfone. Tudo bem, então no final de todos os padrões da primeira loja LLC. Expressão do Lambda em que o ID no registro é igual à ideia que estou procurando. Então, sempre que chamássemos isso, sabemos que temos a garantia de ganhar dinheiro nos modelos de carros com quaisquer inclusões. Se chamarmos isso de get, o regular recebe seu genérico, eles são irritantes do Tod. Isso é tudo o que podemos colocar novamente em métodos específicos para o repositório específico, por um motivo específico. Vamos voltar para os detalhes agora. E posso substituir isso por modelos de carro get pelo nosso modelo atual com detalhes. Eu sei que quando o modelo de carro voltar, definitivamente vai ter a propriedade de navegação para o tipo de leite incluída. Para os cartões. Temos um problema semelhante. Precisamos de métodos personalizados para que o repositório de carros possa recuperá-los com detalhes. E para o índice, precisamos incluir os detalhes lá. Também. O que vamos fazer é repetir ou pés. Teremos um contrato personalizado e nossa implementação personalizada em nosso projeto de repositórios. Então, aqui está o que o contrato vai parecer. Eu carro repositório mais uma vez, herdando do repositório genérico em relação ao carro. Então temos nossa tarefa. carro pode pegar o carro com detalhes. E a implementação do NOR vai dizer que repositório de carros herdando do repositório genérico em relação ao carro e ao contrato. Então, tudo é injetado assim como temos feito até este ponto. E então temos o método obter o carro com detalhes, é claro que eu o fiz assíncrono e um peso e o mesmo código que estava na página de detalhes, eu apenas cortei e colei-o aqui. Eu pesei que os carros de ponto de contexto incluem todos esses detalhes e obtive o primeiro ou o padrão. Buck em nossa página de detalhes, podemos começar não injetando mais o contexto, mas agora podemos injetar um repositório de carros ou repositório de carros. Isso seria, eu posso simplesmente chamar isso. O repositório ainda é apenas um lá. Não há problema. Repositório. Inclua referências ausentes, vá em frente e crie NSA e o campo. Eu removo todos os traços do contexto e, em seguida, adiciono o sublinhado apenas para minha tranquilidade onde estamos recebendo, eu apenas digo o ponto do repositório obter o carro com detalhes e dou o valor do ponto id. Se eu não expliquei antes porque é pequeno, múltiplo, eu tenho que ver o valor do ponto id. E, claro, depois disso. E, como eu disse, fiz algumas refatorações no Visual Studio mudaram muitas coisas lá em 1. Então, alguns dos meus tipos de dados estão errados. Mas depois de consertar isso e tenho certeza que ele não teve esse problema. Você verá aqui que tudo está bem com nossa página de detalhes. E isso parece muito mais limpo. Então, temos que fazer algo assim para o índice. Agora, eu digo algo assim para o próximo porque isso é múltiplo, esta é uma lista inteira com os detalhes. Preciso de outro método aqui que esteja realmente me dando a lista. Fora do carro. Fui dizer, pegue carros com detalhes. E não obterá nenhum parâmetro. E isso deve ser uma lista. Vamos pegar a lista de carros com detalhes. Não há problema. Implementação Kohlberg até aqui, interface de implementação de lote controlado. E vou repetir essa declaração de retorno aqui. Portanto, retorne o contexto dos carros com toda a lista de pontos inclusivos. E precisa ser uma coisa tão controlada, faça método Async e com um ponto e vírgula e tudo bem. Então, em nossa página de índice, tudo isso não pode ser Repositório e claro, preciso atualizar o construtor e a injeção. Então eu só vou atalho. Basta copiar um semelhante, alterar as poucas setas. E então eu posso notar um ponto do repositório obter cartões com detalhes e fechar isso, é claro, depois de 08. E isso é basicamente que parece perder os tipos de dados mistos e devemos estar prontos para ir. Em outros lugares. Vamos ter o on post delete, sem problemas. Então, não preciso encontrar nada. Não preciso verificar se carros não. Em vez disso, se o registro IT NÃO FOR nulo, verei o repositório. E, claro, terei que aguardar este repositório Dot Delete e damos a ele o valor do ponto do ID do registro. É isso. Nenhum código bom e limpo que você nunca quis codificar por trás disso enquanto as instruções e todas as operações complexas e assim por diante. Você quer abstrair essa ALT. Tudo isso deve fazer é chamar um método, abrir a porta no mito, fazer o trabalho duro. Eu chamo o método e aguardo a resposta. Você faz todo o trabalho e apenas me diz qual é o resultado. Fui até este ponto, construí apenas para ter certeza de que fiz todas as alterações necessárias. E eu tenho uma seta porque na minha startup eu tenho o namespace com erros ortográficos, mas preciso ter certeza de que eu tenho. Antes do repositório do carro, vou mostrar que tipo de erro você verá se não adicionar a falha ao registrar seu serviço. Então, ele só vai para o Control F5 para ser executado sem depuração. Obtendo essa outra flecha porque eu tinha renomeado manso para misturar. Tudo bem, então deixe-me tentar isso de novo. Controle F5. E nosso aplicativo está procurando combinar cores e modelos apenas para garantir que estamos vendo os dados. Então, vemos aqui que nossos repositórios estão funcionando. Se eu clicar em Editar, fazer uma alteração e salvar, veremos que as alterações foram salvas com sucesso. Então, sabemos que os repositórios trabalhando nesse sentido, se olharmos para os outros que vêem todos eles voltando. Então, se eu clicar nos detalhes dos modelos, você verá que o microfone está chegando, os detalhes estão voltando. Agora, se eu clicar em carros, vamos fechar todos esses e vamos clicar em carros. Agora veja isso que você está vendo incapaz de resolver o tipo de serviço para repositório i cars enquanto tenta ativar modelos de pontos de índice. Então, essa é apenas uma maneira extravagante. Vou ver. Você esqueceu de colocar o registro no arquivo de inicialização porque não fizemos isso. Você percebe que tudo funcionou bem para modelos. Todos eles funcionam bem para o modelo. É o mesmo conceito. Então, porque não registramos, ou seja, carro, então vou dizer que o repositório de carros é implementado pelo repositório de carros. Inclua quaisquer referências ausentes ou desculpe, são carros. Continue esquecendo disso. Isso é repositório de carros. Lá vamos nós. Posso apenas fazer uma compilação e atualizar a página ou reescrevê-la em D, sem depurar e clicar na página do curso. Sei que está carregando. Você vê que você obtém isso bloqueia um erro. Se você esquecer de seu registro de serviço. E, por extensão, veja isso. Estamos vendo todos os nossos detalhes. Se você for para Editar, estamos vendo todos os detalhes. Se formos criar ou uma lista suspensa em cascata ainda operamos como esperamos. Tudo bem, então essas são pequenas mudanças que você quer fazer nossas próprias férias de dúvida. Essa é a chave limpa. Mas, mais uma vez, não porque você tenha um martelo, tudo deve parecer um Neil. Muitas vezes aprendemos um padrão e a nave estamos vendo a coisa, usamos esse botão. Alguns aplicativos são simples o suficiente para que você não precise adicionar esse nível de abstração e complexidade a ele. Mas, no final do dia, vemos onde ele definitivamente vai. Um firewall, ele aumentando Quão sustentável o aplicativo. Ele vai ser. 29. Conclusão da seção de repositório: Tudo bem, então, se você virar outro marco e nós vamos fazer o check-in em direção ao repositório do GitHub. Então, vamos fazer uma rápida recapitulação do que passamos nesta seção. Em primeiro lugar, identificamos que queremos reduzir parte da repetição do trimestre e aumentar a capacidade de manutenção geral e a testabilidade de nossa aplicação. Então, a etapa número um para fazer isso era criar ou repositórios. Então criamos o que chamamos de repositório genérico que tinha muito, o que devo dizer, não, genérico para uma, mas muito abstrata maneiras de declarar forma básica mostrada é que todos os elementos do banco de dados precisarão para realizar. Ao fazer isso, conseguimos usar dois arquivos para compensar muitas tabelas de banco de dados. Então, entre o repositório genérico , no repositório genérico, temos cobertura de código suficiente para quase qualquer dos cenários básicos para cada uma de nossas tabelas no banco de dados. Por extensão, somos capazes automatizar certas coisas que teríamos que fazer em um monitor personalizado ou em vários lugares. Em toda vez que criamos um elemento, conseguimos automatizar isso independentemente de qual elemento está sendo criado ou sabemos como obtê-lo até a entidade de domínio base, que cada elemento será. Todas as entidades ou outras serão. E quando ele está sendo adicionado, podemos ir em frente e modificar tudo antes de realmente confirmá-lo no banco de dados. Portanto, essas são operações muito importantes no que estamos fazendo. Depois de termos nossos repositórios genéricos, também percebemos que havia certas operações que precisavam de um toque personalizado. Então, em vez de tocar no material genérico, entramos na cabeça e o estendemos. Portanto, ser capaz de estender uma classe sem modificar a classe principal, esse é o princípio de Liskov e esse é o L em sólido. Estamos analisando a injeção de dependência porque em nenhum lugar criando objetos que possam ser injetados à vontade, estamos olhando para seco, o que é não se repita. Estamos analisando a segregação de interface, é por isso que temos todos esses contratos e suas implementações. Número de princípios que vão para os quatro anos. Então, o que queremos estender? 104 já implementaram repositórios e viram sem a sobreposição, modificando-o e vendo bem, repositório genérico, coisas domésticas específicas para outra coisa. Criamos nossos específicos, eu um repositório de modelos de carro com apenas operações relacionadas ao modelo de carro que exigem pouco toque personalizado. Temos a implementação e temos o repositório de carros também. Eu disse de, acho que nosso modelo anterior seria bom quando estamos adicionando um carro para ver se a divisão da licença existe e se isso acontecer, não o adicione, eu me lembro de ver que seria bom de fazer. Nunca chegamos a fazer isso. Vamos apenas ver como isso ficaria. Mais uma vez, qualquer coisa que você precise, você o colocará no repositório relativo. Então, neste caso, vou duplicar isso. Desculpe, é modelo de carro que eu queria nos carros. Então, vou duplicar esse método. Isso só retornará um booleano. Booleano vai ver que o carro é lição dividida existe. Isso levará um número extremo da placa. Eu só vou dizer que jogue o número. Esse é o parâmetro. Mais uma vez, se tivermos dentro da interface, passaremos para a implementação. E então ele vai ser concluído e vamos em pontos de controle, deixamos que ele implemente a interface. E então eu posso retornar o contexto. Por favor, olhe na mesa de carros e me diga se há algum. E, claro, usamos nosso assíncrono. Qualquer número de placa de matrícula q-dot assíncrono sendo igual ao número da placa que veio. Embora, por serem uma string, você provavelmente gostaria de colocar tudo em baixo porque maiúsculas é diferente da minúscula é menor. Outra coisa que você gostaria de fazer é provavelmente apará-la de qualquer espécie que possa estar no altar. Alcança. Com esses dois feitos para o que está no banco de dados, você também queria que fosse o valor possível. Tudo será minúsculo e tudo será cortado de todos os espaços em branco. E então vamos verificar se há algum. Então eu tenho que aguardar esse controle de pontos. O método Async. Agora isso é estendido, agradável e fácil. Se quiséssemos incorporar esse nó de verificação em nosso Criar e por extensão, a operação de edição. O que posso fazer é fazer meu próprio cheque aqui para ver se consigo ver no repositório de pontuação ou nos pontos do repositório de carros. Basta começar a digitar lições divididas até eu vê-lo. O que eu não estou, não estou vendo nada porque este ainda é o genérico. Não há problema. Estou usando minha fantasia. Eu carro repositório e posso substituir isso em todos os lugares para que a injeção funcione corretamente. Certo. Todo mundo é bom. Sono caminho. Se eu olhar para trás, veria que tenho acesso aos métodos personalizados é menor do que a divisão existe. E então eu passava o número da placa do carro que vem do formulário. Se existir. O que eu queria fazer é tornar o estado do modelo inválido porque nenhuma placa de licença está presente, ela é válida. Quero que seja inválido. Isso está em vigor para que eu possa dizer estado do modelo, adição de pontos, erro de modelo. E isso leva dois parâmetros. Ele diz qual é o campo que você quer que eu adicione a ferramenta de erro e qual é o erro para o campo? Você pode usar uma string, mas depois mostrarei o perigo ou um dos problemas que usam o fluxo assim. Tudo bem. Quero que ele seja adicionado a este campo. E a mensagem deve dizer que número de divisão da licença já existe. No momento em que eu terminar adicionar o erro do modelo e ele chegar a essa instrução vai ver que ele não é válido porque há um erro. Eu fiz isso. E então ele recarregará o pH mostrando o erro sob o campo. Você pode experimentar isso. Não vou testar isso. Esse não é o ponto que estou tentando empurrar. O que eu estava dizendo sobre o campo é que por causa da digitação forte e se for um caso acabamos mudando o nome desse campo, teríamos que lembrar que temos que atualizar a string. Ele não mudaria automaticamente. Então, para manter o forte desejo do que fazemos é ver o nome de que passamos o nome direto da variável. Então, ele irá apenas convertê-lo número de matrícula e saber que essa é a mulher de campo. Esta é a mensagem de erro. Não há problema. Só estou mostrando como é fácil saber apenas estender a funcionalidade. Já foi injetado. Tudo o que fiz foi alterar o tipo de dados, que é uma operação única. Como você precisa estendê-lo, basta colocar outros métodos e usá-los para vontade. Isso é tudo o que teria sido necessário para estender essa funcionalidade para que você possa prosseguir e testá-la. Como eu disse, temos que fazer isso na Edit também. Então deixe-me fazer isso e certifique-se de que temos cobertura total. Antes dessas postagens. Temos que fazer isso. repositório Kiara mais uma vez é o genérico. Então eu tenho que dizer aqui, repositório de carros. Tudo bem. Altere isso. Acho que os repositórios podem ter seu próprio namespace, mas vou consertar isso. Tudo bem. Nesse ponto. Isso é tudo o que realmente precisamos fazer para garantir que nossos contratos e tudo sejam extensíveis. Então você pode ir em frente e testar isso. Sinto muito, só estou tentando encontrar o que eu precisava mudar. O que são os outros. Inclua seu repositório de carros. Desculpas. Tudo bem, então IQR é repositório e então tudo deve ficar bem. Ele usará instruções necessárias, todos os erros desapareceram e o mesmo tipo de validação acontece quando editamos. É assim que é fácil adicionar validações personalizadas por causa de nossos métodos de banco de dados personalizados. Conosco. É isso, acabei. Vamos com boas mudanças. Mais uma vez, obter mudanças devem ser para a sociedade. Caso contrário, você vai para a visualização e abre a janela, obtém alterações. Você colocará sua mensagem de commit. E então você pode apenas comprometer tudo e afundar. Isso empurrará suas alterações para o GitHub, retirará todas as alterações feitas por seus colegas de acordo. 30. Configuração de autenticação do usuário: Pessoal, bem-vindos de volta. Então, neste momento, temos muita funcionalidade funcionando para nós. E mesmo que não pareça tão chique, você chegou à percepção ou compra sabe que todos os aplicativos estão fazendo, estão lendo do banco de dados, atualizando dados, colocando dados lá ou removendo dados. Isso é tudo o que está realmente lá para ele. Não importa o quão complicado possa parecer. Todos os fundos comem podem parecer. Isso é tudo o que se resume. Se você quiser estender este aplicativo para fazer mais coisas, colocando mais mesas, quero dizer, é chamado de reserva de carro. E nós hoje É tudo o que estamos fazendo é colocar nos carros. Se você quiser ser capaz de colocar na reserva real do que nenhum problema. Vejamos fazer isso. No entanto, antes de colocá-lo nessa funcionalidade Beta, eu queria proteger o aplicativo até certo ponto, porque não precisamos de um. Precisamos ser capazes de saber quem está fazendo o quê em nosso aplicativo. Neste ponto, qualquer um pode simplesmente executar o aplicativo e começar a adicionar carros, adicionando-me modelos empolgantes. Queremos restringir certas coisas a um usuário que registrei que conhecemos. E, mais tarde, analisamos como podemos ficar níveis entre os diferentes usuários que são capazes de fazer as coisas em nosso aplicativo. Vamos começar estendendo nosso contexto de banco de dados para poder lidar com operações relacionadas ao usuário. Isso é realmente mais simples do que parece. Tudo o que temos a fazer é, em vez de dizer contextos de banco de dados, dizemos identidade, contexto de banco de dados. Identidade é a estrutura ou a biblioteca dada a nós pelo dotnet core para começar a adicionar operações relacionadas ao usuário ao nosso aplicativo. Portanto, vendo o contexto do banco de dados de identidade para a herança, eu controle pontos. Você verá que preciso incluir algumas novas bibliotecas. Estamos usando o NuGet fim de semana para dizer instalar o pacote, encontrar e instalar buds. Lembre-se de que tivemos alguns problemas de controle de versão com o Entity Framework Core e a versão da biblioteca. Na verdade, é mais seguro usar o NuGet manualmente. Então, vou clicar com o botão direito do mouse em Gerenciar pacotes NuGet. E para o nosso instalado, sabemos que estamos trabalhando com 5.8 agora. Então, vou para os manos e vou procurar identidade. Só digo que tenho sido identidade, núcleo de identidade e, em seguida, vemos a identidade Microsoft.ASP.NET Core no Entity Framework Core. Então esse é o que queremos e, em seguida, estamos lidando com 5, ele. É assim que você usa o gerenciador de pacotes NuGet para garantir que todas as versões estejam no mesmo fígado. Então eu pressiono em Instalar, permitir que ele faça o seu negócio, aceito qualquer problema que surja. Quando isso for feito, posso voltar para o meu contexto de banco de dados e incluir a instrução de uso ausente. Lá vamos nós, e todo mundo está feliz. Tudo bem, com boa aparência até agora. Não. Em nosso, ele começa fora do arquivo. Veremos que temos um pequeno erro aqui onde estávamos adicionando os contextos de banco de dados. E está dizendo que precisamos das declarações de uso. Então eu só vou para Controlar pontos. E diz instalar a referência do pacote desses dados ou apenas adicionou uma ferramenta de referência. Só vou adicionar a referência. Em vez disso, vou usar apenas uma versão local. Então, vou usar a versão local. E essa é outra força do gerenciamento de pacotes. Isso nos permite garantir que não estamos, que todas as nossas versões estejam no mesmo nível. Então saiba que o erro desapareceu e sempre ainda está na inicialização. E o que precisamos fazer é informar a inicialização que usaremos serviços de identidade no aplicativo. Então eu fui dizer que a adição de pontos de serviços deve ver a identidade padrão. Se não, então na identidade, lá vamos nós. Assim, você pode adicionar o núcleo de identidade. Adicionando conhecimento do núcleo de identidade, eles dirão quais tipos de usuário, o tipo de usuário padrão que você obtém com identidades, usuário de identidade. E nós analisamos como isso pode ser estendido em alguns. Mas vamos adicionar com usuário de identidade colocado nas instruções de uso ausentes e, em seguida, podemos passar as opções se quisermos. Então, quando digo que pode passar em opções, posso ver opções com uma expressão lambda, opções. E podemos explorar diferentes opções que queremos ir para nossos usuários. E há cones. Por exemplo, o que vamos fazer é ver opções em um login exigem um cone confirmado para saber como quando você se inscreve no nosso site e eles enviam o Tolkien para dizer, por favor, confirme o cólon 's, o que é até a data de vencimento. Você não pode realmente fazer login. Bem, isso é o que podemos fazer valer aqui. Posso ver exigir conta confirmada. Por padrão, será necessário. Então, na verdade, vou dizer que é igual a falsa. Só porque é uma aplicação interna, provavelmente não vou passar pelos rigores pedindo a ninguém que confirme seus cones de qualquer maneira. Mas só estou mostrando o que é possível. Então você tem várias opções à sua disposição. E se você precisar definir vários, basta fazer isso usando um bloco de objetos. E você encerra cada linha com um ponto e vírgula e adiciona quantas opções precisar. Estamos adicionando núcleo de identidade em relação ao usuário de identidade, que é uma classe de usuário padrão dada a nós pela estrutura de identidade ou núcleo de identidade outro. E então podemos dizer adicionar regras. Se quiséssemos usar regras, podemos dizer que quero usar regras na classe de linha. Há um padrão na regra de identidade. Mais uma vez, podemos personalizar isso. Geralmente não personalizo esse, para ser honesto, geralmente uso uma regra padrão. Então, no final disso, precisamos dizer a ele Armazéns Add Entity Framework. Então, preciso dizer onde estamos armazenando nossas informações de usuário? Então, seria realmente pedir nosso contexto de banco de dados. quais contextos devo usar para inferir qual banco de dados preciso armazenar as Em quais contextos devo usar para inferir em qual banco de dados preciso armazenar as tabelas relacionadas ao usuário. Agora, o problema é que algumas pessoas gostam usar o mesmo banco de dados para aplicativos e coisas relacionadas ao usuário. Algumas pessoas os separam. Nesta atividade, vou mantê-lo simples e vou usar o mesmo contexto tanto para as coisas comuns quanto para as coisas do usuário. Mais uma vez, algumas pessoas se separaram. Então, se você quisesse separá-lo, criaria outro contexto de banco de dados. Assim como tudo o que temos este aqui. O que você poderia fazer é deixar este como apenas herdando de contextos de banco de dados e ele cria outros contextos de banco de dados que herdam de contextos de banco de dados de identidade. Não precisaria de nenhuma mesa porque você verá como herança de justiça nos dará as tabelas que queremos. E então você ficaria bem. E é claro que você teria que ter a outra cadeia de conexão aqui. E você configura seu contexto de banco de dados de acordo ou seu contexto de identidade de acordo. É preciso alguns bits de configuração, mas mais uma vez, o caminho simples usando um banco de dados, já temos o contexto. Só precisamos dessas três linhas. E, em seguida, podemos adicionar o aplicativo de armazenamento Identity Services. E saberá que ele deve estar procurando esse contexto de banco de dados para todas as suas necessidades de conectividade. Tudo bem, então com tudo isso feito, podemos ir ao nosso Console do Gerenciador de Pacotes. E quando temos isso aberto e em execução, podemos alterar o projeto padrão como sabemos. Nós o definimos para dados. E eu direi adicionar Meu concordo. Eu fiz tabelas de usuários. Agora observe que eu não fiz nada. Não criei uma nova entidade. Eu não fiz A única coisa que fiz no contexto do banco de dados para fazer a herança mudar. Mas veja o arquivo de migração que é um barco a ser gerado. Então, estamos recebendo uma migração migra. Olhe para toda essa grande agregação. Até agora, você deve estar familiarizado com as migrações. Vou apenas apontar quais tabelas estão sendo criadas. Obtendo um para as regras, um para os usuários. E você vê todos os campos sendo gerados para o usuário. E todos eles são relativos aos usuários de identidade. Então, apenas vendo o usuário de identidade aqui, estamos recebendo todos esses campos estavam recebendo reivindicações de rove, reivindicações de usuários e um monte de outras tabelas com um monte de coisas. Alguns deles você talvez nunca use qualquer cria os índices e chaves estrangeiras. E então, claro, não desfaça tudo isso. Isso é o que apenas mudando a herança de contextos VB, esse contexto de banco de dados de identidade, é isso que a mudança resulta. Dentro do console do Package Manager. Se eu atualizar banco de dados e permitir que ele tenha o seu caminho com o banco de dados, o que você notará é no banco de dados que recebemos um monte de novos tubos dirão se eu apenas fizer uma atualização rápida e olhar no banco de dados e nas tabelas que temos. Você verá que temos todas essas novas tabelas sendo adicionadas ao banco de dados. Apenas deixe isso aí. Você está colocando em suas tabelas de usuários. Ele sabe onde armazenar as informações do usuário e você não precisa se sentar e escrever nenhum código personalizado. E qualquer código personalizado que você está prestes a escrever é realmente por causa das necessidades de sua empresa. Porque ele queria consertar na maioria desses, mas fora da caixa, as bibliotecas de identidade conhecem essa alma Paul comida e tão fácil. Então, quando voltamos, o que olhamos é estender tabela do nosso usuário porque agora os usuários estáveis, sim, tem muitas colunas, mas você notará que elas não são necessariamente colunas úteis em de como um ambiente de negócios ou ideias. Temos uma identificação, sim ou não. Eu uso um nome e um e-mail, mas não sabemos o nome da pessoa. Não sei qual o usa. Isso é apenas baseado em seu nome, FirstName, LastName, até mesmo data de nascimento, qualquer coisa que você queira armazenar o usuário e apenas imaginar este aplicativo como um aplicativo será usado em acompanhe qualquer empresa em que você esteja. Você, eles querem saber quem você é quando você faz login. Eles não querem poder ver todas as informações. Bem, é aqui que ele começa a armazená-lo. Quando você é criado neste sistema, eles geralmente colocam em ordem. É quando voltarmos, veremos como podemos estender a mesa à vontade. 31. Amplie a tabela de usuários: Tudo bem pessoal. Então, na última vez que estivemos aqui, estávamos procurando configurar as tabelas de identidade em nosso banco de dados. Agora precisamos saber como podemos estender essas tabelas para assumir campos diferentes. Vamos começar com o usuário de identidade. Ele fecha alguns campos, o que eu quero mais campos. Uma maneira fácil de fazer isso seria nos dados, basta criar uma nova pasta. Vou ver identidade para que saibamos que qualquer coisa neste buraco está relacionada à identidade. Então eu tenho uma aula, então você pode nomear a classe qualquer coisa. Então, o nome mais popular que você veria o usuário do aplicativo. Mas, mais uma vez, o que você chama? Cabe a você, sua operação e seu objetivo. Digamos que o usuário do aplicativo. É uma classe pública que herdará os traços de caráter de um usuário de identidade. Usuários de identidade, o usuário padrão, vou dizer, tudo bem, bem, você tem tudo o que um usuário padrão tem. Mas você também tem, é aqui que podemos começar a colocar em String primeiro nome, sobrenome. Se você quisesse colocar um ID de funcionário, ainda é voo ou qualquer coisa exclusiva dessa pessoa. Então, vou parar no primeiro nome e sobrenome. Data de nascimento, acho que adicionar a data de nascimento seria uma boa atividade. Data de nascimento. Tudo bem, é isso. Não, precisamos do usuário obrigatório de ser a classe de usuário padrão sempre que estamos fazendo nossas operações que temos acesso aos campos adicionais no lado do código, mas também precisamos estender o banco de dados a ser armazenado nesses campos. Então, uma inicialização, eu preciso alterar o núcleo do AD Identity de apenas ver usuário de identidade para saber ver usuário do aplicativo em código sempre que estamos fazendo algo usuário, relacionado ao usuário, em vez disso, ele usará esse tipo de dados e nos dará acesso a esses campos. Para o banco de dados, precisamos saltar de volta ao nosso contexto e ao contexto de banco de dados de identidade posterior , nem por colchetes de ataque que ele deveria estar usando. E se você olhar os colchetes de tipo, diga me dê o usuário t. Se eu tentasse o cartão, vamos o carro IV funcionaria. Eles estão apenas querendo uma aula se eu usasse carro, não, os turnos da era, ele dizia que não pode ser usado como um parâmetro de tipo para o usuário t. Foi o que ele disse. Lembre-se quando estamos falando genéricos e tipos de dados, ele diz T user, onde o usuário é do tipo usuário de identidade. Portanto, tem que ser alguma entidade que seja do tipo usuário de identidade, como o usuário do aplicativo que acabamos de deixar herdar. Então eu posso saber, colocar o usuário do aplicativo lá e todos estão felizes. Saiba que o contexto de banco de dados sabe que estou usando o usuário do aplicativo se eu fizer uma nova migração. Então fui dizer que fiz usuário, fiz mais campos de usuário como minha migração. Ele vai reavaliar saber e dizer, ok, estou lidando com um novo tipo de dados. E esse novo tipo de dados tem colunas que eu não respondi, como data de nascimento, FirstName e LastName. Por favor, vá em frente e adicione-os ao banco de dados. Ele está adicionando essa coluna à tabela de usuários do ASP NET. Essas colunas. Quando faço a atualização, termina com sucesso. E então, se eu olhar para trás para minha ideia de ser estável, depois de uma rápida atualização, saberei que meus novos campos bem exibidos na tabela de usuários do ASP NET. Nome, sobrenome e data de nascimento. É assim que você pode estender suas aulas quando estiver lidando com as operações relacionadas ao usuário. Só para vê-lo, poderíamos ter uma regra de identidade estendida. E se as regras estáveis não tivessem informações suficientes ou tantas informações quanto você gostaria. Tudo o que ele tem é um ID de usuário. Desculpe, esse é o errado. Seus papéis, papéis que são atrás, as regras chamaram nome normalizado, sistema de órgãos crônicos. Não sei o que mais você provavelmente gostaria de adicionar a ele, mas estou apenas mostrando que da mesma forma que podemos estender o usuário do aplicativo pela herança e, em seguida, usá-lo no lugar. Off é da mesma forma que você pode estender papéis ou qualquer coisa que tenha a identidade do prefixo praticamente na frente dela. Então, tudo o que fizemos foi apenas configuração. Quando voltarmos, veremos como podemos configurar nossa página de registro e permitir que os usuários façam login. 32. Página de registro de configuração: Pessoal, bem-vindos de volta. Na última vez que estivemos aqui, estávamos falando sobre deixar os usuários se registrarem e fazê-los login. Então, vou colapsar tudo o que vamos apertar ou em qual projeto vou fechar todas as guias que não são diretamente necessárias. E dentro do nosso aplicativo, posso clicar com o botão direito do mouse, ir para Adicionar. E vou ver um novo item arrancado. Agora, nessa caixa de diálogo, você verá que há uma categoria que diz identidade. Quando eu clico duas vezes em Identidade, ele fará é que ele verificará. E então ele passa a evoluir para a tela onde diz Adicionar identidade. Você pode substituir todos os arquivos. Então, o problema é que quando você obtém o arquivo de modelo é realmente meio que, eles ficam ocultos de você porque nenhum lugar vimos nenhuma página de login ou registro, elas ficam meio ocultos. Mas quando queremos substituí-los, podemos facilmente dizer que queremos substituir como ou podemos escolher os que queremos substituir. Nesta situação, gostaria de substituir a página de registo e o contexto em que deveria ser relativo à sua reserva de carro no contexto DB. Eu não preciso adicionar a classe de usuário ou qualquer outra coisa para não, tudo o que eu quero é registro. E então ele pode ir em frente e clicar em Adicionar. Levará algum tempo para fazer o andaime. Claro. Quando terminar, obtemos esse arquivo README. Certo? Nós realmente não precisamos disso, mas se você olhar, verá que temos uma nova pasta chamada áreas. E se você detalhar, verá páginas de identidade e, em seguida, obtém alguns novos eleitores. Não faça esse arquivo de registro. E se você notar, esta também é uma página do Razor. Por padrão, esses uber são um PHs independentemente da temperatura do projeto usando. Então, vamos ver o registro que nos dá o CSS. Html5 nos fornece um formulário onde recebemos uma entrada para e-mail sobre trilhas onde eles queriam confirmar a senha. Sabemos que temos outros campos de que precisamos, para que possamos sempre estender isso conforme precisamos. No código de registro por trás dele, você notará que ele está injetando. Sim, ele nos pede o contexto do banco de dados, mas observe que não está injetando um contexto de banco de dados. Em vez disso, ele está injetando o que chamamos de gerenciador de login e gerenciador de usuários. Eles são relativos ao usuário do aplicativo. Só estou mostrando que tudo está conectado. O raciocínio para ver o usuário do aplicativo e não o usuário de identidade está na inicialização. Dissemos que quando você adiciona identidade, qualquer coisa relacionada à identidade, usa usuários do aplicativo. Portanto, nenhum código degenerado sabe que não é identidade que a voltagem do usuário é o usuário do aplicativo. Observe que isso não deu uma flecha porque eles poderiam ser usados de forma intercambiável. No entanto, não irei contra o código gerado e analisarei o fato de que temos o gerenciador de login, bem como o gerenciador de usuários. Portanto, essas são bibliotecas internas fornecidas a nós pela biblioteca do núcleo de identidade. Isso é o mais baixo, o identificador de operações relacionadas à assinatura e qualquer coisa que o usuário operou basicamente obtém relacionados ao usuário, desculpe, operações, obtenção de um usuário, alterando algo sobre o usuário, etc. Então, tudo aqui está sendo injetado e você verá que há um remetente de e-mail. Ainda não implementamos nenhum serviço de e-mail. Este é realmente apenas um detentor de lugar que pode ser sobrescrito mais tarde. Também obtemos o registrador de olhos, que é relativo à página em que estamos. Se você notar no topo, temos esse atributo que é sua permissão anônima. Então, analisamos mais atributos mais tarde quando estamos discutindo como podemos permitir no Auth0 autenticado versus certas partes do aplicativo versus como podemos bloquear certas partes do aplicativo. Então, vamos seguir em frente. Neste modelo que foi gerado para nós, você vê que temos comprando imóveis acima dessa entrada. Portanto, esse é um padrão que já vimos antes. Se olharmos em nossas páginas, vemos que para o Create, já tínhamos feito algo, geramos algo semelhante a essa propriedade em todo o modelo chamado carro. No entanto, nesta situação, você notará que o modelo é realmente o monitor de entrada é realmente definido aqui dentro da página, uma classe dentro de nós padrões de buff ugandenses, mas estou apenas mostrando-os para você que, mesmo que pareça um pouco diferente, é a mesma coisa. Você terá uma aula. E essa classe tem os mesmos atributos que tínhamos colocado obrigatórios. Este é o endereço de anemia, este é um nome de exibição que queremos que tivéssemos usado todos eles antes e é apenas uma propriedade chamada e-mail onde ver alguns outros, mas eles são as mesmas coisas. Temos a verificação do comprimento da string e esta é uma senha, e então esta está dizendo que é uma senha e deve comparar com a senha acima e mostrar essa mensagem de erro se eles não combinam. Isso é tudo. É por isso que só temos três campos no modelo de entrada, que está sendo usado no formulário. É por isso que o formulário está vinculando a entrada de pontos de entrada de e-mail de ponto de entrada ou a ele. Ponto de entrada confirma a senha. Então, fora de tudo isso e obtenha, é preciso apenas um URL de retorno, podemos nos livrar de algumas dessas linhas de código como esta, logins externos e assim por diante. Não precisamos necessariamente disso. Pelo menos não vamos configurá-los no escopo deste curso. Mas depois que o formulário é enviado, vemos aqui que, se o estado do modelo for válido, é válido em relação a, mais uma vez, todos esses atributos no topo. Criamos um novo usuário do aplicativo passando para detalhes provenientes do formulário, nome de usuário e endereço de e-mail. E então criamos. Então, aqui está nosso gerente de usuários. Dot create Async, um novo usuário usando a senha que foi inserida. Saber que B2B ou senhas sem importância é que você nunca armazena senhas em texto simples no banco de dados? Sim, o usuário só pode digitar a palavra quando você está digitando pastor é o único tipo nas palavras e os números que você as conhece. No entanto, se você visse o que foi armazenado em um banco de dados, nunca o reconheceria. Ou seja, é a defesa número um contra hackers. Hash suas senhas. Saiba o que é bom sobre essas bibliotecas que, chamando esse método, tudo isso é feito para você nos bastidores. Então, na verdade, você nem precisa se preocupar com a segurança do armazenamento de senhas depois de usar esse método para criar o registro do usuário e fornecer a senha como inserida pelo usuário. Se a pessoa foi criada com sucesso, você acabou de registrar isso e, em seguida, geramos o código. Então, quando falamos sobre confirmar seu endereço de e-mail e enviaremos o e-mail. Este é o código que gera esse tipo de conversa por trás da consulta LINQ está vinculada para confirmar. Tudo bem, por favor, confirme seus cones clicando aqui. É assim que esse e-mail de confirmação se parece. Mais uma vez, não temos nenhum serviço imunológico funcionando, certo? E também podemos ignorar esse bit por não. E então eles dizem que se, e então aqui está, exigem conta confirmada. Isso parece familiar? Porque lembre-se quando configuramos o núcleo de identidade, dissemos que você não precisa, não precisamos exigi-lo. Aqui. Estamos vendo se as opções disseram que deveria ser necessário. Em seguida, lemos a página de confirmação do registro, que é como uma página de shell para fingir que você estava clicando no mesmo link aqui. Caso contrário, basta ir em frente e assiná-los. Então é isso que isso está assinando assíncrono é quatro. Então, recebemos todos os erros. Se não conseguir criar o usuário, obteremos os erros e, em seguida, os enviamos de volta no estado do modelo para a página. Isso tem vários. Eu só queria que você entendesse o que esse código está fazendo porque pode parecer esmagador, mas precisamos prestar atenção nisso. Você verá que todas as variáveis, todo o código é escrito de tal forma que, se você acabou de lê-lo, você pode realmente acompanhar o que está acontecendo em cada ponto. Vamos testar ou uma página de distribuição. O que farei em nossa página de layout compartilhado. Oh, notei que também obtivemos esse login parcial. Perca esse ponto. Essa parcial de login veio com a atividade de andaimes e esse login PowerShell tem a ferramenta de links. Veja aqui se está registrando ou faça login. Login parcial é, na verdade, apenas nos dar os links que precisamos para o login ou registro. E se estivermos conectados, ele dirá olá, usuário conectado. E, por favor, faça logout. O que farei no layout é usado parcialmente na barra de navegação. Indo para dentro dessa div que já tem a barra de navegação. E tudo o que temos que fazer é agradar a intrusão parcial, nome parcial é igual a login parcial. Tudo bem, por baixo disso, você vai seção. Vamos declarar isso para um controle de rotação. Se a primeira coisa for acordada , é uma era de barcos, nenhum tipo de serviço que como um erro de injeção. E é solúvel para o gerenciador de assinatura para o usuário do aplicativo saber que o gerenciador de login está sendo usado no parcial para login. Está dizendo que isso não foi registrado. Saiba voltando para a inicialização, o que fui fazer é modificar a biblioteca ou a função que estou usando aqui, estou usando o núcleo de identidade AAD. Mas se eu apenas digitar identidade ou CDF, eu identificaria versus iodeto de núcleo AD Identity em dois parâmetros de tipo TTX, e ele o configura como a identidade padrão, enquanto conjuntos de núcleos de identidade de certos coisas. Mas acredito que o que acontece é que, com o núcleo de identidade, você precisa registrar sua lista de identidade sob demanda apenas registrando tudo. Considerando que com a identidade onde eu tenho que dizer, bem, o núcleo de identidade da USU e eu também quero esse serviço e que, esse serviço, em vez de complicado na configuração, eu vou apenas Marque o núcleo de identidade e use AD Identity também tirou a linha que adicionou as regras porque a entidade iodede quer um usuário e nosso tipo de função entre colchetes de tipo. Então é assim que vai parecer. Esta linha não é um serviço que adicionou entidade t. usuário. Então, se você olhar para os sobrecarregados, algo do tipo T usuário e algo da regra do tipo T. Portanto, para o usuário seria usuário de identidade, nosso usuário do aplicativo neste caso. E linha de identidade para a regra t. do tipo. Com tudo isso feito, deixe-me controlar o F5 e tentar novamente. Nenhuma ou obrigação está carregando. E não só está carregando, nós sabemos como a ferramenta se conecta na barra de navegação. Então, se eu clicar em registrar, não me falará sobre o remetente do e-mail ocular. Então lembre-se que eu disse que estamos fazendo que é um serviço que ainda não temos. Isso não é problema. O que vou fazer não é injetado, então vou removê-lo da injeção aqui e entrar na sacola e deixarei onde quer que esteja sendo usado, em nenhum lugar. Vou entrar neles. Então, em qualquer lugar em que os objetos do remetente de e-mail estavam sendo usados, basta comentar o que foi dito para uso posterior. Então isso deve resolver esse problema. Deixe-me controlar o F5 novamente. E desta vez, quando vou me registrar, funciona. Tudo bem, então você vê aqui isso é o que o formulário se parece. Recebemos senha de e-mail, confirmamos senha e, em seguida, algo sobre o uso de outro serviço ou registro. Lembre-se de que temos esse arquivo, para que possamos modificar este formulário de registro como quisermos. Por exemplo, quero mais campos em sua distribuição. Não quero apenas o endereço de e-mail e a senha. Sabemos o que temos nome de usuário e enviamos um e-mail. Esses são dois campos diferentes. No entanto, a forma como o formulário ele configura a marca agora é apenas pedir um e-mail, mas ele usará isso nos campos EMEA e nome de usuário. Cabe a você se você quiser separá-los e se não, você pode deixá-lo como está. No entanto, preciso que o primeiro nome e o sobrenome sejam adicionados a este formulário. Então eu fui voltar para o meu formulário de registro e vou adicionar mais caixas de texto. Então, antes do e-mail, vou colocar o primeiro nome do ponto de entrada. Então, tudo o que fiz foi copiar todo o bloco para e-mail e já procurarei modificando formulários. Então isso deve ser algo rudimentar para você neste momento. Só estou vendo gene, outros que criei para FirstName e LastName multi-cell eles obtendo essas linhas vermelhas porque FirstName e LastName não existem no objeto de entrada. O que é esse objeto de entrada? Se eu Controlar clicar e pular para o modelo de entrada, o que é o modelo de entrada? modelo de entrada é o que esses campos foram definidos? Não consigo ver. Quero que meu primeiro nome, meu sobrenome seja separado do modelo de entrada. Nome próprio, LastName. Mais uma vez, nada de especial. Vou remover ou alterar os nomes de exibição. No entanto, é claro, o tipo de dados que estou validando não é endereço de e-mail para esses dois. Lá vamos nós. Agora nosso modelo de entrada foi estendido. Nome próprio, LastName e qualquer que seja LLC tad. Também o adicionamos ao formulário e você verá que essas linhas vermelhas desapareceram. Não. Então, todo mundo sabe seu papel. E então a última coisa que vou fazer é estender o usuário obrigação, mas não vou fazer isso. Eu queria pelo menos registrar alguém sem que os dados entrassem. E então você verá como ele se parece quando obtivermos os dados do carrinho. Eu fiz. Então, deixe-me controlar a atualização novamente. Pule para o meu registro e você verá a fórmula que mostra mais temas. Então, se eu colocar todos esses e vou dizer carro Booking.com, senha da Booking.com. A senha, mas a falha é rigorosa. Alguém para dizer P maiúsculo ao dizer, ele já diz totalmente um. Essa é a palavra de campainha que existe para seus olhos. E fui usar essa senha de confirmação. Se eu alterá-lo, veja isso, a senha e a confirmação não correspondem. Então, automaticamente, estamos recebendo esse tipo de feedback. Se eu colocar algo inválido como endereço de e-mail e tentar registrar ou fazer algo inválido . Peça desculpas. Mas aqui você está vendo que não temos usuário. Certas coisas estão falhando porque estão esperando certas configurações que simplesmente não estão lá. Tudo bem, isso não é problema. Como eu disse, como você vê os erros, nós os corrigimos. Então esse erro ocorre porque o gerador Tolkien que está sendo usado pelo gerenciador de usuários teria que ser configurado a partir da inicialização. Não estamos prontos para. Adoro isso porque não estamos enviando o e-mail de qualquer maneira. Fui comentar, isso é Alt também. Tenho certeza que ele só chegou aqui porque o usuário foi criado com sucesso. Então, se eu procurar no banco de dados no ASP NET usuários visualizarem dados, você verá que o usuário foi criado administrador no cartão Booking.com. Isso não era um endereço de e-mail inválido. Então funcionou independentemente do que você vê aqui, veja a senha. Isso não parece nada que a senha que mostrei na tela. Só saiba que isso é hash automático. Não precisamos nos preocupar com nenhum desses hashing. Mas se você notar a data de nascimento, o primeiro nome e o sobrenome não foram preenchidos. Data de nascimento, óbvio porque não adicionamos esse campo, mas FirstName e LastName não foram preenchidos mesmo que fornecemos dados. Então, vamos ver como podemos corrigir isso. Em primeiro lugar, vou colocar o campo de data de nascimento no formulário. E ele realmente não importa onde você começa a se modificar desde que você receba todas as modificações feitas até o final, então você está pronto para ir para a data de nascimento. Eu apenas definiria o tipo como igual à data para que possamos obter um seletor de datas nesse campo. Em seguida, modelo de entrada. Você será data de nascimento do tipo data e hora. Não vou tornar necessário. Acho que devo fazer com que seja necessário. Vou tornar necessário porque ele vai ter um valor padrão como vimos, que realmente não queremos, certo? Portanto, tudo é necessário para você se registrar com sucesso neste site. Então, depois de termos feito tudo isso, quero que os campos adicionais sejam armazenados no banco de dados. Fui saltar para onde diz: Se o estado moderno for válido, então crie um novo usuário, então crie um novo usuário, dando o e-mail do nome de usuário e o e-mail do endereço de e-mail. Posso estender isso e ver e o querido primeiro nome deve ser inserido a partir do primeiro nome do ponto do formulário. Isso é algo que já fizemos antes. Construímos sobre o que queremos. O sobrenome é igual ao sobrenome do ponto de entrada. E a data de nascimento é igual à data de nascimento do ponto de entrada. Lá vamos nós. Depois de fazer tudo isso, o que vou fazer é testar, mas estou vendo isso de fácil aqui porque criei data de nascimento como data. Peço desculpas, isso deveria ter sido realmente o tempo. Então observe que temos duas mudanças para mim da mudança que lobos no banco de dados. Depois de lançarmos esse campo no banco de dados. E temos que estar atentos a isso. Mas acho que ainda podemos passar por essa operação porque o banco de dados deve apenas convertê-lo uma string de qualquer maneira quando ele obtê-lo. Então, vamos tentar isso de novo. Vamos pular para registrar e Tyrone Cooper mudar isso hoje. Para editar seus ys são motivos de teste. Deixo isso e usarei minha senha para dizer uma ou apenas usar algo. Nascimento 123, nenhum problema que estava na minha área de transferência. Então, vou reutilizar isso. Clicamos em Registrar. Certo, os analisadores devem ter pelo menos um. Então você vê que essa é a força da senha no trabalho. É por isso que eu disse p ao assinar uma sístole ou D1, reutilize esse clique em Registrar. Eles estão dizendo que eles não combinam. Então deixe-me tentar isso de novo. Registre-se. Lá vamos nós. Então, não, é até me perguntando se eu queria ver se a senha apenas vê se podemos avançar mais rapidamente. Mas você vê o registro e o login lá ainda não mudando porque ainda estamos no processo de desenvolvimento de nosso aplicativo. Não há problema. Mas pelo menos vemos que um registro funcionou. Isso é um. Vamos passar por isso sem erros. E se eu procurar na tabela de usuários do ASP NET novamente, verei que campos adicionais foram adicionados. Então agora vou ver minha data de nascimento, o primeiro tema e o sobrenome. E tudo está começando a se unir bem. 33. Página de login de configuração: Tudo bem pessoal, então estamos fazendo um bom progresso. O próximo passo é configurar a página de login. Estou começando com isso começa ou porque ainda há algumas configurações. Agora ele precisa entrar. Para nossas coisas de login. Estamos falando sobre o que chamamos de autenticação. Autorização significa que você pode fazer isso? Autenticação significa deixe-me provar que você é quem você é. Quando entramos, é aí que nos autenticamos. No entanto, o que podemos fazer depois de entrarmos é que estamos autorizados a fazê-lo? Embora a caixa que temos o middleware sendo usado já para autorizações esteja no topo disso. Vou adicionar outra linha que diz usar autenticação. Isso é o que realmente vai permitir que o gerente de login comece a funcionar da maneira que queremos que ele funcione. Outra coisa que queremos fazer é nos serviços de configuração e disse que serviços ponto adicionar autorização. Para que saibamos que esse serviço está sendo usado sempre que um aplicativo é iniciado. Então, com tudo isso feito, vamos configurar nossa página de login. Agora, mais uma vez, você pode configurar sua página de registro porque este é o formulário para um lado, ele está ocupando apenas quatro espaços. E então temos essa outra div para os lados mistos em ambas as opções adicionais de login, blá, blá, blá. Isso está levando seis. Isso faria 66. Ele poderia fazer um menor. Você o personaliza como quiser. Até agora você deve estar confortável o suficiente para conhecer um todo, estender o formulário, segurar-me os botões personalizados e coisas assim. Então, não vou gastar muito tempo fazendo isso. O que queríamos fazer, no entanto, é adicionar a página de login. Posso clicar com o botão direito do mouse nas áreas novamente, clicar em Adicionar e ir para um novo item desfiado , clicar em identidade. E depois que ele coletar todas as informações de que precisa, vai nos dar essa caixa de diálogo que nos permite simular onde está o login. Lá vamos nós. Portanto, temos essa página de login. Eu só vou pegar o pH do logotipo também fazer login. Temos logotipos. E mais uma vez, você tem várias páginas, mudou de caminho ou a senha esquecida. Ele pode implementar várias coisas e muito do código fora da caixa é bastante resiliente. No entanto, estou apenas focando naqueles que são absolutamente necessários para superar o que precisamos passar. Faça login e logout. Novamente, nosso contexto de banco de dados é a classe de contexto do banco de dados, e depois seguimos em frente e pressionamos Adicionar. Quando essa operação é concluída, ela reabre o andaime. Leia-Me, mas depois vemos que temos as páginas de login e logout. Então, vamos ver o logotipo primeiro. Por que eu tomei um pH do logotipo? Bem, tudo isso vai fazer é dizer, se o usuário que está aqui for autenticado, então, embora ele clique em logotipos, o que acontece com o logotipo nucleico quando eles fazem isso? O mesmo no sal de log do Manager e depois retorna ao URL. É o que a página do logotipo faz. A página de login, é um formulário simples. Dê-me seu e-mail, me dê sua senha. E você quer que eu me lembre de você? Se não, bem, se você não é. Deixe-me ir em frente e fazer login. Ele está gerando links automaticamente para que eu esqueci a senha. Não o vimos nesse arquivo e não vamos necessariamente implementá-lo. Não, está tudo bem. Mas você esqueceu seu registro de senha como usuário é confirmação por e-mail recente. Então, todas essas coisas, bem como esta próxima seção à direita, tal opções alternativas de login? Todas essas coisas vieram desta forma. Portanto, o código de login por trás é muito semelhante ao registro. Qualquer um dos permite que pessoas anônimas e baixas que não são autenticadas cheguem ao discurso. Em seguida, temos injeções para nosso gerente de usuários e logon Manager. Temos o mesmo tipo de formato com o modelo de entrada. E o modelo de entrada está sendo usado aqui para apenas ficar o e-mail e a senha e diferencia lembre-se de mim, No get, nós apenas carregamos a página praticamente para que sejam logins externos simultâneos. Não precisamos necessariamente prestar atenção nisso neste escopo deste curso. Mas quando você clica em Login, vamos ver o que acontece se tudo for válido. Vamos e pedimos ao gerenciador de login para entrar usando a senha dado o endereço de e-mail, a senha fornecida. Se a pessoa disser Lembrem-se de mim. E se tivermos local habilitado, local significa que, se depois de algumas tentativas fracassadas, eles devem bloquear seu condado, tenho certeza que você encontrou isso. Tudo isso está incorporado, nesta biblioteca muito poderosa. Este curso não é tempo suficiente para passar por todos os recursos desta biblioteca. É por isso que estou focando nas coisas grandes, maiores e mais importantes no momento, certo? Depois de tentarmos dizer se foi um login bem-sucedido, lemos Erich, o URL de retorno. Caso contrário, verificamos se é, se requer autenticação de dois fatores e nós criamos essa interação. Não temos isso implementado. Se o usuário estiver bloqueado totes, nós os lemos que não temos isso implementado. E se tudo mais falhar, retornaremos com o erro do modelo, vendo o ponto da string vazio como a chave. Foi uma tentativa de login inválida e retornamos ao pH. Se chegar até aqui, significa que não funcionou. Bom e simples. Então, vamos em frente e teste ou login. Agora já temos alguns usos criados. Tenho certeza que você e louco registrando um número de usuários desde que ele conseguiu o registro funcionar e você vê, eu tinha um sinal, não só sabia, eu acabei de sair. Então, vamos tentar isso sem login. Chegamos à página de login. Ótimo. Eu disse que era administrador no carro Booking.com. Deixe-me pensar que deveria ter um quatro no final, mas deixe-me tentar fazer login. E você verá que ele diz login inválido, tente verificar o banco de dados. Ele não encontrou essa combinação de nome de usuário ou e-mail e senha. Deixe-me colocar o que eu acho que o email adverso foi mesmo que nossos propósitos apenas tornem um melhor para cancelar o compartilhamento novamente. Mas deixe-me tentar isso de novo. Clique em Login. Não, estou vendo outra coisa. Estou recebendo esses dados de placa de erro sendo nulos. Tudo bem, então entrei no modo de depuração e executei novamente essa operação. E esse é o erro que estou recebendo, o que faz um pouco mais de sentido. E acho que está reclamando disso porque mudamos a data de nascimento, data e hora, mas as ferramentas de banco de dados acham que diminui. Então essa é uma solução fácil. Basta adicionar uma migração, tipo de DOB alterado até o momento. Deixe que ele faça a migração. Migração é a coluna de ruído e alteração TEN para esse campo que, portanto, atualize o banco de dados. Está vendo que falhou porque não estou permitindo nulos. Então lembre-se de toda essa conversa sobre tipos de dados e notas. Tudo bem. Não vou pressionar muito o que vou fazer, já que ainda estamos na fase experimental. E você pode fazer com qualquer usuário que você criou. Basta encontrar todos eles. Excluir. Tudo bem, neste momento, isso é importante, é por isso que eles estão lá e, portanto, testando. Então, estou removendo todos os usuários criados atualmente e, em seguida, vou reexecutar. Então, às vezes você não tem o luxo de fazer isso. Mas já analisamos como você pode tomar medidas quando você não pode remover todos os registros que já possui quando você queria fazer tal alteração. Então, de qualquer forma, a atualização foi bem-sucedida desta vez. Então deixe-me controlar o F5 e tentar isso novamente. Fui depois do registro primeiro e farei isso corretamente desta vez. Então, data de nascimento. Basta fazer hoje admin, carro Booking.com. Essa é a palavra de campainha após confirmada esta senha apenas para seus olhos, essa é a senha. E depois clicamos em Registrar. Sabe, vou salvar a senha e olhar para aquele olá Admin, não carbocation. Saiba que incluímos o anúncio. Todos usam autenticação e o serviço para autorização AT na inicialização, na verdade, começamos a ver as alterações na interface do usuário. Então deixe-me sair e vou fazer login agora. Vou usar o mesmo administrador, uma reserva de carro, a mesma senha, clique em Login e analisei isso. Estamos logados. logotipo também funciona. Veja, lá acabamos de resolver esse problema. Então, agora corrigimos o problema de registro daqui para frente. Você não deve ter nenhum desses programas. Mais uma vez, sabemos como fazer login e sair à vontade. A próxima coisa seria como evitamos que os usuários que não estão logados cheguem a essas páginas? Porque neste momento, login não faz diferença. Posso ir a qualquer lugar do aplicativo. Sem fazer login. Precisamos ver como podemos vinculá-lo em nossos bloqueios, acesso a determinadas partes do aplicativo para usuários não autenticados. 34. Autenticação de configuração: Nesta lição, estamos falando sobre o fim de semana inteiro restringir acesso a diferentes partes do nosso aplicativo para usuários autênticos e autenticados e em autorizados e vice-versa. Agora isso parece mais difícil do que realmente é. E vou mostrar como é fácil conseguir isso. Não, temos a funcionalidade de login e registro aberta em execução, mas precisamos ser capazes de gerenciar essas páginas. Então, qualquer um deve ser capaz de chegar à página inicial confortavelmente. Mas se eles clicarem em carros, eles devem ser forçados a fazer login antes que possam continuar a olhar para os carros e fazer facilmente. E é uma maneira muito fácil. Deixe-me fechar todas as guias que não são importantes neste momento e colapso qualquer coisa. Se eu não quiser que você consiga chegar à lista de carros. Tudo o que preciso fazer é acima do código da página para os carros. Adicione um atributo que diz autorizar a instrução de uso ausente. É isso. Eu disse que seria simples. Então, vamos dar uma olhada em como isso funciona. Então, isso é sobre a página de índice de carros que autorizei, o que significa que eu não deveria ser capaz de em um estado não autenticado, clicar em carros e ver a lista de cartões. Olha, olha o que acontece quando eu clico em carros vai, ok, bem, ok, isso é anticlimático, mas você vê que não está se comportando corretamente. Na verdade, está tentando chegar à tela de login. Agora vou voltar para o aplicativo e suspeito fortemente que vou ter que alterar minha configuração. Mais uma vez. Estes são os de novo, este vai-e-vem. É bom porque quando você vê esses tipos de flechas, ajuda você a inferir onde você precisa ir para resolver esses problemas. Quando adicionamos serviços, lembre-se de que primeiro adicionamos o núcleo de identidade e, em seguida, vimos que ele não veio com certas coisas fora da caixa, é por isso que mudamos para identidade. Aquelas coisas com as quais não funcionaram bem. Fora da caixa começou a funcionar em nenhum lugar vendo outra coisa. O problema com a seta que acabamos ver é que ela está procurando a página de login em um determinado local em que ela não existe. Isso porque as identidades apenas vão dizer olhe nesse local. No entanto, eu gostaria que ele olhasse no local padrão com base no andaime. Portanto, não quero fazer muitas configurações e alterar o fluxo normal do aplicativo. Por esse motivo, posso, em vez de usar identidade ou núcleo de identidade, posso usar a identidade padrão. Se você olhar para este, ele diz que adiciona uma noção de serviços de identidade comuns ao aplicativo, incluindo nossa interface de usuário padrão, que seria onde andamos nossas coisas. Esse é o local padrão. Provedores de token. Lembre-se, conclua quando estamos registrando nosso barco, todo o provedor de token e ele caminha para uma xícara de chá ou um brinquedo, está faltando e temos que incluí-lo. Ele é incluído automaticamente com as opções padrão e configura a autenticação para usar cookies. Isso é o que vou fazer. Adicione identidade padrão. Não, estou recebendo esse erro porque eu tinha uma entidade padrão semelhante às palavras do núcleo de identidade só leva o usuário, o que significa que eu tenho que vir aqui manualmente e ver adicionar regras. Mais uma vez. Adicione regras e, em seguida, damos a ela a regra de identidade. Deixe-me colocá-lo entre parênteses. Lá vamos em frente, regra de entidade, fechar. Não, estamos usando a biblioteca padrão para identidade. E este, como eu disse, vai incluir certos padrões, Alt fora da caixa que outras coisas não necessariamente. Vamos dar outra facada neste experimento foi que adicionamos o discurso autorizado do carro. Eu não deveria ser capaz de navegar lá sem ter feito login antes. Então, se eu clicar em carros, veja isso, ele está apenas me redirecionando automaticamente para a página de login. Então, como não tínhamos o padrão, ele não estava procurando no local padrão da pasta de identidade para encontrar os ícones e o login. Então isso realmente omitiu essa parte, é por isso que obtivemos essa página. Nunca vou mostrar algo ou codificar um erro sem explicar por que o conseguimos e como o corrigimos. Então, agora que estamos na página de login, vamos garantir que nossa funcionalidade de login ainda funcione. Sim, ele faz. Aqui está nosso olá e não, não podemos ver a página, então em nenhum lugar autenticado e estamos autorizados a ver a página. Seria meio tedioso dizer, Ok, bem, depois do bloqueio para editar e os detalhes e o Excluir, porque neste momento, se eu quisesse editar um carro e me lembrei do URL para editar nosso carro. Vamos ver, não estou autorizado e vou para carros e não autorizado. O que eu estava de pé sobre o ombro de alguém enquanto estava. Editando nosso carro e eu me lembro do URL. Na verdade, posso simplesmente colocar esse URL e ignorar toda a autorização para editar o carro, o que está errado. Nesse ponto, eu teria que adicionar o atributo authorize em cada página que eu quero deixá-los configurar para fazer, para criar, eu teria que fazer mais dois detalhes. Edite que cada um deles, o que não é necessariamente, quero dizer que funciona e pode ser prático em uma pequena aplicação. Mas para mim, só vai ficar cansativo facilmente. E é fácil para alguém esquecer colocar esse código acima do código de pH. O que podemos fazer é fazê-lo em nível global. Em nossa startup Weekend, adicione esse bit de código ou adicione uma área de páginas do Razor. Você pode ver códigos variados entre como ele faz isso nas páginas do Razor e se você já teve que fazê-lo no MVC, e como você vê em um monte, você sabe, há tantas maneiras de realizar a mesma coisa . Basta encontrar aquele que funciona para você e é melhor para o seu contexto. Nessa situação, tudo tem que fazer é ver as artérias são páginas. Comece a aplicar a mesma opção. Objeto a aceitar. Só estou chamando de o em vez de opções. Então, toda expressão lambda. E, em vez disso, estou dizendo todas as convenções de pontos, pasta autorizada de ponto, slush. Há várias coisas que você pode autorizar. Autorize a área que você pode autorizar um dia inteiro, pode autorizar uma página específica. Se você tiver talvez uma página específica que deseja ter regras específicas seja diferente dos outros PHs ou de uma pasta específica para jogar por diferentes, ele pode adicionar todas elas. Eles são chamados de convenções. Norm apenas adicionando uma convenção global a qualquer coisa depois uma barra e vendo que você deve ser autorizado. Então, esse tempo de execução automaticamente basicamente adicionará esse filtro autorizado em cada página do meu aplicativo. A única maneira de ignorá-lo é adicionando ou permitindo anônimo. Então, vou te mostrar isso agora. Então, se eu remover o autorizado da página de carros e um Controle F5, deixe-o funcionar. Você vai ver que eu deveria ter chegado na página inicial. Precisa que eu faça login se eu tentasse me misturar, quer que eu assine não importa onde eu vá, eu tenho que entrar. Mas então, se eu for me registrar, isso me permite ver a página de redistribuição. Isso porque o filtro chamado de anônimo baixo está acima da pregação do registro, certo? Então, se eu entrar e olhar para a loja já, você verá um baixo anônimo acima dele. Então, se eu adicionar isso, vamos ver, página de índice regular. Lembre-se de que começamos com nossa página de índice, onde tivemos todas as nossas maravilhosas cotações da classe web div mais básica. Se eu quisesse o usuário para Londres, pelo menos a página inicial sem manteiga. Mas em todos os outros lugares eles precisam entrar, então tudo o que tenho a fazer é dizer permitir anônimo. Então, ao fazer isso, se eu atualizar e ir para a página inicial, a página inicial é renderizada só porque eu disse olá Anônimo. No entanto, se eu tentasse ir para carros, não posso chegar lá. Se eu tentasse digitar um URL direto para carros, edite com o ID 14. Tenho que fazer login, não importa o que eu faça, não posso ir a lugar nenhum, certo? Sem privacidade. Ele quer que eu faça login para corrigir isso. Só preciso ir acima privacidade e permitir acesso anônimo. De repente o faz clicar em Privacidade. Isso realmente me levará à página de privacidade porque pessoas anônimas são capazes de visualizá-la. Se eu fizer login e tentar novamente, então tudo bem, homepages, bons carros e tudo o mais estará disponível para visualização. Então, é basicamente assim que podemos bloquear ou aplicar e restringir acesso indesejado a áreas sensíveis. 35. Adicionando autorização: Tudo bem pessoal, então acho que fizemos um bom trabalho proteger nossa inscrição até este ponto, configuramos com sucesso o registro e o login, e há muito mais que podemos fazer. Poderíamos entrar em funções, poderíamos entrar em restringir usuários com base em determinadas políticas e reivindicações. Há tanta coisa, tantas coisas que poderíamos fazer. Mas, infelizmente, não quero sobrecarregá-lo com todas as informações e todos os cenários e assim por diante. É melhor absorver tanto NÃO e experimentar com ele. E então você pode ampliar seu conhecimento conforme você precisa. Por enquanto, podemos fazer uma rápida revisão do que implementamos. Começando com nosso usuário de identidade, a classe de usuário do aplicativo. Quando estávamos configurando nossa biblioteca de identidades. Neste projeto, tivemos que herdar herança brega para o contexto de banco de dados do contexto de banco de dados de identidade. E então nós o definimos para herdar com base no contexto do usuário do aplicativo. usuário do aplicativo era nossa classe personalizada que encontramos para herdar do usuário de identidade, onde colocamos campos adicionais que estenderiam a tabela de usuários no banco de dados. Até agora, não escrevemos nenhum código personalizado para lidar com a criação do usuário ou hash da senha ou mesmo recursos de login. Todas essas coisas nos foram dadas fora da caixa. E a largura, a margem de manobra que poderíamos modificá-los fora do curso. Então, depois de fazer tudo isso, nós ajustamos as mudanças com algumas migrações, tivemos algumas migrações de campo algumas mudanças, mas passamos por tudo isso. E então nos certificamos de que configuramos a identidade em nosso aplicativo web, que também passamos por ciclos de identidade versus núcleo de identidade versus identidade padrão do AD, que é a que nós disse que Louis, porque veio com as bibliotecas mais pré-embaladas com base no que precisamos fazer. Então, depois de fazer tudo isso, fomos em frente e fizemos nossas interfaces de usuário, modificamos algumas delas. Para o registro. Tivemos os comentários, pensamentos, todo o código porque não era necessariamente aplicável ao nosso escopo atual. Então, removemos parte desse código. Colocamos as funções e páginas de login e logout. Também obtivemos uma cortesia parcial de login do andaime que adicionamos à nossa página de layout, que nos dá acesso aos links de registro e login. Agora, com tudo isso feito, balas do Zoom são boas mudanças. E veja que adicionamos login e funcionalidade ao nosso aplicativo. Nossos colegas de equipe sabem exatamente o que esperar quando recebem o código mais recente. Então eu fiz login e adicionei funcionalidade e, em seguida, apenas comprometemos tudo e afundamos. É isso para esta seção.