将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 }; }
如果你需要在这里看到实际的登录表单
登录表单将加载到主页面上
不确定这是否与此有关,但我想我会提到它。
编辑:登录表单加载类似于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,现在我有两种方法可以在将来解决这个问题。