获取淘汰模型中的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);
- 使用IAuthorizationFilter和Ninject和EF给DbContext配置错误
- 在ASP.NET MVC 3中,filterContext.IsChildAction是什么?
- 无效控制器时的StructureMap错误
- 如果FirstOrDefault返回null,则返回列表中的第一项
- C#和ASP.NET中的换行符变化是什么? (\ r \ n vs. \ n)
- .net Core 2.0文件上传大小限制
- “当IDENTITY_INSERT设置为OFF时,无法在表’电影’中为标识列插入显式值。”
- 如何使用Html.GetUnobtrusiveValidationAttributes()
- MVC 4:自定义路由和Html.Action不同步