У меня проблема с моделью, связывающей флажок из формы с действием на сервере с пользовательским объектом, содержащим логическое значение.
В Google, похоже, есть много проблем с этим, и нет хорошего решения. Я пробовал несколько вещей, и проблема, кажется, возникает только тогда, когда она отправляется с помощью вызова ajax, а не обычной обратной передачи.
В моем проекте есть следующее (для краткости сокращено):
View
@Html.LabelFor(model => model.TillAccess)
@Html.CheckBoxFor(m => m.TillAccess)
Модель
public class CreateUserModel
{
public Boolean TillAccess { get; set; }
}
Действие контроллера
[HttpPost]
public virtual ActionResult CreateUserWizard(CreateUserModel model)
{
...
}
Я добавил в форму 2 кнопки, одна из которых отправляется в качестве обратной передачи и работает. Если я проверю его на fiddler2, он отправляет следующее с обратной передачей:
TillAccess=true&TillAccess=false
Если я отправляю его с помощью кнопки ajax, отправляется следующее:
{"TillAccess":["true","false"]}
Есть ли проблема с тем, как модель MVC связывает JSON, которая останавливает эту работу ??
Я не могу заставить это работать через AJAX (который я буду интенсивно использовать), каждое другое поле связывается нормально, только не флажок, и тот факт, что это работает отлично, так как обычный постбэк предполагает свою проблему с сериализатором JSON или модель связующего для MVC?
UPDATE
Ajax-вызов выглядит следующим образом:
function CreateUser() {
var FormData = JSON.stringify($('#CreateUserWizardForm').serializeObject());
$.ajax({
url: '@Url.Action(MVC.User.User.ActionNames.CreateUserWizard)',
data: FormData,
contentType: "application/json",
dataType: "json",
type: 'POST',
cache: 'false',
success: function (response) {
alert('successfully created user!');
},
error: function (xhr) {
alert('There was an error creating a user');
}
});
}
Полный пост Ajax выглядит следующим образом:
{"BusinessUnitId":"cd56b710-0171-11e1-be50-0800200c9a66","Person.Salutation":"","Person.FirstName":"","Person.LastName":"","TillAccess":["true","false"],"OfficeAccess":"false","TillLoginId":"","OfficeEmailAddress":"","OfficePassword":""}
UPDATE
Метод serializeObject был загружен из Интернета (поскольку у меня возникли проблемы с json при публикации) и выглядит следующим образом:
$.fn.serializeObject = function () {
var o = {};
var a = this.serializeArray();
$.each(a, function () {
if (o[this.name] !== undefined) {
if (!o[this.name].push) {
o[this.name] = [o[this.name]];
}
o[this.name].push(this.value || '');
} else {
o[this.name] = this.value || '';
}
});
return o;
};
UPDATE
Причина, по которой я использовал этот метод serializeObject, была вызвана ошибкой, которую я получил, если использовал встроенный вызов:
$('#CreateUserWizardForm').serialize()
Создано сообщение:
BusinessUnitId=cd56b710-0171-11e1-be50-0800200c9a66&Person.Salutation=&Person.FirstName=&Person.LastName=&TillAccess=true&TillAccess=false&OfficeAccess=false&TillLoginId=&OfficeEmailAddress=&OfficePassword=
Что дало мне ошибку следующим образом:
System.ArgumentException: Invalid JSON primitive: BusinessUnitId.
ОБНОВЛЕНИЕ - ОТВЕТ (Я пытался добавить свой ответ внизу, но он не позволил мне)
Я нашел решение. Это был мой вызов AJAX, который был неправильным. Я изменил его на следующее, и оно работает.
$.ajax({
url: '@Url.Action(MVC.User.User.ActionNames.CreateUserWizard)',
data: $('#CreateUserWizardForm').serialize(),
type: 'POST',
cache: 'false',
success: function (response) {
alert('successfully created user!');
},
error: function (xhr) {
alert('There was an error creating a user');
}
});
Старый вызов AJAX:
var FormData = JSON.stringify($('#CreateUserWizardForm').serializeObject());
$.ajax({
url: '@Url.Action(MVC.User.User.ActionNames.CreateUserWizard)',
data: FormData,
contentType: "application/json",
dataType: "json",
type: 'POST',
cache: 'false',
success: function (response) {
alert('successfully created user!');
},
error: function (xhr) {
alert('There was an error creating a user');
}
});