C# 将字典转换为javascript使用

C# 将字典转换为javascript使用,c#,asp.net,asp.net-mvc,razor,dictionary,C#,Asp.net,Asp.net Mvc,Razor,Dictionary,我有一个控制器动作,通过使用ViewBag将字典传递给视图 public async Task<ActionResult> MyAction() { Dictionary<ATypeViewModel, IEnumerable<BTypeViewModel>> all = await GetDictionary(); ViewBag.MyData = all; return View(); } 不幸的是,序列化的字符串不正确,因为它的

我有一个控制器动作,通过使用ViewBag将字典传递给视图

public async Task<ActionResult> MyAction() {
    Dictionary<ATypeViewModel, IEnumerable<BTypeViewModel>> all = await GetDictionary();
    ViewBag.MyData = all;
    return View();
}
不幸的是,序列化的字符串不正确,因为它的格式如下

var collection = {
    ATypeViewModel: [
        { BTypeID: 11, Description: "..." },
        { BTypeID: 12, Description: "..." },
        { BTypeID: 13, Description: "..." },
        { BTypeID: 14, Description: "..." }
    ],
    ATypeViewModel: [
        { ServiceTypeID: 21, Description: "..." },
        { ServiceTypeID: 22, Description: "..." },
        { ServiceTypeID: 23, Description: "..." },
        { ServiceTypeID: 24, Description: "..." }
    ]
}

为什么键对象没有正确序列化?

使用一个简单的示例创建字典:

@{
   var services = new Dictionary<string, string> {{"1", "One"},{"2", "Two"}};
 }
使用每个键和值循环它:

 $.each(collection, function (key, value) {
               console.log(key);
               console.log(value);
            });
控制台输出

更新

根据更新中提供的结构,嵌套循环将执行此操作,但如果结构发生更改,则需要对其进行调整

<script type="text/javascript">
    var collection = {
        ATypeViewModel: [
            { BTypeID: 11, Description: "..." },
            { BTypeID: 12, Description: "..." },
            { BTypeID: 13, Description: "..." },
            { BTypeID: 14, Description: "..." }
        ],
        BTypeViewModel: [
            { ServiceTypeID: 21, Description: "..." },
            { ServiceTypeID: 22, Description: "..." },
            { ServiceTypeID: 23, Description: "..." },
            { ServiceTypeID: 24, Description: "..." }
        ]
    }

    $.each(collection, function (outerKey, outerValue) {

        $.each(outerValue, function (key, value) {

                $.each(value, function (innerkey, innervalue) {
                    console.log(innerkey);
                    console.log(innervalue);
                });
            });

        });

 </script>

变量集合={
ATypeViewModel:[
{B类型ID:11,说明:“…”},
{B类型ID:12,说明:“…”},
{B类型ID:13,说明:“…”},
{B类型ID:14,说明:“…”}
],
B类型视图模型:[
{ServiceTypeID:21,描述:“…”},
{ServiceTypeID:22,说明:“…”},
{ServiceTypeID:23,说明:“…”},
{ServiceTypeID:24,说明:“…”}
]
}
$.each(集合、函数(outerKey、outerValue){
$.each(外部值、函数(键、值){
$.each(值,函数(innerkey,innervalue){
console.log(innerkey);
log(innervalue);
});
});
});

请注意,我需要将您的属性从输出更改为
BTypeViewModel

您可以使用JSON.net将字典序列化为JSON,然后在您的ViewBag中使用该字符串吗?可以。我的问题是如何从javascript使用它。你能给我看一个开始的示例吗?或者你使用一个api控制器并调用它来获取你的数据…@FlorianSchmidinger:我想避免在服务器上来回登录。每种类型的选项不超过4个,并且在begin@Lorenzo是的,你选择的方法很大程度上取决于我不知道的情况。ASG的方法也有其优点和缺点。谢谢你的回答。不幸的是,这不能正常工作。你能看一下我的编辑吗?@Lorenzo好的,给我几分钟。@Lorenzo不错,没问题。:)
@{
   var services = new Dictionary<string, string> {{"1", "One"},{"2", "Two"}};
 }
var collection = @Html.Raw(Json.Encode(services));
 $.each(collection, function (key, value) {
               console.log(key);
               console.log(value);
            });
<script type="text/javascript">
    var collection = {
        ATypeViewModel: [
            { BTypeID: 11, Description: "..." },
            { BTypeID: 12, Description: "..." },
            { BTypeID: 13, Description: "..." },
            { BTypeID: 14, Description: "..." }
        ],
        BTypeViewModel: [
            { ServiceTypeID: 21, Description: "..." },
            { ServiceTypeID: 22, Description: "..." },
            { ServiceTypeID: 23, Description: "..." },
            { ServiceTypeID: 24, Description: "..." }
        ]
    }

    $.each(collection, function (outerKey, outerValue) {

        $.each(outerValue, function (key, value) {

                $.each(value, function (innerkey, innervalue) {
                    console.log(innerkey);
                    console.log(innervalue);
                });
            });

        });

 </script>