使用ajax调用将ViewModel + Parameter传递给action

时间:2013-07-07 14:31:15

标签: asp.net-mvc-3 jquery actionmethod

如何使用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);
    }

2 个答案:

答案 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中包含第二个参数,并继续按照您现在的方式序列化表单。