【问题标题】:MVC 3 issue when model binding checkbox through AJAX rather than postback通过 AJAX 而不是回发模型绑定复选框时的 MVC 3 问题
【发布时间】:2011-11-25 10:57:58
【问题描述】:

我遇到了一个问题,模型将表单中的复选框绑定到服务器上的操作,其中包含布尔值的自定义对象。

google了一下好像有很多问题,没有好的解决办法。我尝试了多种方法,但问题似乎只发生在通过 ajax 调用而不是正常回发发送时。

我的项目中有以下内容(为简洁起见):

查看

@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 的模型绑定器?

更新

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":""}

更新

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

更新

我使用这个 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');
            }
        });

【问题讨论】:

  • 尝试将serializeObject 函数更改为使用输入的id 而不是nameHtml.CheckBoxFor 创建没有id 的第二个输入,但具有相同的name

标签: jquery asp.net-mvc asp.net-mvc-3 razor


【解决方案1】:

我找到了解决方案。是我的 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】:

    你需要发送

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

    模型绑定器未绑定您的模型,因为它无法将model 参数与任何属性匹配。

    更新:

    TillAccess 属性的类型为 bool,但您发送的是一个包含 2 个字符串的数组。我觉得这是个问题

    【讨论】:

    • 我看不出这是问题所在,因为此 Json 是由框架为我自动生成的,并且所有其他字段都已正确绑定。全文如下: {"BusinessUnitId":"cd56b710-0171-11e1-be50-0800200c9a66","Person.Salutation":"","Person.FirstName":"","Person.LastName":"" ,"TillAccess":["true","false"],"OfficeAccess":"false","TillLoginId":"","OfficeEmailAddress":"","OfficePassword":""}
    • 再一次,这不是我正在生成的东西,它是它的 ajax 端的序列化方法。即我正在做“var FormData = JSON.stringify($('#CreateUserWizardForm').serializeObject());”
    • 表示你的$('#CreateUserWizardForm').serializeObject()返回了错误的JSON。
    • 我相信serializeObject() 正在创建json,因为@Html.CheckBoxFor 创建了两个具有相同名称属性的html 元素
    • 啊,我刚刚注意到 serializeObject() 方法是我从互联网上复制的,而不是 jQuery 内置的。我将在我的帖子中发布上面的功能。另外,我确定我添加了这个方法调用,因为默认情况下没有正确构建 Json。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-06
    • 1970-01-01
    相关资源
    最近更新 更多