我有一个控制器动作,通过使用ViewBag将Dictionary传递给视图.
public async Task<ActionResult> MyAction() { Dictionary<ATypeviewmodel,IEnumerable<BTypeviewmodel>> all = await GetDictionary(); ViewBag.MyData = all; return View(); }
在视图内部,我需要使用此字典来创建级联单选按钮列表.第一个列表将包含键值
@{ Dictionary<ATypeviewmodel,IEnumerable<BTypeviewmodel>> services = ViewBag.MyData; } @foreach ( KeyValuePair<ATypeviewmodel,IEnumerable<BTypeviewmodel>> entry in services ) { <div class="radio"> <label for="aType"><input type="radio" name="aType" value="@entry.Key.ATypeID" /> @entry.Key.Description</label> </div> }
我需要jQuery来创建这个代码但不幸的是我不知道如何转换javascript使用的字典.
编辑:
在hutchonoid回答之后,我使用Json.NET将我的字典序列化为json.
Dictionary<ATypeviewmodel,IEnumerable<BTypeviewmodel>> list = new Dictionary<ATypeviewmodel,IEnumerable<ATypeviewmodel>>(); [...] return await JsonConvert.SerializeObjectAsync( list );
var collection = @Html.Raw( Json.Encode(services) );
遗憾的是,序列化字符串不正确,因为它是以下形式
var collection = { ATypeviewmodel: [ { BTypeID: 11,Description: "..." },{ BTypeID: 12,{ BTypeID: 13,{ BTypeID: 14,Description: "..." } ],ATypeviewmodel: [ { ServiceTypeID: 21,{ ServiceTypeID: 22,{ ServiceTypeID: 23,{ ServiceTypeID: 24,Description: "..." } ] }
为什么关键对象没有正确序列化?
解决方法
使用一个简单的例子创建一个字典:
@{ var services = new Dictionary<string,string> {{"1","One"},{"2","Two"}}; }
在您的JavaScript中序列化它
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: "..." } ],BTypeviewmodel: [ { ServiceTypeID: 21,Description: "..." } ] } $.each(collection,function (outerKey,outerValue) { $.each(outerValue,value) { $.each(value,function (innerkey,innervalue) { console.log(innerkey); console.log(innervalue); }); }); }); </script>