如何将 javascript 对象中的嵌套属性传递给 C# 类

本文关键字:属性 嵌套 javascript 对象 | 更新日期: 2023-09-27 18:35:18

>我有一个JavaScript对象,我正在传递给MCV应用程序中的C#类。 简单属性可以毫无问题地传递,但是如果我的对象包含嵌套属性,则不会映射这些属性。 它们在我的 C# 类中为空。

我的类看起来像这样:

public class AssessmentItemModel
{
    public int StudentTestEventID { get; set;}
    public string ClientID { get; set;}
    public int TestID { get; set;}
    public TestItemCollection ItemCollection { get; set; }
}
public class TestItemCollection
{
    [DataMember]
    public ConcurrentDictionary<int,TestItem> TestItems {get; set;}
}

我的JavaScript:

var tmpModel = {};
    tmpModel.TestID = jsonModel.TestID;
    tmpModel.StudentTestEventID = jsonModel.StudentTestEventID;
    tmpModel.ClientID = jsonModel.ClientID;
    tmpModel.ItemCollection = {};
    tmpModel.ItemCollection.TestItems = jsonModel.ItemCollection.TestItems;
    $.ajax({
        type: "POST",
        async: false,
        url: getOTCPath() + "Assessment/FinishAssessment/",
        data: tmpModel
    });

完成评估方法:

 [System.Web.Mvc.HttpPost]
    [ValidateInput(false)]
    public ActionResult FinishAssessment(AssessmentItemModel aModel)
    {
        //string responses = aModel.TestResponses;
        //aModel = RestoreAssessmentItemModel(aModel);
        //aModel.TestResponses = responses;
        AssessmentSvcHelper helper = new AssessmentSvcHelper();
        string result = helper.FinishAssessment(aModel.StudentTestEventID.ToString(), aModel.ItemCollection, aModel.ClientID, int.Parse(aModel.TestID), aModel.FormID);
        aModel.StudentScore = result;
        return View("FinishAssessment", aModel);
    }

当我到达 FinishAssessment 方法时,AssessmentItemModel 会正确填充 StudentTestEventID、ClientID 和 TestID。 它还具有 ItemCollection 的值,但 ItemCollection 下的 TestItems 属性为 null。

从我所做的阅读来看,嵌套或复杂的属性似乎没有被映射。

如何将整个对象传递给我的类?

如何将 javascript 对象中的嵌套属性传递给 C# 类

问题不在于嵌套属性,而在于您使用的是模型绑定器默认不支持的字典(除非您构建自定义字典)。

改变这个

public ConcurrentDictionary<int,TestItem> TestItems {get; set;} //do you need concurrent??

通过这个

public List<TestItem> TestItems {get; set;}

将接受提交此 JSON 结构

tempModel = {
    ..props..
    ItemCollection = [
        { testItemProp1, testItemProp2 ..} //don't know this structure
    ]
};

我删除了我想您在集合中的索引,因为您已将字典定义为 Dictionary<int,TestItem> ,不知道您是否需要它,但 JSON 结构应该与您的类定义相匹配。您只需要使用一些 IEnumerable<> 才能使模型绑定器工作。

几年前

我遇到了类似的问题,并使用了JSON.stringify(myObject),然后在 AJAX 调用中返回了字符串化对象;然后我用

JavaScriptSerializer().Deserialize<myTargetObject>(myObject)

在控制器中