MVC 3 проблема, когда привязка модели устанавливается через AJAX, а не обратно - PullRequest
3 голосов
/ 25 ноября 2011

У меня проблема с моделью, связывающей флажок из формы с действием на сервере с пользовательским объектом, содержащим логическое значение.

В 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":"","OfficeEmail‌​Address":"","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');
            }
        });

Ответы [ 2 ]

2 голосов
/ 28 ноября 2011

Я нашел решение.Это был мой вызов 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');
            }
        });
0 голосов
/ 25 ноября 2011

Вам необходимо отправить

{"model":{"TillAccess":["true","false"]}}

Связыватель модели не связывает вашу модель, поскольку он не может сопоставить параметр model с каким-либо свойством.

UPDATE:

TillAccess свойство имеет тип bool, но вы отправляете массив из 2 строк. Я думаю, что это проблема

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...