我在强类型视图中使用带有 JSON 对象的 ajax post 作为数据。表单序列化工作正常,但在控制器中获取模型时,没有映射属性。在 Firebug 中,我获得了以下快照
如何将序列化的 JSON 对象映射到 c# 对象
我在强类型视图中使用带有 JSON 对象的 ajax post 作为数据。表单序列化工作正常,但在控制器中获取模型时,没有映射属性。在 Firebug 中,我获得了以下快照
如何将序列化的 JSON 对象映射到 c# 对象
您必须复制 jquery 扩展才能将表单转换为 json 对象
(function() {
$.fn.serializeObject = function() {
var o = {};
var a = this.serializeArray();
$.each(a, function() {
if (o[this.name]) {
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;
};
})(jQuery)
并包含json2.js库以添加JSON.stringify()
对旧版浏览器 的支持
然后将您的ajax更改为
$.ajax({
url : '',
type: 'POST',
contentType : 'application/json',
data : JSON.stringify($('form').serializeObject()),
....
})
在你的情况下
$('#frm').submit(function() {
postJSON('@Url.Action("Create", "District")', JSON.stringify($('form').serializeObject()),
function(result) {
alert(result.Message);
if (result.Success) {
window.location = '@Url.Action("Index", "District")';
}
});
return false;
});
那只是一个标准的序列化形式。它不是 JSON。
你可能想看看这个。
如果您还想包含复选框和单选按钮,可以使用@Arun_P_Johny 答案,也应该使用以下内容覆盖 serializeArray:
$.fn.serializeArray = function (options) {
var o = $.extend({
checkboxesAsBools: false
}, options || {});
var rselectTextarea = /select|textarea/i;
var rinput = /text|hidden|password|search/i;
return this.map(function () {
return this.elements ? $.makeArray(this.elements) : this;
})
.filter(function () {
return this.name && !this.disabled &&
(this.checked
|| (o.checkboxesAsBools && this.type === 'checkbox')
|| rselectTextarea.test(this.nodeName)
|| rinput.test(this.type));
})
.map(function (i, elem) {
var val = $(this).val();
return val == null ?
null :
$.isArray(val) ?
$.map(val, function (val, i) {
return { name: elem.name, value: val };
}) :
{
name: elem.name,
value: (o.checkboxesAsBools && this.type === 'checkbox') ? (this.checked ? 'true' : 'false') : val
};
}).get();
};
serializeObject 应该被修改
$.fn.serializeObject = function () {
var o = {};
var a = this.serializeArray({ checkboxesAsBools: true });
$.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;
};