【问题标题】:Using knockout binding with razor syntax使用带有剃刀语法的淘汰赛绑定
【发布时间】:2014-06-16 00:49:44
【问题描述】:

我想知道是否可以在 Razor 语法中使用 Knockout data-bind

我认为有这段代码:

<tbody data-bind="foreach: relays">
    <tr>
        <td id="body-button-column">
            <button class="btn btn-default btn-sm" title="Remove relay" data-bind="click: $parent.removeRelay">
                <i class="glyphicon glyphicon-remove-circle"></i>
            </button>
        </td>
        <td><input type="text" data-bind="value: $index"/></td>
        <td>@Html.DropDownList("RelayConfigurations[" + $index + "].Address", Model.Addresses, "Select an Item")</td>
    </tr>
</tbody>

我的视图模型具有以下属性

self.relays = ko.observableArray(@Html.Raw(Json.Encode(Model.RelayConfigurations)));

其中 RelayConfigurations 是模型上的集合对象。

在使用 Razor 语法 @Html.DropDownList.... 的行中,我想对 $index 值使用敲除绑定,但不知道该怎么做。或者,如果有可能的话。

如果我将该行中的 $index 替换为硬编码值零,控制器操作中的模型绑定在 回发 上按预期工作(尽管只是集合中的第一个中继有任何数据,因为硬编码值为零)。

【问题讨论】:

  • 我相信你已经知道了,但是,Razor 是一种服务器端技术,而 Knockoutjs 是一种客户端技术。虽然它可以做得很好并且做得很好,但有时您可能最好选择其中一个来实现在页面上显示和捕获数据的最终结果。
  • 明白。我选择混合它们的原因是因为继电器配置列表是一个动态大小的列表,用户可以添加和删除。使用 Knockout 可观察数组似乎是在更新 UI 时管理动态大小列表的最简洁和最有效的方法。

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


【解决方案1】:

当然你可以在剃须刀中使用淘汰赛:)

我相信你正在寻找的是这个匿名对象方法:

@Html.DropDownList("somelist", Model.List, new { id = "listbox", data_bind = "" })

【讨论】:

  • 感谢您的回复;但是,我有两个问题。显示的语法不起作用。我不能在你指出的地方使用“数据绑定”。 Intellisense 表示无法解析该符号。其次,为了让 MVC 模型绑定器正常工作,表单字段名称必须与模型属性的名称相匹配。 DropDownList 的 Razor 语法表示第一个参数是名称。这就是我想使用数据绑定的论点。在我原始帖子的代码中,我试图用 DropDownList 的第一个参数中的 $index 符号指示我需要在哪里进行数据绑定。
  • 正确,我忘记了破折号可能是毛茸茸的。如果您使用 data_bind,此方法应该可以工作,请阅读此处:stackoverflow.com/questions/2520487/…
【解决方案2】:

我理解的问题

  1. 将 html 转换为在提交表单时容易被接受为服务器端模型的格式。
  2. 能够从客户端向下拉列表添加项目。

第一个问题的解决方案是查看 DropdownList 的呈现 HTML 并复制生成的 &lt;select&gt; 标记,然后将 knockoutjs 应用于该标记,这样您将保持与服务器预期相同的格式能够在利用 knockoutjs 的同时将提交的表单转回服务器端模型

所以你最终会得到这样的东西

<tbody data-bind="foreach: relays">
    <tr>
        <td id="body-button-column">
            <button class="btn btn-default btn-sm" title="Remove relay" data-bind="click: $parent.removeRelay">
                <i class="glyphicon glyphicon-remove-circle"></i>
            </button>
        </td>
        <td><input type="text" data-bind="value: $index"/></td>
        <td>
           <select data-bind="attr: {id : 'RelayConfigurations[' + $index + '].Address' }, options: relays ,optionsCaption:'Select an Item'"></select>
        </td>
    </tr>
</tbody>

至于第二期,您已经拥有data-bind 的数据,因此您可以根据需要添加和删除项目。

来自@meyousikmann 下面的评论

只是对其他人来此答案的语法进行快速更正:

<select data-bind="attr: {name: 'RelayConfigurations[' + $index() + '].Address'}, options: $parent.addresses, optionsCaption: 'Select an Item'"></select>

【讨论】:

  • 嗯,这是另一种方法。不使用 Razor 语法,但仍然有效。只是对其他任何人的语法进行快速更正: .感谢您指向正确方向的指针。仍然有兴趣知道是否可以使用 Razor 语法来完成。
  • 我怀疑会有一种有效的方法来做这种事情。问题是 Razor 和 Knockout 对彼此的存在一无所知。您可以尝试查看 knockoutmvc.com 。我自己没用过,但可能值得一看。
  • 投了反对票,因为它实际上并没有提供问题的答案,而是一种替代解决方法。
  • 问题是 Razor 在服务器上运行而淘汰赛在浏览器/客户端上运行。 Razor 没有简单的方法来了解淘汰赛。或用于淘汰赛以了解 Razor。它们是试图实现相似结果的根本不同技术。
猜你喜欢
  • 2013-10-08
  • 1970-01-01
  • 2013-03-04
  • 2016-12-05
  • 2018-10-09
  • 2013-02-04
  • 2013-10-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多