Usuário com melhor resposta
Problemas com formulário de site em MVC

Pergunta
-
Boa Noite,
Meu problema é o seguinte: Fiz um site todo em MVC, site de uma página, mas estou apanhando com o formulário. O formulário funciona, mas o problema é que na hora de enviar é como se fizesse um refresh e a tela volta para o Home. Eu queria que funcionasse assim: Ao enviar, é processado e a tela permanecesse na mesma posição de onde está o formulário.
Alguém saberia?
Respostas
-
Olá Fernando,
Fica igual, é uma ActionResult e no final retorna para onde vc quiser.
public ActionResult Inserir(ViewModel viewmodel) { //faço alguma coisa aqui return View("~/Views/AlgumaView.cshtml", viewModel); }
- Marcado como Resposta Fernando-Jr sábado, 24 de dezembro de 2016 18:23
Todas as Respostas
-
Bom dia,
Precisamos verificar o código pra saber Fernando. Você está fazendo o envio via JavaScript (jQuery, Angular, etc.)?
If you found this post helpful, please "Vote as Helpful". If it actually answered your question, remember to "Mark as Answer".
Se achou este post útil, por favor clique em "Votar como útil". Se por acaso respondeu sua dúvida, lembre de "Marcar como Resposta".
-
Olá,
Terás que fazer uma chamada assíncrona, utilizando por exemplo com JQuery. Segue o exemplo:
$.post("URL", $("#form").serialize() ).success(function (data) { if (data.success) { alert('Tarefa criada com sucesso!'); } else alert('Erro ao criar tarefa!'); }).error(function (XMLHttpRequest, textStatus, errorThrown) { alert('Erro ao criar tarefa!' + textStatus); });
Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta!
André Secco
Microsoft MSP & MSDN Tech Advisor
Blog: http://andresecco.com.br
GitHub: http://github.com/andreluizsecco
Twitter: @andre_secco -
Olá tudo bem?
Suponho que o que vc fala é que fez o post e retornou para a home. Nesse caso se você quer que retorne para a mesma página é só fazer o redirect na action na controller para a sua view.
Além disso use formulário ajax para não "recarregar" a página. Exemplo:
@using (Ajax.BeginForm("Action", "Controller", new AjaxOptions { HttpMethod = "POST", InsertionMode = InsertionMode.Replace, OnBegin = "algumMetodoJquery", OnComplete = "algumMetodoJquery", UpdateTargetId = "algumIDdoDOM" })) { Seu HTML aqui do form }
- Editado Pablo D Pagues Ernst sexta-feira, 25 de novembro de 2016 10:17
-
-
Bom dia,
Precisamos verificar o código pra saber Fernando. Você está fazendo o envio via JavaScript (jQuery, Angular, etc.)?
If you found this post helpful, please "Vote as Helpful". If it actually answered your question, remember to "Mark as Answer".
Se achou este post útil, por favor clique em "Votar como útil". Se por acaso respondeu sua dúvida, lembre de "Marcar como Resposta".
Primeiramente eu não fazia ideia de como fazer isso, então achei um projeto na net, não lembro onde foi, e adaptei para meu site. Caso tenha alguma ideia melhor, ou mais fácil, por favor me oriente. Estou usando o System.Net.Mail para o envio de e-mail's.
Todos os trechos do site estão em views parciais, não sei se isso influência...
Segue abaixo um trecho da estrutura.
1 - Na pasta Views\Home tem o _ContactPartial.cshtml;
2 - Na Home da Controller tem os métodos referente ao _ContactPartial,
<-##################_ContactPartial.cshtml################->
@using System.Web.Optimization
@model cia_vira_tempo_teatro.Models.ContactViewModels
<a name="contato"></a>
<p>Contato</p>
@using (Html.BeginForm("_ContactPartial", "Home", FormMethod.Post))
{
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
<div class="form-group">
@Html.LabelFor(m => m.De)
<div class="controls">
<div class="input-group">
<span class="input-group-addon"><i class="glyphicon glyphicon-envelope"></i></span>
<input type="text" class="form-control" style="width: 48%;" name="De" id="De">
</div>
</div>
</div>
<div class="form-group">
@Html.LabelFor(m => m.Telefone)
<div class="controls">
<div class="input-group">
<span class="input-group-addon"><i class="glyphicon glyphicon-envelope"></i></span>
<input type="text" class="form-control" style="width: 48%;" name="Telefone" id="Telefone">
</div>
</div>
</div>
<div class="form-group">
@Html.LabelFor(m => m.Mensagem)
<div class="controls">
<textarea rows="6" class="form-control" style="width: 50%;" name="Mensagem" id="Mensagem"></textarea>
</div>
</div>
<div class="form-group">
<button type="submit" onclick="SendEmail()" class="btn btn-primary">Enviar <span class="glyphicon glyphicon-send"></span></button>
</div>
}
<--########################### HomeController#####################-->
[HttpPost]
public ActionResult _ContactPartial(ContactViewModels Email)
{
try
{
...
if (ModelState.IsValid)
{
...
EnviarEmail(Email);
}
//O return ABAIXO FOI UMA SOLUÇÃO QUE EU VI NA NET QUE FAZ COM QUE AO ENVIAR O FORMULÁRIO, É FEITO UM REFRESH NA PÁGINA E É MOSTRADO O TOPO DO SITE.
//ANTES EU ESTAVA USANDO UM RETURN SIMPLES PARA A VIEW PARCIAL _ContactPartial, MAS O PROBLEMA É QUE A PÁGINA TODA FICAVA SEM LAYOUT, APARECENDO APENAS O FORMULÁRIO.
return Redirect(Url.RouteUrl(new { controller = "Home", action = "Index" }));
}
catch
{
ViewBag.Erro = true;
return PartialView();
}
}
public void EnviarEmail(ContactViewModels Email)
{
try
{
...
}
catch
{
ViewBag.Erro = true;
}
} -
fala camarada ,
voce esta usando ajax? jquery ?
se sim da um location.reload();
agora se nao vc pode usar
no seu action result
return Redirect(HttpContext.Request.UrlReferrer.AbsoluteUri);
-
Olá tudo bem?
Suponho que o que vc fala é que fez o post e retornou para a home. Nesse caso se você quer que retorne para a mesma página é só fazer o redirect na action na controller para a sua view.
Além disso use formulário ajax para não "recarregar" a página. Exemplo:
@using (Ajax.BeginForm("Action", "Controller", new AjaxOptions { HttpMethod = "POST", InsertionMode = InsertionMode.Replace, OnBegin = "algumMetodoJquery", OnComplete = "algumMetodoJquery", UpdateTargetId = "algumIDdoDOM" })) { Seu HTML aqui do form }
Boa Tarde Pablo, tudo bom?
Como ficaria a controler mudando para Ajax?
-
Olá Fernando,
Fica igual, é uma ActionResult e no final retorna para onde vc quiser.
public ActionResult Inserir(ViewModel viewmodel) { //faço alguma coisa aqui return View("~/Views/AlgumaView.cshtml", viewModel); }
- Marcado como Resposta Fernando-Jr sábado, 24 de dezembro de 2016 18:23
-
Olá tudo bem?
Suponho que o que vc fala é que fez o post e retornou para a home. Nesse caso se você quer que retorne para a mesma página é só fazer o redirect na action na controller para a sua view.
Além disso use formulário ajax para não "recarregar" a página. Exemplo:
@using (Ajax.BeginForm("Action", "Controller", new AjaxOptions { HttpMethod = "POST", InsertionMode = InsertionMode.Replace, OnBegin = "algumMetodoJquery", OnComplete = "algumMetodoJquery", UpdateTargetId = "algumIDdoDOM" })) { Seu HTML aqui do form }
Legal,
Fiz aqui e deu certo. Mas agora não está enviando o e-mail. Parece que a controller não está sendo chamada. Fiz assim:
@using (Ajax.BeginForm("_ContactPartial", "HomeController", new AjaxOptions
{
HttpMethod = "POST",
LoadingElementId = "loading-area",
LoadingElementDuration = 1000,
Url = Url.Action("Submit"),
OnBegin = "HideForm",
OnFailure = "ShowFailure",
UpdateTargetId = "message-area"
})) -
Olá tudo bem?
Suponho que o que vc fala é que fez o post e retornou para a home. Nesse caso se você quer que retorne para a mesma página é só fazer o redirect na action na controller para a sua view.
Além disso use formulário ajax para não "recarregar" a página. Exemplo:
@using (Ajax.BeginForm("Action", "Controller", new AjaxOptions { HttpMethod = "POST", InsertionMode = InsertionMode.Replace, OnBegin = "algumMetodoJquery", OnComplete = "algumMetodoJquery", UpdateTargetId = "algumIDdoDOM" })) { Seu HTML aqui do form }
Legal,
Fiz aqui e deu certo. Mas agora não está enviando o e-mail. Parece que a controller não está sendo chamada. Fiz assim:
@using (Ajax.BeginForm("_ContactPartial", "HomeController", new AjaxOptions
{
HttpMethod = "POST",
LoadingElementId = "loading-area",
LoadingElementDuration = 1000,
Url = Url.Action("Submit"),
OnBegin = "HideForm",
OnFailure = "ShowFailure",
UpdateTargetId = "message-area"
}))Boa Tarde,
Vi onde estava o erro e agora deu certo.
Agradeço pela sua ajuda e a de todos.
-