C# 如何通过Ajax将复杂对象发布到MVC4控制器?

C# 如何通过Ajax将复杂对象发布到MVC4控制器?,c#,jquery,ajax,asp.net-mvc,json,C#,Jquery,Ajax,Asp.net Mvc,Json,我有一个名为DrawDie的对象,具有以下属性: ID PlantID : int QtyOnHand : int SizeUS : double SizeMetric : double CaseSize : string Style : string ID : int DrawDie : DrawDie DrawDieID : int PlantID : int PurchaseOrder : string Qty : int 我有一个名为DieOrder的对象,具有以下属性: ID Pl

我有一个名为DrawDie的对象,具有以下属性:

ID
PlantID : int
QtyOnHand : int
SizeUS : double
SizeMetric : double
CaseSize : string
Style : string
ID : int
DrawDie : DrawDie
DrawDieID : int
PlantID : int
PurchaseOrder : string
Qty : int
我有一个名为DieOrder的对象,具有以下属性:

ID
PlantID : int
QtyOnHand : int
SizeUS : double
SizeMetric : double
CaseSize : string
Style : string
ID : int
DrawDie : DrawDie
DrawDieID : int
PlantID : int
PurchaseOrder : string
Qty : int
我想通过Ajax请求将我的对象发布到MVC控制器。我宁愿不使用第三方库。我试着像这样发布它:

        var DieOrder = new Object();
        var DrawDie = new Object();

        DieOrder.Qty = $("#Qty").val();
        DieOrder.DrawDieID = $("#DrawDieID").val();


        DrawDie.CaseSize = $("#DrawDie_CaseSize").val();
        DrawDie.Qty = $("#Qty").val();          
        DrawDie.ID = dieID;
        DrawDie.QtyOnHand = 0;
        DrawDie.SizeUS = $("#DrawDie_SizeUS");
        DrawDie.SizeMetric = $("#DrawDie_SizeMetric");
        DrawDie.PlantID = $("#PlantID").val();
        DrawDie.IsTransfer = "N";

        DieOrder.PlantID = $("#PlantID").val();
        DieOrder.OrderedBy = $("#OrderedBy").val();
        DieOrder.PurchaseOrder = $("#PurchaseOrder").val();
        DieOrder.DrawDie = DrawDie;


        $.ajax({
            url: "Order/OrdDie",
            type: 'POST',
            contentType: 'application/json; charset=utf-8',
            data: JSON.stringify(DieOrder),
            success: handleData


        });

    });
var DieOrder = {};
var DrawDie = {};
{
    'model': DieOrder
}
我有两个问题。第一,我的方法有问题吗?我得到一个uncaughtype错误:将循环结构转换为JSON。我如何重新构造我的请求以避免出现这样的错误?我不确定为什么会出现这个错误

谢谢

更新:

 DrawDie.SizeUS = $("#DrawDie_SizeUS").val();
 DrawDie.SizeMetric = $("#DrawDie_SizeMetric").val();

我缺少.val()

请尝试将数据类型:“json”添加到ajax请求中:

$.ajax({
    url: "Order/OrdDie",
    type: 'POST',
    cache: false,
    data: JSON.stringify(_data),
    dataType: 'json',
    contentType: 'application/json',
    success: handleData
});
此外,您可以像这样初始化JS对象:

        var DieOrder = new Object();
        var DrawDie = new Object();

        DieOrder.Qty = $("#Qty").val();
        DieOrder.DrawDieID = $("#DrawDieID").val();


        DrawDie.CaseSize = $("#DrawDie_CaseSize").val();
        DrawDie.Qty = $("#Qty").val();          
        DrawDie.ID = dieID;
        DrawDie.QtyOnHand = 0;
        DrawDie.SizeUS = $("#DrawDie_SizeUS");
        DrawDie.SizeMetric = $("#DrawDie_SizeMetric");
        DrawDie.PlantID = $("#PlantID").val();
        DrawDie.IsTransfer = "N";

        DieOrder.PlantID = $("#PlantID").val();
        DieOrder.OrderedBy = $("#OrderedBy").val();
        DieOrder.PurchaseOrder = $("#PurchaseOrder").val();
        DieOrder.DrawDie = DrawDie;


        $.ajax({
            url: "Order/OrdDie",
            type: 'POST',
            contentType: 'application/json; charset=utf-8',
            data: JSON.stringify(DieOrder),
            success: handleData


        });

    });
var DieOrder = {};
var DrawDie = {};
{
    'model': DieOrder
}

我希望这有帮助

您真正遇到的问题是,控制器正在将
DieOrder
对象的所有内容解释为控制器操作的参数

如果您的控制器操作如下所示

[HttpPost]
public void OrdDie(OrderDieViewModel model)
{
    // Some operations
}
…然后字符串化的数据应如下所示:

        var DieOrder = new Object();
        var DrawDie = new Object();

        DieOrder.Qty = $("#Qty").val();
        DieOrder.DrawDieID = $("#DrawDieID").val();


        DrawDie.CaseSize = $("#DrawDie_CaseSize").val();
        DrawDie.Qty = $("#Qty").val();          
        DrawDie.ID = dieID;
        DrawDie.QtyOnHand = 0;
        DrawDie.SizeUS = $("#DrawDie_SizeUS");
        DrawDie.SizeMetric = $("#DrawDie_SizeMetric");
        DrawDie.PlantID = $("#PlantID").val();
        DrawDie.IsTransfer = "N";

        DieOrder.PlantID = $("#PlantID").val();
        DieOrder.OrderedBy = $("#OrderedBy").val();
        DieOrder.PurchaseOrder = $("#PurchaseOrder").val();
        DieOrder.DrawDie = DrawDie;


        $.ajax({
            url: "Order/OrdDie",
            type: 'POST',
            contentType: 'application/json; charset=utf-8',
            data: JSON.stringify(DieOrder),
            success: handleData


        });

    });
var DieOrder = {};
var DrawDie = {};
{
    'model': DieOrder
}
…因此,在进行
$调用之前,您确实错过了一个步骤。ajax
调用:

var DrawDie = {
    // Properties...
};

var DieOrder = {
    // Properties...
    'DrawDie': DrawDie
};

var data = {
    'model': DieOrder
};

$.ajax({
    // Spec object here.
});

简言之?您的数据对象的内容必须与您正在调用的操作的参数列表相匹配。这意味着,如果您只将一个模型传递给JSON操作,那么您的数据对象必须只有一个成员:该模型对象的JavaScript表示。

请检查:为什么不使用ajax.beginform作为此PathAchiever11。我查看了帖子,但它确实没有为我澄清事情。我不知道为什么会出现循环参考错误。安德鲁。谢谢你提供的信息,但我永远也找不到控制器。我得到了一个未捕获的错误:在我的javascript代码中将循环结构转换为JSON,这样就永远不会发出ajax请求。啊,我很抱歉!不过,我没有看到任何循环引用。您是否向我们展示了您试图发送到服务器的JavaScript数据结构的所有信息(您可以)呢?结果是,当我删除JavaScript中的以下行时,UncaughtType错误消失了:将循环结构转换为JSON错误。你知道为什么吗?我想你可能忘了包括使圆形结构误差消失的线。。。