Предайте ViewModel + параметър към действие с помощта на ajax повикване

Как да предам модел на изглед и друг параметър към моя метод на действие с помощта на jquery ajax?

с това, което правя сега, методът за действие не се извиква. Мисля, че причината вероятно е, защото параметрите не се предават правилно в обекта с данни на извикването на 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());
                    }
                });
        });

Метод на действие (който приема модела на изгледа и друг параметър):

[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);
    }

person vobs    schedule 07.07.2013    source източник


Отговори (2)


Премахнете следното от извикването $.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();

    ...
});
person Darin Dimitrov    schedule 07.07.2013
comment
Но как параметрите се картографират правилно с $('#form-login').serialize(), тъй като имам два параметъра за метода на действие? - person vobs; 07.07.2013
comment
$('#form-login').serialize() ще приеме само параметрите, които присъстват като input полета във формуляра. Забелязах, че имате параметър returnUrl. Този параметър обикновено присъства в низа на заявката, когато модулът за удостоверяване на формуляри е пренасочен към страницата за влизане. И ако сте използвали помощника @Html.BeginForm() в него, той ще бъде част от атрибута action на формуляра. Така че, когато използвате url: this.action вместо да го кодирате твърдо, както направихте (url: "/Account/LogOn/"), той ще бъде прехвърлен към действието. - person Darin Dimitrov; 07.07.2013
comment
Ако искате да подадете ръчно допълнителен параметър, най-лесно ще бъде да включите скрито поле във вашия формуляр и след това да зададете стойността на това скрито поле във вашия javascript код, преди да извикате метода $.ajax. Тогава функцията .serialize ще го вземе предвид. - person Darin Dimitrov; 07.07.2013

Единственият начин, който открих да направя това, е просто да включа втория параметър във вашия изгледмодел и да продължа да сериализирам вашата форма по начина, по който правите сега.

person pforsthoff    schedule 07.11.2017