我正在尝试将MVCContrib网格与KnockoutJS一起使用。为此,我必须在tbody中指定数据绑定,例如<tbody data-bind="foreach: people">
。我找不到如何做到这一点的方法。
@Html.Grid(Model).Attributes()
将我的绑定应用于<table>
标记。有没有办法设置tbody
属性?
答案 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>
你应该注意到这只是一个快速而肮脏的解决方案,可以展示什么是可能的,还有更多的扩展点可以用来使属性传递得更好。