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

时间:2015-02-02 16:18:20

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

我已经在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文件中访问该模型。

1 个答案:

答案 0 :(得分:3)

序列化您的模型并将其传递给您的视图模型。 使用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>

<强>更新

同样如@james14所述,请确保包含映射插件。

http://knockoutjs.com/documentation/plugins-mapping.html

PM> Install-Package Knockout.Mapping

https://www.nuget.org/packages/Knockout.Mapping