none
ajax.beginform updatetargetid RRS feed

  • Pergunta

  • olá, estou utilizando um formulário ajax, porém após dar o submit minha div não está sendo atualizada

    estou fazendo dessa maneira:

     

    <div id="dvSignIn" class="dvSignIn">
      @using (Ajax.BeginForm("signIn", "Home", new AjaxOptions
      {
       HttpMethod = "POST",
       InsertionMode = InsertionMode.Replace,
       LoadingElementId = "dvLoading",
       UpdateTargetId = "dvSignIn"
      },
       new { id = "signInForm" }))
      {
       <table>
       <tr>
       <td>
       @ViewData["email"].ToString()
       </td>
       <td>
       @Html.EditorFor(model => model.signIn.signInEmail)
       </td>
       <td class="tdValidate">
       @Html.ValidationMessageFor(model => model.signIn.signInEmail)
       </td>
       </tr>
       <tr>
       <td>
       @ViewData["password"].ToString()
       </td>
       <td>
       @Html.EditorFor(model => model.signIn.signInPassword)
       </td>
       <td class="tdValidate">
       @Html.ValidationMessageFor(model => model.signIn.signInPassword)
       </td>
       </tr>
       <tr>
       <td colspan="2">
       @Html.CheckBoxFor(model => model.signIn.signInRememberMe)
       @ViewData["checkBoxRm"].ToString()
       </td>
       <td></td>
       </tr>
       <tr>
       <td colspan="2" class="tdButtomEnter">
       <input type="submit" value="@ViewData["btnLogon"].ToString()" />
       <input type="reset" value="@ViewData["btnReset"].ToString()" />
       </td>
       <td></td>
       </tr>
       <tr>
       <td colspan="2">
       @ViewData["recoverPassword"].ToString()
       </td>
       <td></td>
       </tr>
       <tr>
       <td colspan="3">
       @Html.ValidationSummary(true, "")
       <div id="dvLoading" style="display: none;">
        <img src="@Url.Content("~/Content/images/load.gif")" />
       </div>
       </td>
       </tr>
       </table>
      }
      </div>
    

     

    quando dá o erro ele não volta a mensagem para o validationsummary

    controller

    if (!ModelState.IsValid) {
                    ModelState.AddModelError("*", "DEUS SEJA LOUVADO!!!!!!!");
                }

     

    na view adicionei os seguintes scripts:

     

     <script src="@Url.Content("~/Scripts/jquery-1.4.4.min.js")" type="text/javascript"></script>
     <script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
     <script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
     <script type="text/javascript" src="@Url.Content("~/Scripts/MicrosoftAjax.js")"></script>
     <script type="text/javascript" src="@Url.Content("~/Scripts/MicrosoftMvcAjax.js")"></script>
     <script type="text/javascript" src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.min.js")"></script>
    

    porém a div não é atualizad, na verdade não a view, mas validationsummary que não mostra o erro

    obs: no web config já está configurado

     

    <appSettings>
     <add key="ClientValidationEnabled" value="true"/> 
     <add key="UnobtrusiveJavaScriptEnabled" value="true"/> 
    </appSettings>
    

     

    se puderem me ajudar ficarei grato

    desde já agradeço, obrigado.




    sexta-feira, 13 de maio de 2011 21:59

Respostas

  • Olá Lucas Alves TO,

    O que sua action retorna? Quando você faz uma chamada ajax, você fica responsável por receber os dados de volta e apresntá-los da meneira correta. Somente pelo código que você postou, parece que o retorno está sendo 200. Adicionar erros no ModelState não força uma resposta de erro. Pelo código que você postou, eu tenho duas dicas para lhe dar.

    Você pode criar uma classe, por exemplo, ErrorResult, que herda da ContentResult e altera o código de retorno para 5XX. Além disto, você deverá criar uma função de erro javascript e atachá-la ao formuláro. Além disto, você não precisará incluir erros na coleção do ModelState. Assim:

        public class ErrorResult : ContentResult
        {
            public ErrorResult(string erro)
            {
                Content = erro;
            }
     
            public override void ExecuteResult(ControllerContext context)
            {
                context.HttpContext.Response.StatusCode = 500;
            }
        }
    @using (Ajax.BeginForm("signIn", "Home", new AjaxOptions
     {
      HttpMethod = "POST",
      InsertionMode = InsertionMode.Replace,
      LoadingElementId = "dvLoading",
      UpdateTargetId = "dvSignIn",
    OnFailure = "error"
     },
    <script type="text/javascript">
        function error(erro) {
            alert(erro);
            //Ou insera o erro em um elemento html
        }
    </script>

    Ou então, você pode criar uma partial view e deixá-la responsável por renderizar os erros. Neste caso, você inclui os error no ModelState (como você já está fazendo) e retorna a partila view. Desta maneira:

    ModelState.AddModelError("Error1""Mensagem de erro do controller");
    ModelState.AddModelError("Error2""Ooutro Error");
                
    return PartialView("_erros");

    E a partial view _erros:

    @Html.ValidationSummary()
    

    Você pode adicionar mais conteúdo a esta partial view se quiser. Lembre-se que, optando pela segunda opção, isto será interpretado como sucesso o resutlado será exibido na div divSignIn.

    Espero ter ajudado.


    Allan
    • Marcado como Resposta Lucas Alves T O terça-feira, 17 de maio de 2011 21:21
    segunda-feira, 16 de maio de 2011 15:10