2010-12-21 34 views
1

好吧请帮助,我一直在这个问题感到沮丧。返回jsonresult表现未知与jquery post

我需要设置错误值或在用户点击提交按钮时执行重定向。 (它是一个标准的登录表单)。我需要用ajax来做。

我认为它几乎工作,但是当用户点击提交页面只显示: {“重定向”:“/首页/索引”}

或 {“错误”:“用户名或提供的密码不正确。“}

它没有重定向/显示错误我打算如何。

一些背景 - 形式是一个登录表单,它位于一个模式弹出的对话框内(jQueryUI的)

继承人我的jquery:

$("#submit").click(function() { 
      $.post({ 
       url: "Account/LogOn", 
       dataType: "json", 
       success: function (data) { 
        if (data.redirect) { 
         // data.redirect contains the string URL to redirect to 
         window.location.href = data.redirect; 
        } 
        else { 
         // data.form contains the HTML for the replacement form 
         $("#error").replaceWith(data.error); 
        } 
       } 
      }); 
      return false; 
     }); 

和我的继承人操作方法:

[HttpPost] 
    public JsonResult LogOn(LogOnModel model, string returnUrl) 
    { 
     if (ModelState.IsValid) 
     { 
      if (MembershipService.ValidateUser(model.UserName, model.Password)) 
      { 
       FormsService.SignIn(model.UserName, model.RememberMe); 
       if (Url.IsLocalUrl(returnUrl)) 
       { 
        return Json(new { redirect = returnUrl }); 
       } 
       else 
       { 
        return Json(new { redirect = "/Home/Index" }); 
       } 
      } 

     } 
     return Json(new { error = "The user name or password provided is incorrect." }); 
    } 

继承人是我的表格:

@using (Html.BeginForm("LogOn", "Account")) 
{ 

    <div> 
     <fieldset> 
      <legend>Account Information</legend> 

      <div class="editor-label"> 
       @Html.LabelFor(m => m.UserName) 
      </div> 
      <div class="editor-field"> 
       @Html.TextBoxFor(m => m.UserName) 
       @Html.ValidationMessageFor(m => m.UserName) 
      </div> 

      <div class="editor-label"> 
       @Html.LabelFor(m => m.Password) 
      </div> 
      <div class="editor-field"> 
       @Html.PasswordFor(m => m.Password) 
       @Html.ValidationMessageFor(m => m.Password) 
      </div> 

      <div class="editor-label"> 
       @Html.CheckBoxFor(m => m.RememberMe) 
       @Html.LabelFor(m => m.RememberMe) 
      </div> 

      <p> 
       <input id="submit" type="submit" value="Log On" /> 
      </p> 
     </fieldset> 
    </div> 
} 
+1

为什么你不能只从控制器'HttpPost'做重定向? (例如'RedirectToAction' - 它也满足PRG模式)。为什么你需要返回JSON,然后在客户端做? – RPM1984 2010-12-21 12:01:16

+0

也许我可以做重定向,但我也需要覆盖通过ajax显示错误的情况。我无法重定向到此实例中的另一个页面,因为登录表单位于模态对话框中 – raklos 2010-12-21 12:03:00

+1

您确定您的点击功能正在运行吗?关于你的描述,这听起来像表单是通常的方式提交。在函数的底部使用http://api.jquery.com/event.preventDefault/。 – 2010-12-21 12:28:32

回答

1

哎哟,整个$ .post() - 调用是错误的。

使用此:

$("#submit").click(function (e) {e.preventDefault(); 
      $.post("Account/LogOn", 
        $(this.form).serialize(), 
        function (data) 
        { 
         if (data.redirect) 
         { 
         // data.redirect contains the string URL to redirect to 
         window.location.href = data.redirect; 
         } 
         else 
         { 
         // data.form contains the HTML for the replacement form 
         $("#error").replaceWith(data.error); 
         } 
        }, 
        'json' 
      ); 
      return false; 
     }); 

您已经使用的参数的符号像预计在$阿贾克斯(),但在$.post()它的与众不同。

+0

谢谢sooo much! – raklos 2010-12-21 13:58:34