Обработка фильтрации серверов с помощью Kendo ComboBox

Я пытаюсь обработать фильтрацию Kendo UI ComboBox на стороне сервера. У меня есть следующие коды в представлении

$('#Solicitor').kendoComboBox({
    placeholder: "@T("Enter the partial Name or Primary ID of the Entity.").Text",
    dataTextField: "text",
    dataValueField: "id",
    autoBind: false,
    minLength: 3,
    filter: "startswith",
    dataSource: {
        serverFiltering: true,
        transport: {
            read: {
                url: "@Url.Action("Index", "EntitiesAdmin", new { area = "BizNet.Entity"})",
                dataType: "json"
            }
        }
    }
});

Когда я набрал что-то в ComboBox, например. CAR, используя Fiddler2, я вижу, что следующая строка запроса отправляется на сервер

filter%5Blogic%5D=and&filter%5Bfilters%5D%5B0%5D%5Bvalue%5D=CAR&filter%5Bfilters%5D%5B0%5D%5Bfield%5D=text&filter%5Bfilters%5D%5B0%5D%5Boperator%5D=startswith&filter%5Bfilters%5D%5B0%5D%5BignoreCase%5D=true

при разборе это будет выглядеть примерно так

filter[logic]:and
filter[filters][0][value]:CAR
filter[filters][0][field]:text
filter[filters][0][operator]:startswith
filter[filters][0][ignoreCase]:true

Судя по всему, ComboBox отправляет массив javascript с именем filter через ajax на сервер. Как мне обрабатывать такой массив в моем контроллере?

public ActionResult Index(THE_TYPE_TO_USE filter) {
}

Что мне вставить в THE_TYPE_TO_USE? Я пробовал object и dynamic, но оба они дали нулевой фильтр. Обратите внимание, что фильтр, отправляемый клиентом, также может быть сложным, как показано ниже:

$('#Solicitor').kendoComboBox({
    placeholder: "@T("Enter the partial Name or Primary ID of the Entity.").Text",
    dataTextField: "text",
    dataValueField: "id",
    autoBind: false,
    minLength: 3,
    filter: "startswith",
    dataSource: {
        serverFiltering: true,
        // Additional filters which span several levels deep
        filter: {
            filters: [
                {
                    filter: {
                        logic: "or",
                        filters: [
                            { field: "content-type", operator: "eq", value: "Company" },
                            { field: "content-type", operator: "eq", value: "Firm" }
                        ]
                    }
                }
            ]
        },
        transport: {
            read: {
                url: "@Url.Action("Index", "EntitiesAdmin", new { area = "BizNet.Entity"})",
                dataType: "json"
            }
        }
    }
});

который создаст следующую проанализированную строку запроса

filter[filters][0][filter][logic]:or
filter[filters][0][filter][filters][0][field]:content-type
filter[filters][0][filter][filters][0][operator]:eq
filter[filters][0][filter][filters][0][value]:Company
filter[filters][0][filter][filters][1][field]:content-type
filter[filters][0][filter][filters][1][operator]:eq
filter[filters][0][filter][filters][1][value]:Firm
filter[logic]:and
filter[filters][1][value]:CAR
filter[filters][1][field]:text
filter[filters][1][operator]:startswith
filter[filters][1][ignoreCase]:true

Как видите, массив может быть в несколько уровней в глубину. Итак, мой вопрос: что я должен добавить в THE_TYPE_TO_USE выше, чтобы он мог обрабатывать сложный фильтр произвольной глубины? Можно ли это сделать только с помощью ASP.NET MVC Wrappers? Если да, то как?


person Twisted Whisper    schedule 11.03.2014    source источник
comment
Вы проверили динамическую библиотеку linq для кендо? Я не использовал его много, но это кажется его союзником. blogs.telerik. com/kendoui/posts/14-01-02/   -  person Robin Giltner    schedule 12.03.2014
comment
Twisted, ты когда-нибудь смог это решить? Я сталкиваюсь с той же проблемой (ами).   -  person jbenckert    schedule 18.06.2014
comment
Нет, я этого не делал. Я изменил свои требования и мне нужно пройти только один уровень. Вы пробовали динамическую библиотеку linq для кендо, предложенную @RobinGiltner? У меня никогда не было возможности попробовать это. Дайте мне знать, если это сработает.   -  person Twisted Whisper    schedule 19.06.2014


Ответы (1)


Привет, ребята, если вы все еще ищете решение, то ниже приведен код:

   1:         public JsonResult GetCountries(string text)
   2:         {
   3:             var countries = new List<SelectListItem>
   4:                             {
   5:                                 new SelectListItem{Text ="Bulgaria",
   6:                                                    Value="1"},
   7:                                 new SelectListItem{Text ="United States of America",
   8:                                                    Value="2"},
   9:                                 new SelectListItem{Text ="India",
  10:                                                    Value="3"},
  11:                                 new SelectListItem{Text ="Australia",
  12:                                                    Value="4"},
  13:                                 new SelectListItem{Text ="United Kingdom",
  14:                                                    Value="5"},
  15:                             };
  16:             if (!string.IsNullOrEmpty(text))
  17:             {
  18:                 countries = (from item in countries
  19:                              where item.Text.StartsWith(text)
  20:                              select item).ToList();
  21:             }
  22:             return Json(countries, JsonRequestBehavior.AllowGet);
  23:         }

Инициализация поля со списком. Код

   1:         @(
   2:             Html.Kendo().ComboBox().Name("kcombobox")
   3:             .HtmlAttributes(new { style = "width:250px" })
   4:             .Placeholder("Select a value...")
   5:             .DataTextField("Text")
   6:             .DataValueField("Value")
   7:             .Filter(FilterType.StartsWith)
   8:             .DataSource(source =>
   9:             {
  10:                 source.Read(read =>
  11:                 {
  12:                     read.Action("GetCountries", "Home");
  13:                 }).ServerFiltering(true);
  14:             })
  15:        )

Если вы хотите обрабатывать дополнительные фильтры вместе с фильтром для поля со списком, вам потребуется либо DataSourceRequest, который самостоятельно обрабатывает остальную часть фильтра, либо вы можете выполнять фильтрацию на стороне клиента с помощью Javascript. функцию, применив фильтр к DataSource в событии DataBound Event.

person D_Learning    schedule 25.07.2014