Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用knockout访问序列化字典数据_C#_Asp.net Mvc_Dictionary_Knockout.js - Fatal编程技术网

C# 使用knockout访问序列化字典数据

C# 使用knockout访问序列化字典数据,c#,asp.net-mvc,dictionary,knockout.js,C#,Asp.net Mvc,Dictionary,Knockout.js,使用javascript从序列化的字典访问数据时遇到一些问题。下面的json是my Serialized dictionary的输出 生成的JSON是: items: { "Books":{ "Type":2, "Count":20547 }, "Games":{ "Type":1, "Count":2647 }, "Films":{ "Type":0, "C

使用javascript从序列化的
字典
访问数据时遇到一些问题。下面的json是my Serialized dictionary的输出

生成的JSON是:

items: 
{
    "Books":{
        "Type":2,
        "Count":20547
    },
    "Games":{
        "Type":1,
        "Count":2647
    },
    "Films":{
        "Type":0,
        "Count":57213
    }
};
在我的javascript文件中,我创建了一个可观察的:

ko.observable(items)
我遇到的问题是在我看来访问这些信息。我需要根据“key”值动态检索数据。我试过使用:

@{ var key = Model.Key; }
<p data-bind="text: items[@key].Count"></p>
使用c#,我可以通过使用
items[“Books”]
访问特定键的值。使用敲除是否可以实现这一点?

在如何访问其属性方面,其行为类似于字典(更确切地说是关联数组)。例如,这样做:

var items = {};
items.Books = { "Type":2, "Count":20547 };
items.Games = { "Type":1, "Count":2647 };
完全等同于此:

var items = {};
items["Books"] = { "Type":2, "Count":20547 };
items["Games"] = { "Type":1, "Count":2647 };
当然,您也可以使用此语法读取值:

var books = items["Books"];
只要在ko中使用它,就不能使用
observatarray
,因为它需要一个JavaScript数组,其成员通过索引访问。也就是说,上一个示例中的
items
对象是具有属性的对象,而不是JavaScript数组

所以,在ko中,你需要使用一个可观察的,像这样:

var obs = ko.observable(items);
var items = [
  { Name: 'Books', Type: 2, Count: 20547 },
  { Name: 'Games', Type: 1, Count: 2647 }
];
但是,此可观察对象仅在整个
对象发生更改时通知更改,而不会在其任何属性(如
书籍
)被修改时通知更改。如果您需要在某些属性更改时获取通知(例如udpta视图),那么您需要使属性本身可观察,而不是仅根对象
。要做到这一点,您可以使用插件,或手动执行。这相当于:

var items = ko.observale({
    Books: ko.observable({
      Type: ko.observable(2), 
      Count: ko.observable(20547)
    }),
    Games:  ko.observable({
      Type: ko.observable(1), 
      Count: ko.observable(2647)
    })
});
在这种情况下,每当任何属性发生更改时,都会通知您

但是,如果您在添加或删除诸如
书籍
、或
游戏
之类的属性时需要通知,那么在ko中就不会有这样的直接方法。你需要将你的对象映射到一个常规的可观测数组,并制作一个
ko.observableARay
,使其工作。映射可以如下所示:

var obs = ko.observable(items);
var items = [
  { Name: 'Books', Type: 2, Count: 20547 },
  { Name: 'Games', Type: 1, Count: 2647 }
];
如果这样做,您可以创建一个可观察的数组。如果仍然需要通过
Name
访问属性,可以使用JavaScript方法(取决于浏览器支持的EcmaScript版本)或使用类似或的库,它提供了访问和映射JavaScript对象和集合的强大方法


注意:ko表达式能够检测到某个事物是可观察的,并展开其值。但是,如果需要访问可观察对象的observabe属性,则必须在所有级别中使用括号,但最后一个级别除外,例如data bind=“value:items().Books().Type”,如果使用了ko映射,或者按照上一个级别之前的代码块中的说明对其进行了映射。如果您需要更多信息,请阅读以下内容:.

选项.项目.书籍
?您发布的代码毫无意义。它充其量是不完整的,如果我想象一下完整的图片可能是什么样子,我会说您在创建
observableArray
时有一个KO错误,为它提供了一个非数组。请在代码中完整描述您的情况(请参阅“”以获取指导)。