【问题标题】:Using Knockout bindings in MVC ActionLink在 MVC ActionLink 中使用 Knockout 绑定
【发布时间】:2012-08-07 08:16:59
【问题描述】:

我正在尝试利用 KnockoutJS 和 MVC 4 在表格的第一列中显示带有 ActionLink 定义的表格。显示数据本身非常简单,我没有任何问题。我遇到的问题是ActionLink的生成。

我看过Use MVC helpers inside jquery.tmpl templates,但是那里的解决方案没有使用淘汰模板并且将Url插入模型对象是不可行的(用于创建视图模型的应用程序域模型对象将通过以下方式广泛使用应用程序)。

表定义:

<table>
    <tbody data-bind="template: { name: 'dmuTableDetail', foreach: tables() }"></tbody>
</table>

tables 是一个可观察数组,因此是括号)。

淘汰模板定义:

<script id="dmuTableDetail" type="text/html">
    <tr>
        <td>@Html.ActionLink("Details", "Details", "DMUTableCategory", new { @Id = ??? } )</td>
        <td data-bind="text:TableId"></td>
        <td data-bind="text:TableName"></td>
    </tr>
</script>​

视图模型定义:

var PageViewModel = function () {
    self = this;

    self.tables = ko.observableArray([]);

    self.readItems = function () {
        self.tables(jQuery.parseJSON('[{"TableId":1001, "TableName":"Table#1"},{"TableId":1002, "TableName":"Table#2"}]'));
    }
}

$(document).ready(function () {
    vm = new PageViewModel();
    self.readItems('');
    ko.applyBindings(vm);
});

(实际代码执行 Ajax 调用来检索数据,但上面的代码也演示了该问题)。

无论我用什么替换 ???,我都无法将 TableId 字段的值插入到 href 中。

任何帮助将不胜感激。

谢谢。

【问题讨论】:

    标签: asp.net-mvc data-binding knockout.js asp.net-mvc-4 html.actionlink


    【解决方案1】:

    谢谢 Eric,你让我想到了一个锚元素并绑定了 href 属性。

    似乎答案比预期的要容易一些(通常是这样!)。

    表格定义:(同原题)

    <table>
        <tbody data-bind="template: { name: 'dmuTableDetail', foreach: tables() }"></tbody>
    </table>
    

    敲除模板定义:(更改为href属性的绑定)。

    <script id="dmuTableDetail" type="text/html">
        <tr>
            <td><a data-bind="attr: { 'href': '@Url.Action("Details", new RouteValueDictionary() { { "Controller", "DMUTableCategory" } } )/' + TableId }">Details</a></td>
            <td data-bind="text:TableId"></td>
            <td data-bind="text:TableName"></td>
        </tr>
    </script>?
    

    视图模型定义:(与原始问题相同)

    var PageViewModel = function () {
        self = this;
    
        self.tables = ko.observableArray([]);
    
        self.readItems = function () {
            self.tables(jQuery.parseJSON('[{"TableId":1001, "TableName":"Table#1"},{"TableId":1002, "TableName":"Table#2"}]'));
        }
    }
    
    $(document).ready(function () {
        vm = new PageViewModel();
        self.readItems('');
        ko.applyBindings(vm);
    });
    

    您实际上不需要RootValueDictionary,但我已将其包含在内,以便人们可以看到如何更改请求发送到的控制器。

    【讨论】:

    • 这对我有用,只是我必须将 TableId 更改为 TableId() 才能返回实际值。
    【解决方案2】:

    Knockout 完全绑定在客户端,这是在 MVC 为您的页面呈现 HTML 并将其发送回原始浏览器之后。

    如果您希望 Knockout 模板能够使用在服务器上生成的 URL,那么您必须采用类似于以下的一些巧妙策略:

    CSHTML:

    @{
        // create a dummy URL that you can use as a template
        string hrefFormat = Url.Action("Details", "DMUTableCategory", new { id = "{ID}" });
    }
    
    <script type="javascript">
        // a global string (but you can put it where ever you need to)
        var _hrefFormat = @Html.Raw(hrefFormat)
    <script>
    

    JS:

    self.readItems = function () {
        self.tables(jQuery.parseJSON('[{"TableId":1001, "TableName":"Table#1"},{"TableId":1002, "TableName":"Table#2"}]'));
    
    
        // loop through the 'tables' and add a new 'href' property to each for binding
        ko.utils.arrayForEach(self.tables(), function(table){
             table.href = _hrefFormat.replace("{ID}", table.TableId);
        });
    }
    

    您的 KO Tmpl 将每个表对象的 'href' 属性绑定到 a 标记的 href 属性:

    <script id="dmuTableDetail" type="text/html">
        <tr>
            <td><a data-bind="attr: { 'href': href }">Details</a></td>
            <td data-bind="text:TableId"></td>
            <td data-bind="text:TableName"></td>
        </tr>
    </script>​
    

    【讨论】:

    • 感谢 Eric,但我知道在访问 _hrefFormat 变量时出现错误(_hrefFormat 未定义)。不过,经过一番尝试,我设法消除了对 arrayForEach 的需求,并将绑定更改为 &lt;td&gt;&lt;a data-bind="attr: { 'href': '@Url.Action("Details")/' + TableId }"&gt;Details&lt;/a&gt;&lt;/td&gt;
    • 也可以。您是否将 _hrefFormat 字符串与您的 ViewModel 放在同一范围内?
    • 那个有点麻烦。 View Model 是通过一个单独的 .js 文件在 $(document).ready() 函数中创建的,因此有点困惑如何在同一范围内获取 _hrefFormat 并允许 MVC 处理 @HTML.Raw() 函数。顺便说一句,由于另一个原因,我无法使用它 - Url.Action 函数对输出进行编码,因此大括号被编码(通过使用不同的字符很容易修复!)。再次感谢您的意见,因为它确实引导我找到了我最终使用的解决方案。
    猜你喜欢
    • 2012-11-25
    • 2013-09-05
    • 2013-07-28
    • 2014-04-11
    • 1970-01-01
    • 2015-07-02
    • 2013-02-12
    • 1970-01-01
    • 2015-10-15
    相关资源
    最近更新 更多