Fórum Models no ASP.NET MVC #591163
06/02/2018
0
Estou com uma grande dúvida sobre a questão de models no ASP.NET MVC e gostaria de uma ajuda.
Acontece o seguinte, exemplo (apenas para ilustrar):
- Tenho uma tela de Pesquisa de Cliente(/Cliente/Pesquisa/)
- Tenho uma tela de Cadastro de Cliente (/Cliente/Cadastro/)
- Tenho uma model Cliente ( int idCliente; string nomeCliente; int idEndereco;)
- Tenho uma model Endereco( int idEndereco; int idCidade; string tipo;)
- Tenho uma model Cidade ( int idCidade; string nomeCidade;)
Na tela de cadastro do cliente preciso de um campo onde é possível digitar o nome e ir buscando a cidade, ou ainda seria possível colocar um botão ao lado e ao clicar abrir um bootstrap-modal (ou algo parecido, independente) com um layout para uma engine de busca de cidade (nomecidade, codigoIbge, estado, id....).
Só que na tela de cadastro do cliente eu só posso receber um model, correto? Portanto, só recebo a model 'Cliente'.
Então, como é possível criar algo desse tipo? O maior exemplo que eu conseguir achar foi o Awesome.Mvc, mas é pago;
Essa dúvida foi gerada a partir de um comentário no Curso de ASP.NET MVC - Criando uma Loja Virtual
Davi Ferreira
Curtir tópico
+ 0Post mais votado
08/02/2018
Utilizando uma requisição ajax você pode renderizar esta view dentro do modal e disponibilizar o form de pesquisa.
Perceba que não é necessário trazer dois models para a view, pois são duas views diferentes.
Espero ter ajudado, qualquer coisa é só falar.
Rodrigo Duclerc
Gostei + 1
Mais Posts
07/02/2018
Rodrigo Duclerc
Realmente, se você tentar importar dois models na mesma view, receberá uma exception.
Há várias maneiras de se resolver este problema.
Uma delas é passar a referência aos objetos necessários através da ViewBag. Veja:
public ActionResult cadastraCliente()
{
ViewBag.Cliente = GetClienteModel();
ViewBag.Cidades = GetListCidades();
return View();
}
A ViewBag tem a função de "carregar" informações do Controller para a View. O legal da ViewBag é que suas propriedades são dinâmicas e é possível defini-las na hora.
Dessa forma, você pode resgatar a ViewBag em sua view. Algo como:
Nome: @ViewBag.Cliente.Nome
@foreach (var cidade in ViewBag.Cidades){
<option value="@cidade.Nome" >@cidade.Nome</option>
}
Essa é uma forma, existem outras.
Há também como resolver isso fazendo uso de Ajax, em seu caso específico, pois essa funcionalidade de busca de cidade poderia funcionar com uma requisição ajax apontando para outro Controller que fizesse apenas isso: retornar uma lista de cidades em JSON.
Reflita sobre isso e avalie o que seria melhor no seu caso.
Qualquer coisa é só falar.
abs!
Gostei + 0
08/02/2018
Davi Ferreira
Realmente, se você tentar importar dois models na mesma view, receberá uma exception.
Há várias maneiras de se resolver este problema.
Uma delas é passar a referência aos objetos necessários através da ViewBag. Veja:
public ActionResult cadastraCliente()
{
ViewBag.Cliente = GetClienteModel();
ViewBag.Cidades = GetListCidades();
return View();
}
A ViewBag tem a função de "carregar" informações do Controller para a View. O legal da ViewBag é que suas propriedades são dinâmicas e é possível defini-las na hora.
Dessa forma, você pode resgatar a ViewBag em sua view. Algo como:
Nome: @ViewBag.Cliente.Nome
@foreach (var cidade in ViewBag.Cidades){
<option value="@cidade.Nome" >@cidade.Nome</option>
}
Essa é uma forma, existem outras.
Há também como resolver isso fazendo uso de Ajax, em seu caso específico, pois essa funcionalidade de busca de cidade poderia funcionar com uma requisição ajax apontando para outro Controller que fizesse apenas isso: retornar uma lista de cidades em JSON.
Reflita sobre isso e avalie o que seria melhor no seu caso.
Qualquer coisa é só falar.
abs!
Isso ajuda bastante.
Mas a ideia seria eu abrir um pagina com o cadastro do cliente... e dentro dessa pagina abrir um modal do bootstrap, por exemplo, e renderizar uma pagina de pesquisa de cidades nesse modal pra poder escolher a cidade que eu vou utilizar na pagina(por tras) do cadastro do cliente.
Isso só pra não precisar abrir um popup via javascript e aguardar o retorno desse popup. Pois muitas pessoas bloqueiam esse tipo de ação no navegador.
Gostei + 0
08/02/2018
Davi Ferreira
Muito obrigado!
Gostei + 0
09/02/2018
Rodrigo Duclerc
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)