【发布时间】:2015-04-01 15:40:27
【问题描述】:
我已经阅读了很多关于 stackoverflow 和 Google 搜索的资源,但似乎没有什么特别适合我的问题。
tl;dr 我想将我的 C# 模型从我的视图传递到一个外部 JS 文件(Knockout),以便我可以使用来自模型的数据显示在我的视图上。
更多信息:
我有一个非常标准的 ASP.NET MVC 5 项目,其中包含(例如)1 个视图、1 个控制器和一个 C# 视图模型,该模型被检索并在我的 C# 控制器中操作数据。我的外部 JavaScript 文件包含 Knockout 代码,特别是我想将该 C# 模型放入该外部 JS 文件中的 observableArray 中,这样我就可以将我的 Knockout 代码保持在我的视野之外(可能除了几行之外)。
示例:
books.js
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 || {}));
myC#Model 是我想从视图(或控制器)中检索的 C# 模型。
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>
}
HomeController.cs
public ActionResult Index()
{
//gets the list of all the books
var viewModel = this.bookManager.GetAllBooks();
return View(viewModel);
}
想法:
我想到的一个解决方案是创建一个全局变量,然后我就可以在之后引用的任何 JS 文件中访问它,但这个解决方案似乎不太理想。我认为的一个例子是:window.booksVM = @Html.Raw(Json.Encode(Model));
我希望有一个更好、更具可扩展性的解决方案,包括在视图中获取模型并能够在我的外部 JS 文件中访问该模型。
【问题讨论】:
标签: javascript c# asp.net asp.net-mvc knockout.js