none
Problemas com formulário de site em MVC RRS feed

  • 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?

    sexta-feira, 25 de novembro de 2016 06:55

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
    terça-feira, 29 de novembro de 2016 17:21

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".

    sexta-feira, 25 de novembro de 2016 09:14
  • 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

    sexta-feira, 25 de novembro de 2016 10:14
  • 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
        
    }


    sexta-feira, 25 de novembro de 2016 10:15
  • 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);

    sexta-feira, 25 de novembro de 2016 14:02
  • 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".

    Bom, desculpe a extensão da resposta, mas não dá para anexar arquivo.

    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 &nbsp;<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;
                }

            }
    sexta-feira, 25 de novembro de 2016 19:44
  • 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);

    Usando a função location.reload fuciona, mas a tela não para de ficar carregando. Já o return, estou usando.
    terça-feira, 29 de novembro de 2016 01:51
  • 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?

    terça-feira, 29 de novembro de 2016 16:17
  • 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
    terça-feira, 29 de novembro de 2016 17:21
  • 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"

                            }))

    terça-feira, 29 de novembro de 2016 18:15
  • 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.

    terça-feira, 29 de novembro de 2016 20:21
  • Excelente Fernando. Abraço!
    quarta-feira, 30 de novembro de 2016 10:10