向MVC控制器提交复杂的JSON数据,如何为嵌套对象命名?

4

我有一个控制器设置,希望收到以下提交的对象:

public class PrintJob
{
    public string BarTenderFile { get; set; }
    public string PrinterName { get; set; }
    public List<TagLabel> Queue { get; set; } 
}

public class TagLabel
{
    public string Season { get; set; }
    public string STSStyle { get; set; }
    public string VStyle { get; set; }
    public string ColorCode { get; set; }
    public int CODI { get; set; }
    public string SizeDesc { get; set; }
    public string StyleDesc { get; set; }
    public string ColorDesc { get; set; }
    public string Vendor { get; set; }
    public int Qty { get; set; }
    public long UPC { get; set; }
    public double CurrRetail { get; set; }
    public double OrigRetail { get; set; }
    public string AvailableIn { get; set; }
}

我试图使用JSON来代表我的对象,通过AJAX提交到我的控制器。对于PrintJob的顶层属性,这个方法很好用。控制器可以看到BarTenderFilePrinterName属性的值。但是问题出现在Queue上。我的javascript代码如下:
var queue = [];

$('#queue tr').each(function () {
    var tagLabel = $.parseJSON($(this).find('pre').text());
    queue.push(tagLabel);
});

var data = {
    "BarTenderFile": $('#btFile').val(),
    "PrinterName": $('#printer').val(),
    "Queue": queue
}

$.ajax({
    type: 'POST',
    url: window.submitQueueUrl,
    dataType: "application/json",
    data: data,
    success: function (returnVal) {
        // Do success stuff
    }
});

每个`Queue`对象的JSON都存储在页面上隐藏的`
`标签中,格式化后每个名称与我的`TagLabel`对象中的名称相匹配。我想这比使用大量的隐藏输入字段要容易。发送的JSON生成没有错误,后端代码也可以正常处理。问题是当我将其提交给控制器时,`Queue`由一个`object`列表填充。最终结果是,在我的控制器中,`Queue`将有我选择的任意数量的队列项,但每个队列项都以null和零填充。如何告诉我的控制器识别每个队列项是TagLabel而不是通用对象?

你没有发送JSON,请将 data: 更改为 data: JSON.stringify(data),。另外,dataType 指定的是响应类型而不是你正在发送的类型(contentType)。 - MrCode
数据看起来很不错,但你能发一下 tagLabel 是什么样子的吗? - Erik Philips
@MrCode /headdesk。当然是这样啦。把它作为答案,我会标记的。谢谢! - Dan S.
1个回答

8

扩展我的评论:数据没有被编码为JSON。jQuery将尝试从对象构建普通的URL编码数据(这就解释了为什么收到了第一部分)。

更改为编码JSON:

$.ajax({
    data: JSON.stringify(data),
    contentType : 'application/json' // also set the content type
    ...
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接