【问题标题】:ASP.NET MVC pass model to KnockoutJS external fileASP.NET MVC 将模型传递给 KnockoutJS 外部文件
【发布时间】: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


    【解决方案1】:

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

    【讨论】:

    • 完美运行,谢谢!还要提一下(至少我不知道),但我需要包含 Knockout 的映射插件,可在此处(或 NuGet)knockoutjs.com/documentation/plugins-mapping.html
    • @jamez14 谢谢,我也会将其添加到答案中。
    猜你喜欢
    • 1970-01-01
    • 2017-10-15
    • 2012-07-22
    • 1970-01-01
    • 1970-01-01
    • 2012-02-02
    • 1970-01-01
    • 2011-05-08
    • 2023-04-05
    相关资源
    最近更新 更多