P?GINA DE PESQUISA

PERCIFILHO 30/11/2016 16:18:19
#469336
Boa tarde!
No meu projeto existe uma página de pesquisa:



Gostaria de saber como faço para escolher um tipo de consulta e depois de digitar e clicar no botão, iniciar a pesquisa no banco de dados?
No meu pensamento, minha Controller teria que ficar mais ou menos assim:

[HttpPost]
public ActionResult Search(string texto)
{
ModelState.Clear();

var query = db.Fornecedor;
object retornar = null;

if (consulta == [Ô]Nome[Ô])
{
retornar = query.Where(x => x.Nome.Contains(texto));
}
else if (consulta == [Ô]Cnpj[Ô])
{
retornar = query.Where(x => x.Cnpj.Contains(texto));
}
else if (consulta == [Ô]Cidade[Ô])
{
retornar = query.Where(x => x.Cidade.Contains(texto));
}
else if (consulta == [Ô]Estado[Ô])
{
retornar = query.Where(x => x.Estado.Contains(texto));
}
return View(retornar);
}


Mas eu não estou sabendo como definir esse parâmetro [Ô]consulta[Ô] para a minha Controller saber como fazer a pesquisa;
Minha View Search está assim:


@using (Html.BeginForm())
{
<table align=[Ô]center[Ô] border=[Ô]0[Ô]>
<tr>
<th valign=[Ô]middle[Ô] class=[Ô]rotulo[Ô] style=[Ô]width:120px;[Ô]>
Consultar por
</th>
</tr>
<tr>
<td>
@Html.DropDownList([Ô]Consulta[Ô], new List<SelectListItem>
{
new SelectListItem() {Text = [Ô]Nome[Ô], Value=[Ô]Nome[Ô]},
new SelectListItem() {Text = [Ô]Cnpj[Ô], Value=[Ô]Cnpj[Ô]},
new SelectListItem() {Text = [Ô]Cidade[Ô], Value=[Ô]Cidade[Ô]},
new SelectListItem() {Text = [Ô]Estado[Ô], Value=[Ô]Estado[Ô]}},
new { style = [Ô]width:80px;[Ô], @class = [Ô]dados[Ô] })
</td>
<td>
@Html.Editor([Ô]texto[Ô], new { htmlAttributes = new { @class = [Ô]form-control[Ô], autofocus = [Ô]autofocus[Ô] } })
</td>
<td>
  
<button type=[Ô]submit[Ô] class=[Ô]btn btn-success[Ô]>Pesquisar</button>
</td>
</tr>
</table>
}


Alguém pode me ajudar por favor?
KERPLUNK 30/11/2016 22:16:38
#469339
Vamos lá:
Primeiro, o que você entende nesse código todo?
PERCIFILHO 01/12/2016 08:25:48
#469346
Bom, Kerplunk, não entendi direito qual o propósito da sua pergunta, mas..... gostaria de saber.
Eu já consegui resolver o problema, tudo o que eu fiz foi simplesmente colocar mais um parâmetro na ActionResult, ficando assim:
public ActionResult Search(string texto, string consulta).
KERPLUNK 01/12/2016 17:56:42
#469357
Resposta escolhida
Certo, você resolveu o problema, mas não sabe bem o que fez. Isso quer dizer que você continuará tendo problemas futuramente. Antes de sair codificando, tente entender o que está fazendo:
Você tem um formulário na view. Este form possui:
- Um dropdown chamado [Ô]consulta[Ô] que é a linha [Ô]@Html.DropDownList[Ô]
- Um textbox chamado [Ô]texto[Ô] que é a linha [Ô]@Html.Editor[Ô]
- Um botão de submit [Ô]<button type=[Ô]submit[Ô] class=[Ô]btn btn-success[Ô]>Pesquisar</button>[Ô], que é o que [Ô]envia[Ô] os dados do form para a controller

Na controller, você tem a assinatura do método, que recebe os parâmetros(campos ou textos) do form na view. Você não tinha no método da controller o parâmetro que recebia o valor da combobox, apenas o que recebia [Ô]texto[Ô] que se refere ao nome da textbox. Quando você colocou o parâmetro [Ô]consulta[Ô], então você fez com que a controller possa receber o parâmetro [Ô]Consulta[Ô](Atenção à maiúsculas e minúsculas aqui). Cada parâmetro dos métodos das controllers, representam um [Ô]campo[Ô] do form da view, Então se você tiver 20 campos, vai ter 20 parâmetros na consulta. Existem outras maneiras de fazer isso, do jeito que está fazendo é um deles.
PERCIFILHO 02/12/2016 07:30:44
#469365
Valeu, Kerplunk, obrigado mais uma vez pela explicação, foi um [Ô]pequeno[Ô] erro que eu cometi.
Quando você diz:
Citação:

Existem outras maneiras de fazer isso, do jeito que está fazendo é um deles.


Estou fazendo da maneira correta? Recomendada? Mais fácil? Mais difícil? é uma boa prática? Devo continuar ou adotar outras práticas?
Gostaria da sua opinião, pois sei que ela é sincera. Doa a quem doer, rsrsrs.
KERPLUNK 02/12/2016 22:56:19
#469383
Para esse caso, onde são poucos campos e valores, da maneira como fez está ok. Agora, imagine uma tela com 50 campos, incluindo sub-itens, enviar esses dados todos como parâmetros vai ser um pé no saco. Para isso, você usa um tipo anônimo que vai encapsular tudo no form em uma classe que será recebida no server(controller) e de lá você faz o que quer. Para isso, basta usar o form especificando uma classe:

@using (Html.BeginForm(new { UserId = [Ô]99[Ô] }))
{
@Html.TextBox([Ô]Nome[Ô]);
@Html.Password([Ô]Senha[Ô]);
<input type=[Ô]submit[Ô] value=[Ô]Login[Ô]>
}

Ao renderizar, o HTML produzido será:
<form action=[Ô]/Original Controller/Original Action?UserId=99[Ô] action=[Ô]post[Ô]>

Na controller, o pseudo-objeto(anônimo) recebido, conterá as propriedades [Ô]Nome[Ô] e [Ô]Senha[Ô]. Isso pode obviamente ser estendido para múltiplas propriedades. Por isso, na assinatura da controller seria algo como:

public ActionResult Search(Usuario usuario)


Aí basta usar as propriedades como quiser, e se for um objeto já com métodos prontos(como os exemplos que uso nos vídeos do meu canal) ou um objeto Entity Framework, basta executar os métodos:

public ActionResult Search(Usuario usuario)
{
usuario.Gravar();
}
PERCIFILHO 05/12/2016 07:17:15
#469418
Grande Kerplunk, mais uma vez obrigado pelas explicações: são muito boas.
Vou ficando por aqui
Até mais.
Tópico encerrado , respostas não são mais permitidas