在淘汰赛模型中获取MVC模型参数的最佳做法是什么?
1)如果您只需要获取一个参数,可以使用以下命令设置挖空视图模型属性:
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
??
答案 0 :(得分:2)
您需要的所有数据都应该在您的C#模型中。然后在knockout viewModel中你应该解析这些数据。例如:
C#
public class Person
{
public int Id {get;set;}
public string FirstName {get;set;}
public string LastName {get;set;}
public List<Book> 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);
}
答案 1 :(得分:0)
如果你想做一个简单的(单向)绑定,这将做
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
中创建每个对象属性,我们可以使用此通用函数。
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;
}
现在我们可以使用这样的功能。
var personJSON = @Html.Raw(Json.Encode(Model));
personJSON.Books = MakeArrayKoObservableObjectArray(personJSON.Books);
PersonViewModel = ko.observable(personJSON);