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.