如何使用jquery ajax将视图模型和其他参数传递给我的action方法?
我现在正在做的事情,没有调用action方法。我认为原因可能是因为参数未在jquery ajax调用的数据对象中正确传递:
jQuery ajax:
$('#form-login').submit(function (event) {
event.preventDefault();
$.ajax({
url: "/Account/LogOn/",
data: $('#form-login').serialize(),
contentType: 'application/json; charset=utf-8',
success: function (data) {
if (data.userAuthenticated) {
window.location.href = data.url;
} else {
formBlock.clearMessages();
displayError($('#errorcred').val());
}
},
error: function () {
formBlock.clearMessages();
displayError($('#errorserver').val());
}
});
});
Action方法(接受视图模型和另一个参数):
[HttpPost]
public ActionResult LogOn(LogOnModel model, string returnUrl)
{
// Validate the email and password
if (ModelState.IsValid)
{
if (MembershipService.ValidateUser(model.UserName, model.Password))
{
FormsService.SignIn(model.UserName, model.RememberMe);
if (Url.IsLocalUrl(returnUrl))
{
if (Request.IsAjaxRequest())
{
return Json(new { userAuthenticated = true, url = returnUrl, isRedirect = true });
}
else
{
return Redirect(returnUrl);
}
}
else
{
if (Request.IsAjaxRequest())
{
return Json(new { userAuthenticated = true, url = Url.Action("Index", "Home"), isRedirect = true });
}
else
{
return RedirectToAction("Index", "Home");
}
}
}
}
else
{
if (Request.IsAjaxRequest())
{
return Json(new { userAuthenticated = false, url = Url.Action("LogOn", "Account") });
}
else
{
ModelState.AddModelError("", adm.ErrorUserNamePassword);
}
}
// If we got this far, something failed, redisplay form
return View(model);
}
答案 0 :(得分:0)
从$ .ajax调用中删除以下内容:
contentType: 'application/json; charset=utf-8',
您已指定application/json
个编码,但$('#form-login').serialize()
功能正在发送application/x-www-form-urlencoded
个内容。
就发送returnUrl参数而言,您只需从action
表单中读取它(如果您使用Html.BeginForm()
帮助程序):
$.ajax({
url: this.action,
...
});
此外,您可能希望使用其他内容重命名event
变量,因为这是javascript中的保留字:
$('#form-login').submit(function (e) {
e.preventDefault();
...
});
答案 1 :(得分:0)
我发现这样做的唯一方法是在viewmodel中包含第二个参数,并继续按照您现在的方式序列化表单。