Telerik Kendo MVC Grid — настройка пользовательской фильтрации

Продукт моей компании активно использует сетку Telerik MVC (более 100 веб-страниц с сетками), и мы пытаемся найти способы минимизировать объем работы, необходимой для настройки частей этих сеток, установив эти части из класса, который мы назвали Settings. .

Вот пример сетки. Вы можете видеть, что мы успешно наладили работу с настройками .PageSize() и .Pageable(p.PageSizes()). Однако .Filterable(f.Operators()) доставляет мне неприятности, и я надеюсь, что кто-нибудь может указать, что я делаю неправильно.

СЕТКА

@(Html.Kendo().Grid(Model)
    .Name("grid")
    .DataSource(ds => ds
        .Ajax()
        .Filter(filter => filter.Add(group => group.Active).IsEqualTo(true))
        .Model(model =>
        {
            model.Id(m => m.Id);
            model.Field(m => m.Id).DefaultValue(new Guid());
        })
        .PageSize(Settings.DefaultPageSize)  //WORKING
        .Read(read => read.Action("Read", "Users"))
        .Events(events => { events.Error("onDSErrors"); events.RequestEnd("onDSRequestEnd"); })
    )
    .Pageable(p => p
        .PageSizes(Settings.MvcGridPageSizes)  //WORKING
        .Refresh(true)
    )
    .Filterable(f => f
        .Extra(true)
        .Operators(Settings.MVCGridFilterOperators)  //NOT WORKING
    )
    .Columns(columns =>
    {
        columns.Bound(u => u.UserName)
            .Title("Username")
            .Width(200);
        ...
        ...
        ...
    })
)

КЛАСС НАСТРОЙКИ (Это то, что я хочу сделать, но пока не могу начать работать...)

public static class Settings
{

    ...

    public static Action<FilterableOperatorsBuilder> MVCGridFilterOperators
    {
        get
        {
            FilterableOperators operators = new FilterableOperators();
            FilterableOperatorsBuilder builder = new FilterableOperatorsBuilder(operators);

            builder.ForString(x => x
                .Contains("Contains")
                .DoesNotContain("Does not contain")
                .StartsWith("Starts with")
                .EndsWith("Ends with")
                .IsEqualTo("Is equal to")
                .IsNotEqualTo("Is not equal to")
                .IsNull("Is null")
                .IsNotNull("Is not null")
            );

            return builder;
            //Error message I see when hovering over "return builder;":
            //   Cannot implicitly convert type ‘Kendo.Mvc.UI.Fluent.FilterableOperatorsBuilder’ to ‘System.Action<Kendo.Mvc.UI.Fluent.FilterableOperatorsBuilder>’
        }
    }

    ...

}

В настоящее время раздел фильтруемых операторов во всех наших сетках должен обновляться в каждой из более чем 100 сеток, если запрашиваются какие-либо изменения, потому что они выглядят следующим образом:

.Operators(o => o
    .ForString(str => str
        .Clear()
        .Contains("Contains")
        .DoesNotContain("Does not contain")
        .StartsWith("Starts with")
        .EndsWith("Ends with")
        .IsEqualTo("Is equal to")
        .IsNotEqualTo("Is not equal to")
    )
)

Поскольку мы используем так много сеток, их обновление занимает некоторое время, так как требует копирования/вставки или поиска и замены для каждой сетки. Заранее благодарю вас за любую помощь, которую вы можете мне предложить!


person Ben Bloodworth    schedule 10.03.2017    source источник


Ответы (1)


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

public static class CustomGridHelperExtensions
{
    public static Kendo.Mvc.UI.Fluent.GridBuilder<T> MyGrid<T>(this HtmlHelper helper, string name)
        where T : class
    {
        return helper.Kendo().Grid<T>()
            .Filterable(filterable => filterable
                .Extra(true)   //This extended "filterable" section of code makes the contains filter the default string filter for these grids
                .Operators(operators => operators
                    .ForString(str => str
                        .Clear()
                        .Contains("Contains")
                        .DoesNotContain("Does not contain")
                        .StartsWith("Starts with")
                        .EndsWith("Ends with")
                        .IsEqualTo("Is equal to")
                        .IsNotEqualTo("Is not equal to")
                        .IsNull("Is null")
                        .IsNotNull("Is not null")
                    )
                )
            );
    }

затем вместо обычного способа настройки сетки вы делаете это вместо

       @(Html.MyGrid<model>("grid") //"grid" is name of grid.  You could leave this out
                     .DataSource(ds => ds
                        .Ajax()
                        .Filter(filter => ...'

Надеюсь, это поможет. Обратите внимание, что я получил часть этой информации с форумов Telerek.

person John Lord    schedule 01.05.2018