【发布时间】: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":"","OfficeEmailAddress":"","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而不是name。Html.CheckBoxFor创建没有id的第二个输入,但具有相同的name
标签: jquery asp.net-mvc asp.net-mvc-3 razor