在挖空模型中获取MVC人员模型书列表(可观察数组)

时间:2013-11-04 11:10:28

标签: c# asp.net-mvc json asp.net-mvc-4 knockout.js

在淘汰赛模型中获取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 ??

2 个答案:

答案 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);