Сетка MVCContrib. Могу ли я указать атрибуты tbody?

Я пытаюсь использовать сетку MVCContrib вместе с KnockoutJS. Для этого мне нужно указать привязку данных в tbody, например. <tbody data-bind="foreach: people">. Я не могу найти способ, как это сделать.

@Html.Grid(Model).Attributes() применяет мою привязку к тегу <table>. Есть ли способ установить атрибут tbody?


person Lukasz Lysik    schedule 09.11.2012    source источник


Ответы (1)


Короткий ответ: нет, в текущей реализации невозможно установить атрибуты 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>

Вы должны отметить, что это просто быстрое и грязное решение, чтобы показать, что возможно, и есть больше точек расширения, которые вы можете использовать, чтобы сделать передачу атрибутов более приятной.

person nemesv    schedule 09.11.2012
comment
Спасибо! На самом деле я нашел эту ссылку johnnycoder.com/blog/2010/06/12/, в котором объясняется то же решение, что и у вас. - person Lukasz Lysik; 12.11.2012