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; }
}
Любые идеи?
Благодаря
Ответы
Ответ 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.