Javascript ASP.NET MVC将模型传递到KnockoutJS外部文件

Javascript 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中,这

我在stackoverflow和Google搜索上都读过很多参考资料,但似乎没有什么特别与我的问题相关

tl;dr我想将我的C#模型从我的视图传递到一个外部JS文件(Knockout),这样我就可以使用模型中的数据显示在我的视图上

更多信息: 我有一个非常标准的ASP.NETMVC5项目,其中有一个视图、一个控制器和一个C#视图模型,可以在我的C#控制器中检索和操作数据。我的外部JavaScript文件包含敲除代码,特别是我想将该C#模型放入该外部JS文件中的observableArray中,这样我就可以不查看敲除代码(除了几行代码)

例子: 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 || {}));
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