MVCContrib网格 - 我可以指定tbody属性吗?

时间:2012-11-09 12:59:43

标签: knockout.js mvccontrib mvccontrib-grid

我正在尝试将MVCContrib网格与KnockoutJS一起使用。为此,我必须在tbody中指定数据绑定,例如<tbody data-bind="foreach: people">。我找不到如何做到这一点的方法。

@Html.Grid(Model).Attributes()将我的绑定应用于<table>标记。有没有办法设置tbody属性?

1 个答案:

答案 0 :(得分:2)

简短回答是否,无法使用当前实现在tbody 上设置属性。

但您可以自己实现此功能:

您只需要在RenderBodyStart课程中实施自己的GridRenderer版本。

有一个GridRenderer的实现,称为HtmlTableGridRenderer您可以构建的内容:

public class BodyWithAttributesHtmlTableGridRenderer<T> 
    : HtmlTableGridRenderer<T> where T : class
    {
        private readonly IDictionary<string, object> bodyAttributes;

        public BodyWithAttributesHtmlTableGridRenderer(
            IDictionary<string, object> bodyAttributes)
        {
            this.bodyAttributes = bodyAttributes;
        }

        protected override void RenderBodyStart()
        {
            string str = BuildHtmlAttributes(bodyAttributes);
            if (str.Length > 0)
                str = " " + str;
            RenderText(string.Format("<tbody{0}>", str));
        }
    }

在您的视图中,您可以使用Render()方法来指定自定义渲染器,而不是调用RenderUsing

@Html.Grid(Model))
    .RenderUsing(new BodyWithAttributesHtmlTableGridRenderer<MyModel>(
    new Dictionary<string, object>(){{"data-bind", "foreach: people"}}))

生成的html看起来像这样:

<table class="grid">
    <thead>
        <tr>
            <th>Prop</th>
        </tr>
    </thead>
    <tbody data-bind="foreach: people">
        <tr class="gridrow">
            <td>1</td>
        </tr>
        <tr class="gridrow_alternate">
            <td>2</td>
        </tr>
    </tbody>
</table>

你应该注意到这只是一个快速而肮脏的解决方案,可以展示什么是可能的,还有更多的扩展点可以用来使属性传递得更好。