【问题标题】:Setting initial value of knockout viewmodel using razor使用剃刀设置剔除视图模型的初始值
【发布时间】:2011-12-23 17:37:09
【问题描述】:

奇怪的是,我找不到任何有关如何动态填充 Knockout 视图模型的信息。我猜我的搜索字词不正确之类的。

无论如何,我使用的是 Asp.Net MVC 3,并且第一次只对一个特定页面使用淘汰赛,我希望我可以以某种方式使用 Razor 模型插入淘汰赛。

@Html.TextBoxFor(m => m.PropertyName, new { data_bind = "value: name" })

我认为这不起作用,因为即使剃须刀使用 PropertyName 填充字段,它也会在绑定之前发生,因此它不会将其值强制为淘汰视图模型。

        var viewModel = {
        name: ko.observable(@GetPoertyNameUsingRazorSomehow)
    };

这也行不通,至少在我理解的情况下是行不通的。

由于我们通常可以使用 MVC 3 轻松获取 RazorModel 数据,因此我确信我们可以以某种方式将其注入 Knockout viewModel。我还没有看到任何解释如何的教程。我错过了什么?

【问题讨论】:

    标签: asp.net-mvc-3 razor knockout.js


    【解决方案1】:

    我在 Json.NET 之上创建了一个小库来应对这种情况:

    https://github.com/paultyng/FluentJson.NET

    您可以像这样在 Razor 视图中创建 JSON(注意 Knockout 扩展方法):

    @JsonObject.Create()
        .AddProperty("name", "value")
        .AddProperty("childObject", c => {
            .AddProperty("childProperty", "value2")
        })
        .AddObservable("knockoutProperty", 123)
    

    这将产生类似于此的 JSON:

    {"name":"value","childObject":{"childProperty":"value2"},"knockoutProperty":ko.observable(123)}
    

    Knockout 方法是通过扩展方法添加的,其他东西也可以很容易地扩展。

    如果您需要,该软件包已在 Nu-Get 上。

    【讨论】:

    • 非常好,我是新手,所以我不知道 JSON。那是默认的 Javascript 对象吗?它还处理作为其他对象集合的属性吗?还有,什么是 Nu-Get 命令?
    • PM> Install-Package fluentjson.net
    • 还有一个AddObservableArray 方法
    • 我目前正在将其扩展为只允许您执行 @Knockout.ToViewModel(Model) 并且它将枚举模型属性,以简化我自己的一些代码,其中它只是直接 MVC 模型到 Knockout 模型序列化,我不想在客户端调用映射。
    • 是的,我有点期待有人做一个 HtmlHelper 扩展 @Html.ViewModelFor(Model) 然后也为字段 @Html.ValueBoundFOr(m => m.Name)
    【解决方案2】:

    假设您的属性名称应该是一个字符串,如果您将 @GetPoertyNameUsingRazorSomehow 括在引号中,这应该可以工作。否则,您会将未定义的对象传递给可观察对象。

    name: ko.observable('@GetPoertyNameUsingRazorSomehow')
    

    【讨论】:

    • 你确定吗,似乎 Razor 语法在 Script 标签内不起作用。
    • Intellisense 在我不相信的脚本标签中不起作用,但输出应该起作用。
    • 不错。这是经常用来填充 viewModel 的东西吗?或者你能指点我一个解释这个的指南吗?
    • 我认为就淘汰赛的标准使用而言,许多人会改用 fromJSfromJSON 映射方法并通过 ajax 调用从服务器中提取数据,而不是将其硬编码到看法。或者只是在模型的视图中使用 json 序列化,因此您不必手动写出所有属性。
    • 我已经在 MVC3 和 MVC4 中尝试过这个,并且智能感知在脚本部分的脚本标签中工作。检查视图文件夹中的 web.config 以确保它引用了适当的内容
    猜你喜欢
    • 1970-01-01
    • 2013-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多