Как отобразить неагрегированное значение модели в заголовке агрегата Telerik MVC Grid? - PullRequest
2 голосов
/ 08 ноября 2011

Моя сетка:

    @( Html.Telerik().Grid<eGate.BackOffice.Core.Model.UI.EgateMenuRevisionViewData>()
        .Name("Grid")
    .Columns(columns =>
    {
        columns.Bound(c => c.ParentId)
            .Aggregate(a => a.Count()).ClientGroupHeaderTemplate(Html.ActionLink("Create a Revision for This Menu", "Edit", "Thing", new { menuid = "<#= Key #>" }, null).ToString());
        columns.Bound(c => c.ParentName);
        columns.Bound(c => c.ThingName);

    })

    .Groupable(grouping => grouping.Groups(groups => { 
        groups.Add(c => c.EgateMenu.EgateMenuId);
    }).Visible(false))

Это работает. Но это дает мне:

Create a revision for this menu
1          Parent 1     Thing 1.1
1          Parent 1     Thing 1.2
1          Parent 1     Thing 1.3
Create a revision for this menu
2          Parent 2     Thing 2.1
2          Parent 2     Thing 2.2
2          Parent 2     Thing 2.3

И хотя это работает, я бы предпочел что-то более интуитивное, например:

Create a thing for parent 1
Thing 1.1
Thing 1.2
Thing 1.3
Create a thing for parent 2
Thing 2.1
Thing 2.2
Thing 2.3

Проблема 1: Создание вещи для ... необходимо передать ParentId в actionlink, но ему нужно отобразить ParentName для клиента, но в агрегате одновременно существует только один.

Проблема 2: Я хочу сгруппировать по Id без отображения столбца Id в результатах. Но установка столбца в видимый (false) подавляет шаблон заголовка группы клиентов.

Ответы [ 3 ]

0 голосов
/ 27 декабря 2011

Добавление Visible(false) к привязке столбца подавляет сам весь столбец даже в визуализации в html клиента - отсюда и подавление ClientGroupHeaderTemplate.

Я бы попробовал добавить ParentId в качестве ключа данных - например,

.DataKeys(keys =>
{
     keys.Add(k => k.ParentId);
}

Я думаю, что это помогло бы, только если бы вы использовали встроенную сетку (AJAX или Server) DataBinding, хотя (для Insert по крайней мере). Однако с ActionLink ... У меня нет большого опыта использования помощников mvc html в шаблонах клиентов - но если вы сказали, что оригинальный пример работал с ним, разве это не должно работать так же?

columns.Bound(c => c.ParentId).ClientTemplate("")
        .Aggregate(a => a.Count()).ClientGroupHeaderTemplate(Html.ActionLink("Create a thing for \"<#= ParentName #>\"", "Edit", "Thing", new { menuid = "<#= Key #>" }, null).ToString());

Я добавил пустой ClientTemplate, который, как я полагаю, будет работать, чтобы идентификатор не отображался.

0 голосов
/ 28 декабря 2011

По словам телерика: Теперь вы можете указать свойство Aggregate со следующими значениями: Sum, Min, Max, Last, First, Count, Avg & Custom для каждого GridBoundColumn, и сетка будет рассчитывать эти агрегаты, если для ShowFooter установлено значение true. В случае пользовательского агрегата сетка вызовет событие OnCustomAggregate, где вы можете установить желаемый результат, используя e.Result.

Так что попробуйте First, Last или Custom параметры для каждого GridBoundColumn и установите для свойства ShowFooter значение false.

<telerik:GridBoundColumn Aggregate="First" DataField="CustomerID" DataType="System.String" 
  HeaderText="CustomerID" SortExpression="CustomerID" UniqueName="CustomerID"> 
</telerik:GridBoundColumn> 
0 голосов
/ 24 декабря 2011

Вы пытались скрыть ненужные столбцы?

@( Html.Telerik().Grid<eGate.BackOffice.Core.Model.UI.EgateMenuRevisionViewData>()
    .Name("Grid")
.Columns(columns =>
{
    columns.Bound(c => c.ParentId).Visible(false);
        .Aggregate(a => a.Count()).ClientGroupHeaderTemplate(Html.ActionLink("Create a Revision for This Menu", "Edit", "Thing", new { menuid = "<#= Key #>" }, null).ToString());
    columns.Bound(c => c.ParentName).Visible(false);
    columns.Bound(c => c.ThingName);

})
...