Подтвердить что ты не робот

ASP.NET 5/MVC 6 Модель Ajax post to Controller

В моем приложении ASP.NET 5 MVC 6 я хочу отправить с Ajax некоторые данные моему контроллеру. Я уже сделал это с ASP.NET MVC 5, и я протестировал тот же самый код в пустом проекте ASP.NET MVC 5, и он сработал, но с новой версией я не могу, и я не знаю почему. С вызовом Ajax я могу перейти к контроллеру, модель создана, но поля имеют значение null (или false для логического). Вот мой код:

script.js:

var data = {
            model: {
                UserName: 'Test',
                Password: 'Test',
                RememberMe: true
            }
        };

        $.ajax({
            type: "POST",
            url: "/Account/Login/",
            data: JSON.stringify(data),
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function (msg) {
                // Do something interesting here.
            }
        });

AccountController.cs:

[HttpPost]
    public JsonResult Login(LoginViewModel model)
    {
        if (ModelState.IsValid)
        {
            //var result = await SignInManager.PasswordSignInAsync(model.UserName, model.Password, model.RememberMe, shouldLockout: false);
            //if (result.Succeeded)
            //{
            //     //return RedirectToLocal(returnUrl);
            //}

            ModelState.AddModelError("", "Identifiant ou mot de passe invalide");
            return Json("error-model-wrong");
        }

        // If we got this far, something failed, redisplay form
        return Json("error-mode-not-valid");
    }

LoginViewModel.cs:

public class LoginViewModel
{
    [Required]
    [Display(Name = "UserName")]
    [EmailAddress]
    public string UserName { get; set; }

    [Required]
    [DataType(DataType.Password)]
    [Display(Name = "Password")]
    public string Password { get; set; }

    [Display(Name = "Remember me?")]
    public bool RememberMe { get; set; }
}

Любые идеи? Благодаря

4b9b3361

Ответ 1

Вам нужно явно использовать FromBody на MVC6, если вы используете json

public JsonResult Login([FromBody]LoginViewModel model)

ИЗМЕНИТЬ

Думаю, вы смешиваете разные ошибки. Я попытаюсь описать, как вы должны сделать запрос:

content-type должен быть: application/json

тело запроса должно быть в формате JSON (как предполагал JasonLind):

{
    UserName: 'Test',
    Password: 'Test',
    RememberMe: true
};

это то, что вы должны увидеть при проверке запроса (через хром-инструменты отладчика F12) или с помощью инспектора запросов, такого как скрипач.

Если вы видите что-то в форме UserName=Test&Password=Test&RememberMe=true, то вы делаете это неправильно, этот формат формы.

вам не нужна переменная model. если вы видите свой запрос с помощью "обертки", вы должны удалить его.

Ответ 2

Не должно быть:

 var data = {
            UserName: 'Test',
            Password: 'Test',
            RememberMe: true

    };

Ответ 3

Хорошо, я нашел решение, но это все еще странно для меня... Вам просто нужно удалить content-type из запроса.

$.ajax({
            type: "POST",
            url: "Account/Login",
            data: data,
            success: function (msg) {
                // Do something interesting here.
            }
        });

Я нашел решение благодаря наблюдателю:) Я просмотрел переменную Request и обнаружил, что Request.Form всегда выбрасывает исключение. Он сказал, что я использовал неправильный тип контента, поэтому я просто удалил content-type из моего сообщения ajax и работал как шарм. Я думаю, что для каждого сообщения ajax, которое вы сделаете, вы должны быть осторожны, чтобы ваш Request.Form был правильно заполнен.

enter image description here

ИЗМЕНИТЬ: Это решение работает только тогда, когда вы можете публиковать не-json-данные (очень простые данные), такие как данные связи. Но если я хочу опубликовать сложные данные, как список, он больше не работает...

Ответ 4

Ваша проблема не в MVC6 - это jQuery. $.ajax() проверяет "данные" и знает его формат, поэтому задает тип контента для вашего, а также вы должны использовать $.ajax в режиме обещания.

check promises vantages здесь

а также выберите форму и просто превратитесь в объект, например

 $('.anyForm').on('submit', fucntion(){
        //you have the form in JSON format
        var data = $(this).serializeObject()

    })

и здесь является методом serializeObject(), по умолчанию он не находится в jQuery.