PASSAR PARÂMETROS DA VIEW PARA O CONTROLLER

PERCIFILHO 06/10/2016 15:11:24
#467918
Estou implementando minha primeira aplicação Asp.Net MVC.
Até agora consegui fazer uma listagem dos animais, podendo ordenar por nome em português ou inglês.
Um botão para ver os detalhes do animal e um botão para abrir a página de cadastro.
Abrindo a página:


Mostrando detalhes do animal:


Página de cadastro:


Agora eu preciso [Ô]passar[Ô] os dados digitados na página de cadastro para gravar na tabela do banco de dados.
Código da View CreateAnimais.cshtml:
@model Animais.Models.Animal

@{
ViewBag.Title = [Ô]CreateAnimais[Ô];
}

<link type=[Ô]text/css[Ô] rel=[Ô]stylesheet[Ô] href=[Ô]stylesheet.css[Ô] />
<script type=[Ô]text/javascript[Ô] src=[Ô]Programa.js[Ô]></script>

@* cria o título da listagem *@
<div style=[Ô]text-align:center; font-family:Calibri; font-size:36px;[Ô]>Cadastrar Novo Animal</div>

<br />

@* cria o botão para retornar à página *@
<a href=[Ô]@Request.UrlReferrer[Ô]>
<div style=[Ô]text-align:center;[Ô]>
<input type=[Ô]submit[Ô] value=[Ô]Retornar[Ô]
style=[Ô]border-radius:10px; background-color: lightslategray; color: white; height: 35px; width: 120px;[Ô] />
</div>
</a>

<br />

@* dados do animal *@
<div style=[Ô]text-align:center[Ô]>
<table align=[Ô]center[Ô]>
<tr style=[Ô]text-align:left[Ô]>
<td width=[Ô]260[Ô]></td>
<td width=[Ô]260[Ô]>
<div style=[Ô]font-family:Calibri; font-size:24px;[Ô]>
@Html.LabelFor(model => model.Portugues)
</div>
<div style=[Ô]font-family:Calibri; font-size:22px; width:260px;[Ô]>
@Html.EditorFor(model => model.Portugues)
</div>
</td>
<td width=[Ô]260[Ô]>
<div style=[Ô]font-family:Calibri; font-size:24px;[Ô]>
@Html.LabelFor(model => model.Ingles)
</div>
<div style=[Ô]font-family:Calibri; font-size:22px; width:260px;[Ô]>
@Html.EditorFor(model => model.Ingles)
</div>
</td>
<td width=[Ô]260[Ô]>
<div style=[Ô]font-family:Calibri; font-size:24px;[Ô]>
@Html.LabelFor(model => model.NomeCientifico)
</div>
<div style=[Ô]font-family:Calibri; font-size:22px; width:260px;[Ô]>
@Html.EditorFor(model => model.NomeCientifico)
</div>
</td>
<td width=[Ô]260[Ô]></td>
</tr>
</table>
</div>

<p></p>

@* selecionar e exibir a imagem *@
<div style=[Ô]text-align:center[Ô]>
<table align=[Ô]center[Ô]>
<tr style=[Ô]text-align:left[Ô]>
<td width=[Ô]260[Ô]></td>
<td width=[Ô]260[Ô]></td>
<td width=[Ô]260[Ô]>
<div style=[Ô]font-family:Calibri; font-size:24px;[Ô]>
@Html.LabelFor(model => model.Imagem)
</div>
<input type=file id=[Ô]imgChooser[Ô] style=[Ô]font-family:Calibri; font-size:12px;[Ô]>
<p></p>
<img id=[Ô]preview[Ô] width=[Ô]260[Ô] height=[Ô]260[Ô] />
<p></p>
@using (Html.BeginForm([Ô]CreateA[Ô], [Ô]Animais[Ô], FormMethod.Get))
{
<input type=[Ô]submit[Ô] value=[Ô]Gravar[Ô]
style=[Ô]border-radius:10px; background-color: lightslategray; color: white; height:35px; width: 230px[Ô] />
}
</td>
<td width=[Ô]260[Ô]></td>
<td width=[Ô]260[Ô]></td>
</tr>
</table>
</div>

@* função para exibir a imagem *@
<script>
function readImage() {
if (this.files && this.files[0]) {
var file = new FileReader();
file.onload = function (e) {
document.getElementById([Ô]preview[Ô]).src = e.target.result;
};
file.readAsDataURL(this.files[0]);
}
}
document.getElementById([Ô]imgChooser[Ô]).addEventListener([Ô]change[Ô], readImage, false);
</script>


Minha Controller (AnimaisController.cs) ficaria mais ou menos assim:

// POST: Animais/Create
[HttpPost]
public ActionResult CreateA()
{
try
{
//Animal dados = new Animal();
//dados.Id = Convert.ToInt32(dados.Next());
//dados.Portugues = parametro;
//dados.Ingles = parametro;
//dados.NomeCientifico = parametro;
//dados.Imagem = parametro;
//dados.Insert();
return RedirectToAction([Ô]IndexP[Ô]);
}
catch
{
return View();
}
}


Alguém poderia me ajudar nessa?
KERPLUNK 06/10/2016 17:58:16
#467926
Quando você cria o form, você especifica a ação. Veja bem o que faz essa parte:
@using (Html.BeginForm([Ô]CreateA[Ô], [Ô]Animais[Ô], FormMethod.Get))
{
<input type=[Ô]submit[Ô] value=[Ô]Gravar[Ô]
style=[Ô]border-radius:10px; background-color: lightslategray; color: white; height:35px; width: 230px[Ô] />
}
Tente entender o que está acontecendo aqui. Após visualizar a página, veja o conteúdo HTML que foi gerado. Todo o conteúdo dentro da tag [Ô]<form>[Ô]. é isso que me refiro quando digo que entendimento de HTML é primordial para se trabalhar com aplicações web.

Entendo perfeitamente que você vai ter dúvidas sobre formulários web. O caso é que você está instintivamente utilizando uma metodologia exatamente igual aos windows forms. Sei disso, pela sua pergunta: [Ô]passar dados para a controller[Ô]. O que quero fazer aqui é te ajudar a entender o que está acontecendo(e que você está fazendo). O melhor que posso fazer para realmente ajudar não é passar código, mas sim ajudar a entender esses conceitos que você está ainda com dificuldade.
PERCIFILHO 07/10/2016 08:06:56
#467931
é Kerp, talvez eu ainda não tenha entendido direito como é que tudo isso funciona, juro que estou tentando. Por isso peço paciência comigo.
Quando você disse:
Citação:

Tente entender o que está acontecendo aqui. Após visualizar a página, veja o conteúdo HTML que foi gerado. Todo o conteúdo dentro da tag [Ô]<form>[Ô].


Creio que estou errando em utilizar o verbo errado, não é?
Deveria ser: FormMethod.Post.
Pois o HTML gerado dentro da tag <form> é: <form action=[Ô]/Animais/CreateA[Ô] method=[Ô]post[Ô]>
Por favor me corrija se estiver errado.

KERPLUNK 09/10/2016 00:57:19
#467957
Eu sei que você está tentando. Eu estou vendo que você está progredindo bastante. Lembro quando para fazer uma tela como esta que você já pronta e fez sozinho, você não tinha idéia de como fazer e veja o que você conseguiu? Não imagina como isso me deixa contente! Poder ajudar alguém para mim é um grande prêmio, ainda mais alguém que realmente quer ser ajudado e que consegue [Ô]caminhar com as próprias pernas[Ô] após ser ajudado!

Pois é, quanto à sua dúvida. Se o que está gerado no HTML é um verbo POST, experimente tirar o comentário da rotina de gravação na sua controller e veja se está [Ô]chegando[Ô] lá usando um breakpoint.
PERCIFILHO 10/10/2016 08:57:18
#467970
Bom, Kerplunk, chegar lá, até chega, sim.
O problema é que traz um objeto nulo.
KERPLUNK 10/10/2016 21:49:13
#467987
Resposta escolhida
Tem certeza? Veja bem o que você está pensando que são os dados do form, uma instância da classe [Ô]Animal[Ô]. Onde você está criando essa instância de [Ô]Animal[Ô]? Seu método está recebendo algum parâmetro? Experimente colocar um parâmetro no seu método com o tipo [Ô]Animal[Ô] e verifique os valores recebidos nesse parâmetro.
PERCIFILHO 13/10/2016 15:56:16
#468060
Kerp, eu resolvi refazer tudo o que havia feito, começar tudo de novo. Quando surgirem mais dúvidas estarei postando.
Obrigadão.
Até mais.
Tópico encerrado , respostas não são mais permitidas