获取淘汰模型中的MVC人员模型书列表(可观察数组)

在淘汰模型中获取MVC模型参数的最佳实践是什么?

1)如果只需要一个参数,可以使用以下命令设置knockout view model属性:

this.firstName = @Model.FirstName; 

2)如果您在模型中拥有大量属性,则可以执行以下操作:

 var modelData = function () { return @Html.Raw(Json.Encode(Model)); }(); 

然后再用

 this.firstName = modelData.FirstName; this.lastName = modelData.LastName; this.phoneNumber = modelData.PhoneNumber; etc. 

3)如果你在Person模型中有一些Collection,该怎么办? 从个人模型中获取集合的最佳方法是什么?

例如,Person有FirstName,LastName,PhoneNumber等,并且有一个书籍列表 (每本书都有图块,作者和其他属性)。

我相信你可以使用这样的东西:

 var booksJSON = @Html.Raw(Json.Encode(Model.Books)); 

然后在淘汰人模型中使用:

 self.books = ko.observableArray(booksJSON); 

这只给了书。

但是,如果我想获得有关Person(书籍,包括FirstName,LastName,Phone和一堆属性)的所有信息,那么最好的方法是什么呢? 我可以以某种方式使用Json.Encode为整个Person模型,然后离开那里的一切,包括Person.Books或我应该将它分成多个Json.Encode-s ??

您需要的所有数据都应该在C#模型中。 然后在knockout viewModel中你应该解析这些数据。 例如:

C#

 public class Person { public int Id {get;set;} public string FirstName {get;set;} public string LastName {get;set;} public List Books {get;set} } public class Book { public int Id {get;set;} public string Name {get;set;} } 

Html,你应该将你的C#模型转换为json:

 function (ko, ViewModel) { ko.applyBindings(new ViewModel(@Html.Raw(Model.ToJson())), document.getElementById('Container')); }); 

Knockout viewModel:

 function ViewModel(model) { var self = this; self.FirstName = ko.observable(model.FirstName); self.LastName = ko.observable(model.LastName); self.Books = ko.observableArray(model.Books); } 

如果你想做一个简单的(单向)绑定,这样做

 var PersonViewModel = {}; $(function () { var personJSON = @Html.Raw(Json.Encode(Model)); PersonViewModel = ko.observable(personJSON); ko.applyBindings(PersonViewModel, $("#person-container").get(0)); }); 

但是如果你想要一个双向绑定,即你想将现有数组的更改发回给服务器,你想要在对象数组ko.observable创建所有属性。 这是因为,根据knockoutjs文档,

简单地将对象放入observableArray并不会使该对象的所有属性本身都可观察到。 当然,如果您愿意,您可以观察这些属性,但这是一个独立的选择。 observableArray只跟踪它所拥有的对象,并在添加或删除对象时通知侦听器。

要在数组ko.observable创建每个对象属性,我们可以使用此generics函数。

 function MakeArrayKoObservableObjectArray(arr) { var observableArr = []; for (var i = 0; i < arr.length; i++) { var observableObj = {}, obj = arr[i]; for (var prop in obj) { if (obj.hasOwnProperty(prop)) { observableObj[prop] = ko.observable(obj[prop]); } } observableArr.push(observableObj); } return observableArr; } 

现在我们可以使用这样的function。

 var personJSON = @Html.Raw(Json.Encode(Model)); personJSON.Books = MakeArrayKoObservableObjectArray(personJSON.Books); PersonViewModel = ko.observable(personJSON);