Как сбросить комбинированный фильтр Telerik Kendo внутри сетки Kendo

#javascript #jquery #kendo-ui #kendo-grid #kendo-combobox

#javascript #jquery #kendo-ui #kendo-grid #kendo-combobox

Вопрос:

У меня есть сетка Kendo со списком, в котором установлен фильтр «содержит». Когда пользователь вводит мусор (он же значение, КОТОРОГО НЕТ в списке), я хочу сбросить фильтр и повторно выбрать последнее допустимое значение.

Я использую синтаксис Razor для создания сетки, а рассматриваемый выпадающий список представляет собой составной объект, использующий этот шаблон:

 @(Html.Kendo().ComboBoxFor(m => m)
        .Name("CurrentSalesRep")
        .Filter("contains")
        .DataValueField("Code")
        .DataTextField("Name")
        .BindTo((System.Collections.IList)ViewData["SalesReps"])
)
  

Пытаясь настроить определенные универсальные события для всех выпадающих списков на моем сайте, я запускаю процедуру jQuery на стороне клиента, которая настраивает события «фокус», «размытие» и «изменение» на основе селектора jQuery, который находит текстовое поле, отображаемое Kendo.

При фокусировке я сохраняю предыдущее значение, затем при размытии и изменении я хочу определить, является ли входное значение допустимым, а затем повторно выбрать предыдущее значение:

 function setupKendoComboBoxEvents(comboBox, parentContainer) {
    var cntrlId = comboBox.attr("Id");
    var $ctrl = comboBox;
    var $cbx = $ctrl.data("kendoComboBox");

    var input = $cbx.input;

    input.on("focus", function () {
        if ($cbx.select() !== -1) {
            $("#"   cntrlId).attr("data-prev-value", $cbx.select());
        }
        $cbx.value("");
        $cbx.open();
    });

    input.on("change", function (e) {
        if ($cbx.select() === -1) {
            $cbx.dataSource.filter([]);
            $cbx.select(parseInt($("#"   cntrlId).attr("data-prev-value")));
        }
    });

    input.on("blur", function (e) {
        if ($cbx.select() === -1) {
            $cbx.dataSource.filter([]);
            $cbx.select(parseInt($("#"   cntrlId).attr("data-prev-value")));
        }
    });
}
  

Теперь проблема. Это отлично работает для автономных выпадающих списков Kendo. Однако, когда я запускаю эту процедуру onGridEdit для выпадающего списка внутри сетки Kendo, фильтр, по-видимому, «сбрасывает» себя и повторно выбирает основное желаемое значение. Значение, которое передается для строки, сохраняет значение «мусора», и MVC не может повторно создать объект «CurrentSalesRep», что приводит к недопустимому ModelState.

Есть ли что-то особенное в сочетании сетки Kendo и Kendo ComboBox? Как я могу гарантировать правильный выбор в сообщении формы сетки?

Комментарии:

1. Имеет ли ваш выпадающий список по умолчанию допустимое значение или при его загрузке отображается пустой элемент «Пожалуйста, выберите»? Если вы отображаете «Пожалуйста, выберите», то определяется ли это как мусор?

2. Для них нет значения заполнителя. Значение «мусора» — это введенные пользователем критерии фильтрации, которые после события размытия больше не видны пользователю. Они видят сброс, но модель Kendo, которая используется для отправки сообщения, сохраняет «мусор». Это происходит только для выпадающего списка в сетке Kendo, а не за ее пределами.