3

在淘汰模型中获取 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 等,并有一个图书列表(每本书都有 tile、author 和其他属性)。

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

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

然后在淘汰赛 Person 模型中使用:

self.books = ko.observableArray(booksJSON);

这仅提供书籍。

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

4

2 回答 2

2

您需要的所有数据都应该在您的 C# 模型中。然后在淘汰视图模型中,您应该解析这些数据。例如:

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'));
});

淘汰视图模型:

function ViewModel(model) {
    var self = this;

    self.FirstName = ko.observable(model.FirstName);
    self.LastName = ko.observable(model.LastName);
    self.Books = ko.observableArray(model.Books); 
}
于 2013-11-04T12:53:38.513 回答
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);
于 2013-11-05T04:16:21.420 回答