Javascript ASP.NET MVC将模型传递到KnockoutJS外部文件
我在stackoverflow和Google搜索上都读过很多参考资料,但似乎没有什么特别与我的问题相关 tl;dr我想将我的C#模型从我的视图传递到一个外部JS文件(Knockout),这样我就可以使用模型中的数据显示在我的视图上 更多信息: 我有一个非常标准的ASP.NETMVC5项目,其中有一个视图、一个控制器和一个C#视图模型,可以在我的C#控制器中检索和操作数据。我的外部JavaScript文件包含敲除代码,特别是我想将该C#模型放入该外部JS文件中的observableArray中,这样我就可以不查看敲除代码(除了几行代码) 例子: books.jsJavascript ASP.NET MVC将模型传递到KnockoutJS外部文件,javascript,c#,asp.net,asp.net-mvc,knockout.js,Javascript,C#,Asp.net,Asp.net Mvc,Knockout.js,我在stackoverflow和Google搜索上都读过很多参考资料,但似乎没有什么特别与我的问题相关 tl;dr我想将我的C#模型从我的视图传递到一个外部JS文件(Knockout),这样我就可以使用模型中的数据显示在我的视图上 更多信息: 我有一个非常标准的ASP.NETMVC5项目,其中有一个视图、一个控制器和一个C#视图模型,可以在我的C#控制器中检索和操作数据。我的外部JavaScript文件包含敲除代码,特别是我想将该C#模型放入该外部JS文件中的observableArray中,这
var app = (function (app) {
app.FilterBooks = function () {
var self = this,
books = ko.observableArray(myC#Model);
var data = [];
self.BooksList = ko.computed(function(){
ko.utils.arrayForEach(books(), function (item) {
data.push(item);
});
});
return data;
};
return app;
}(app || {}));
public ActionResult Index()
{
//gets the list of all the books
var viewModel = this.bookManager.GetAllBooks();
return View(viewModel);
}
myC#Model
是我要从视图(或控制器)检索的C#Model
Index.html
@model viewModel
<div data-bind="foreach: BooksList">
some knockout code in the view
<p data-bind="text: bookName"></p>
</div>
@section scripts{
<script type="text/javascript">
$(document).ready(function () {
var e = new app.FilterBooks;
ko.applyBindings(e);
});
</script>
}
想法:
我想到的一个解决方案是创建一个全局变量,然后我可以在此后引用的任何JS文件中访问它,但这个解决方案似乎不太理想。我的观点中的一个例子是:window.booksVM=@Html.Raw(Json.Encode(Model))代码>
我希望有一个更好、更具可伸缩性的解决方案,包括在视图中获取模型,并能够在外部JS文件中访问该模型。序列化模型并将其传递给视图模型。
使用ko.mapping
在视图模型中从模型动态映射它
如果您的集合中包含一个不可用的数组,它将自动成为一个可观察数组
查看模型
var app = (function (app) {
app.FilterBooks = function (data) {
var self = this;
ko.mapping.fromJS(data, {}, self);
};
return app;
}(app || {}));
索引js
<script type="text/javascript">
$(document).ready(function () {
var data = @Html.Raw(Json.Encode(Model));
var e = new app.FilterBooks(data);
ko.applyBindings(e);
});
</script>
工作得很好,谢谢!同样重要的是要提及(至少我不知道这一点),但我需要包括Knockout的映射插件,可在这里(或NuGet)@jamez14谢谢,我也会将其添加到答案中。
PM> Install-Package Knockout.Mapping