1

如何使用 jquery ajax 将视图模型和另一个参数传递给我的操作方法?

就我现在正在做的事情而言,没有调用 action 方法。我认为原因可能是因为在 jquery ajax 调用的数据对象中没有正确传递参数:

jQuery的阿贾克斯:

$('#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);
    }
4

2 回答 2

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();

    ...
});
于 2013-07-07T14:33:42.587 回答
0

我发现这样做的唯一方法是在您的视图模型中包含第二个参数并继续按照您现在的方式序列化您的表单。

于 2017-11-07T04:14:30.813 回答