Asp.net mvc ASP.NET MVC和knockout.js从json映射并添加嵌套的计算变量

Asp.net mvc ASP.NET MVC和knockout.js从json映射并添加嵌套的计算变量,asp.net-mvc,json,knockout.js,Asp.net Mvc,Json,Knockout.js,我想将计算字段添加到淘汰VM。在服务器端,我有一个模型: public class Person { public string Name { get; set } public string Surname { get; set; } } public class PersonsOverviewModel { public Person[] Persons { get; set; } } 在客户端VM中,我希望每个人都有计算字段全名,VM应该由json数据生成,我就

我想将计算字段添加到淘汰VM。在服务器端,我有一个模型:

public class Person {
    public string Name { get; set }
    public string Surname { get; set; }
}

public class PersonsOverviewModel {
    public Person[] Persons { get; set; }
}
在客户端VM中,我希望每个人都有计算字段全名,VM应该由json数据生成,我就是这样做的:

var overviewVM = null; //default value
function Init(data){ // data is serialized model from server
   overviewVm = ko.mapping.fromJS(data, {}, overviewVm);
   $.each(overviewVm.Persons(), function (index, person) {
        person.FullName = ko.computed(function () { // add FullName field to each person
            return person.Name() + person.Surname();
        });
    });
 }
它在绑定到表时按预期工作。然而,从服务器刷新数据后,我在

 overviewVm = ko.mapping.fromJS(data, {}, overviewVm);
也就是说,由于缺少全名,无法映射该数据。如果我在从JS映射之前将overviewVm设置为null,它将成功映射,但由于某些原因不会更新表,如果我尝试取消绑定并再次绑定,它将向表中添加正确的值,但不会删除旧值。 这是表的外观:

<table id="coverview-table" class="grid">
<thead class="gridHeader">
    <tr>
        <th>Name</th>
        <th>Surname</th>
        <th>FullName</th>
    </tr>
</thead>
<tbody data-bind="foreach: Persons">
    <tr class="gridRow">
        <td data-bind="text: Name"></td>
        <td data-bind="text: Surname"></td>
        <td data-bind="text: FullName"></td>
    </tr>
</tbody>

名称
姓
全名
我知道我可以找到另一种方法将全名放入表中,但这只是我的情况的简化版本,我想找到正确的方法来处理淘汰和数据刷新

  var mappingOptions = {
      'Persons': {
          create: function (options) {
              return (new(function () {
                  this.FullName = ko.computed(function () {
                      return this.Name() + this.Surname();
                  }, this);

                  ko.mapping.fromJS(options.data, {}, this); // continue the standard mapping
              })());
          }
      }
  };
然后在映射数据时使用
mappingOptions

ko.mapping.fromJS(数据、映射选项、概览VM)

可能重复的