将Json对象从控制器操作返回到jQuery

我正试图让它正常工作(现在2天)。 我正在进行登录,我从jQuery调用控制器操作,传递一个JSON对象(利用json2.js)并从控制器返回一个Json对象。 我可以调用该动作,但是不能将响应放在我想要的地方,它只是打开一个新窗口,并在屏幕上打印:

{"Message":"Invalid username/password combination"} 

并且URL看起来像http:// localhost:13719 / Account / LogOn,所以不是调用操作而不是重新加载页面,而是将用户带到控制器,这是不好的。

所以现在对于一些代码,首先是控制器代码

 [HttpPost] public ActionResult LogOn(LogOnModel model, string returnUrl = "") { if (ModelState.IsValid) { var login = ObjectFactory.GetInstance<IRepository>(); var user = login.FindOne(x => x.Login == model.Username && x.Pwd == model.Password); if (user == null) return Json(new FailedLoginViewModel { Message = "Invalid username/password combination" }); else { if (!string.IsNullOrEmpty(returnUrl)) return Redirect(returnUrl); else return RedirectToAction("Index", "Home"); } } return RedirectToAction("Index", "Home"); } 

和jQuery代码

 $("#signin_submit").click(function () { var login = getLogin(); $.ajax({ type: "POST", url: "../Account/LogOn", data: JSON.stringify(login), dataType: 'json', contentType: 'application/json; charset=utf-8', error: function (xhr) { $("#message").text(xhr.statusText); }, success: function (result) { } }); }); function getLogin() { var un = $("#username").val(); var pwd = $("#password").val(); var rememberMe = $("#rememberme").val(); return (un == "") ? null : { Username: un, Password: pwd, RememberMe: rememberMe }; } 

如果你需要在这里看到实际的登录表单

 
m.Username) %> m.Username, new { @class = "inputbox", @tabindex = "4", @id = "username" })%> m.Username, "*")%>

m.Password) %> m.Password, new { @class = "inputbox", @tabindex = "5", @id = "password" })%> m.Password, "*")%>

m.RememberMe, new { @class = "inputbox", @tabindex = "7", @id = "rememberme" })%> m.RememberMe) %>

Forgot your password?

Forgot your username?

<%= Html.ValidationSummaryJQuery("Please fix the following errors.", new Dictionary { { "id", "valLogOnContainer" } })%>

登录表单将加载到主页面上

  

不确定这是否与此有关,但我想我会提到它。

编辑:登录表单加载类似于Twitter登录,单击链接,并在jQuery和CSS的帮助下加载表单

您的行动签名如下:

 public virtual JsonResult ActionName() { var abcObj = new ABC{a=1,b=2}; return Json(abcObj); } 

如果您正在使用MVC 2,则必须返回以下内容:

 return Json(your_object, JsonRequestBehavior.AllowGet); 

我在这里找到了它

对于不同的用法,这是我的代码。

JQuery:

 $(document).ready(function () { $("#InputDate").live('click', function () { var date = $("#InputDate").val(); if (date != "") { $.getJSON("/Home/GetNames", { date: $("#InputDate").val() }, function (data) { $("#ProviderName").empty(); // [...] }); }); } }); }); 

和C#

 public JsonResult GetNames(string date) { List list = new List(); // [...] return Json(list, JsonRequestBehavior.AllowGet); } 

好的想出了一个我认为我会在这里分享的解决方案,以防有人提出类似问题。 我没有使用$ .ajax,而是使用$ .post并将我的jQuery代码改为看起来像这样,一切都按照我最初的预期方式运行:

 $("#signin_submit").click(function () { var f = $($("form")[0]); f.submit(function () { var loginData = f.serialize(); $.post(f.attr("action"), loginData, function (result, status) { if (!result.Success) { $("#message").text(result.Message); } }, "json"); return false; }); }); 

感谢所有看过我问题的人,感谢@kerrubin,因为我没有意识到这个问题。

考虑@ user350374关于制作我的动作JsonResult而不是ActionResult的签名的说法我做了一些修补和修改我的原始解决方案以利用JsonResult并在jQuery中执行所有检查/重定向而不是在动作中。

我的行动改为

 [HttpPost,MoveFormsScript] public JsonResult LogOn(LogOnModel model, string returnUrl = "") { if (ModelState.IsValid) { var login = ObjectFactory.GetInstance>(); var user = login.FindOne(x => x.Login == model.Username && x.Pwd == model.Password); if (user == null) return Json(new LoginResult { Success = false, Message = "Invalid login" }); else { return Json(new LoginResult { Success = true, Message = "Redirecting...", ReturnUrl = (!string.IsNullOrEmpty(returnUrl)) ? returnUrl : string.Format("Account/Index/{0}", user.Photographer.Key) }); } } else { return Json(new LoginResultDTO { Success = false, Message = "Incomplete fields" }); } } 

我的jQuery调用

 $("#signin_submit").click(function () { var f = $($("form")[0]); f.submit(function () { var loginData = f.serialize(); $.post(f.attr("action"), loginData, function (result, status) { if (!result.Success) { $("#message").text(result.Message); $("#username").focus(); $("#username").select(); } else { window.location.replace(result.ReturnUrl); } }, "json"); return false; }); }); 

LoginResult是一个简单的类,用于保存部件

 public class LoginResult { public bool Success { get; set; } public string Message { get; set; } public string ReturnUrl { get; set; } } 

感谢提示@ user35037,现在我有两种方法可以在将来解决这个问题。