C# 将包含数组的JSON数据发布到控制器操作
在ASP.NET MVC3应用程序中,我尝试使用jQuery对操作进行异步发布 以下JSON对象正在作为数据传递C# 将包含数组的JSON数据发布到控制器操作,c#,json,asp.net-mvc-3,jquery,C#,Json,Asp.net Mvc 3,Jquery,在ASP.NET MVC3应用程序中,我尝试使用jQuery对操作进行异步发布 以下JSON对象正在作为数据传递 { categoryId: "21" content: "asdf" reference: "asdf" tags: [ {id: 1, name: "asdf", status: 1}, {id: 2, name: "asdf", status: 1}, {id: 3, name: "asdf", st
{
categoryId: "21"
content: "asdf"
reference: "asdf"
tags: [
{id: 1, name: "asdf", status: 1},
{id: 2, name: "asdf", status: 1},
{id: 3, name: "asdf", status: 1}
]
}
我必须接收请求的方法签名是
[HttpPost]
public ActionResult Create(String reference, Int32? categoryId, String content, IEnumerable<TagDTO> tags)
我应该提到,在我将对象数组引入JSON对象和action方法的签名之前,它工作得非常好。并且Post仍然成功地到达了操作,只是IEnumerable中的数据没有正确通过。它将为我提供IEnumerable中正确数量的对象,但它们都初始化为默认值。(id=0,name=null,status=0)
我不确定我做错了什么。我希望这是有道理的。我希望有人能告诉我以这种方式将数据传递给MVC操作的正确方法
谢谢
下面是我用来执行ajax调用的javascript函数
function saveResource() {
var tagAssignments = [];
for (var x = 0; x < $('.tag-assignment').length; x++) {
var tag = $($('.tag-assignment')[x]);
tagAssignments.push({
name: tag.find('.tag-name').html().toString(),
id: parseInt(tag.find('.tag-id').html()),
status: parseInt(tag.find('.tag-status').html())
});
}
$.ajax({
url: '/Resources/Create',
dataType: 'json',
type: 'POST',
success: function (data) {
if (data.status == 'Success') {
forwardToDefaultPage();
} else {
alert(data.status);
}
},
data: {
reference: $('#txt-resource-reference').val(),
categoryId: $('#ddl-category').val(),
content: $('#txt-resource-content').val(),
tags: tagAssignments
}
});
}
函数saveResource(){
var tagAssignments=[];
对于(var x=0;x<$('.tag assignment')。长度;x++){
变量标记=$($('.tagassignment')[x]);
推({
名称:tag.find('.tag name').html().toString(),
id:parseInt(tag.find('.tag id').html()),
状态:parseInt(tag.find('.tag status').html())
});
}
$.ajax({
url:“/Resources/Create”,
数据类型:“json”,
键入:“POST”,
成功:功能(数据){
如果(data.status==“成功”){
forwardToDefaultPage();
}否则{
警报(数据、状态);
}
},
数据:{
引用:$('#txt资源引用').val(),
categoryId:$('#ddl category').val(),
内容:$(“#txt资源内容”).val(),
标记:标记分配
}
});
}
有几件事需要尝试
查看如何更改为ajax调用,如下所示
function saveResource() {
var tagAssignments = [];
for (var x = 0; x < $('.tag-assignment').length; x++) {
var tag = $($('.tag-assignment')[x]);
tagAssignments.push({
name: tag.find('.tag-name').html().toString(),
id: parseInt(tag.find('.tag-id').html()),
status: parseInt(tag.find('.tag-status').html())
});
}
$.ajax({
url: '<%: Url.Action("Create", "Resources")',
dataType: 'json',
type: 'POST',
success: function (data) {
if (data.status == 'Success') {
forwardToDefaultPage();
} else {
alert(data.status);
}
},
data: {
reference: $('#txt-resource-reference').val(),
categoryId: $('#ddl-category').val(),
content: $('#txt-resource-content').val(),
tags: JSON.stringify(connect)
}
});
函数saveResource(){
var tagAssignments=[];
对于(var x=0;x<$('.tag assignment')。长度;x++){
变量标记=$($('.tagassignment')[x]);
推({
名称:tag.find('.tag name').html().toString(),
id:parseInt(tag.find('.tag id').html()),
状态:parseInt(tag.find('.tag status').html())
});
}
$.ajax({
url:“我建议您使用视图模型并发送JSON请求
因此,视图模型:
public class CreateViewModel
{
public string Reference { get; set; }
public int? CategoryId { get; set; }
public string Content { get; set; }
public IEnumerable<TagDTO> Tags { get; set; }
}
AJAX请求:
// TODO: build this object dynamically as you are currently doing
// but always start with hardcoded values like this to test first
var data = {
categoryId: '21',
content: 'asdf',
reference: 'asdf',
tags: [
{ id: 1, name: 'asdf', status: 1 },
{ id: 2, name: 'asdf', status: 1 },
{ id: 3, name: 'asdf', status: 1 }
]
};
$.ajax({
url: '@Url.Action("create", "resources")',
type: 'POST',
contentType: 'application/json',
data: JSON.stringify({ model: data }),
success: function(result) {
...
}
});
这里使用的JSON.stringify
方法内置于现代浏览器中。如果您需要支持传统浏览器,可以将脚本添加到页面中。请发布ajax callI的代码,我会尝试将所有输入参数放入一个对象中,包括arrayIs your name属性在您的视图中完全限定,即标记[0].名称和标签[1].name等可能发布视图代码也会有所帮助,这只是一个语义问题……如果模型用于通过AJAX请求来回传输数据,并且只处理视图中包含的部分内容,那么它应该称为ViewModel?还是应该称为model?@jdavis,控制器操作始终采用视图m模型作为参数,并始终将视图模型传递给视图。
public class CreateViewModel
{
public string Reference { get; set; }
public int? CategoryId { get; set; }
public string Content { get; set; }
public IEnumerable<TagDTO> Tags { get; set; }
}
[HttpPost]
public ActionResult Create(CreateViewModel model)
{
...
}
// TODO: build this object dynamically as you are currently doing
// but always start with hardcoded values like this to test first
var data = {
categoryId: '21',
content: 'asdf',
reference: 'asdf',
tags: [
{ id: 1, name: 'asdf', status: 1 },
{ id: 2, name: 'asdf', status: 1 },
{ id: 3, name: 'asdf', status: 1 }
]
};
$.ajax({
url: '@Url.Action("create", "resources")',
type: 'POST',
contentType: 'application/json',
data: JSON.stringify({ model: data }),
success: function(result) {
...
}
});