Как поддерживать модель в актуальном состоянии с помощью динамического источника данных? - PullRequest
1 голос
/ 17 мая 2019

В случае, когда я получаю данные о стране и государстве из API, я не могу сохранить ссылку на модель после обновления источника данных комбинированного списка kendo.

Допустим, что естьформа, которая будет использоваться на международном уровне.Поэтому мы хотим предоставить поле со списком стран и поле со списком штатов, а затем отфильтровать штат по выбранной стране.Если пользователь выбирает страну, то поле со списком состояний обновляется.Это замечательно!Тем не менее, когда я иду к отправке, поле stateid в модели имеет значение null.

Я попытался вручную изменить источник данных и не могу найти больше информации по этому вопросу.Если кто-нибудь и укажет мне правильное направление, это будет с благодарностью.

Модель данных:

class ExampleModel {
  [display(name='StateId')]
  int? stateId;
  [display(name='CountryId')]
  int? countryId
}

Бритва:

<div id='country-wrapper'>
  @(Html.Kendo().ComboBoxFor(m => m.CountryId)
      .Filter("contains")
      .Placeholder("-- Select Country --")                                                                                              
      .DataTextField("Text")                                                                                              
      .DataValueField("Value")
      .BindTo(new SelectList(stateList, "CountryId", "CountryName", 1))
      .Suggest(true)
       .HtmlAttributes(new { @id = "CountryId",  onchange = " CountryChangeEvent(this); ComboChangeEvent(this);" 
  }));
</div>
<div id='state-wrapper'>
  @(Html.Kendo().ComboBoxFor(m => m.StateId)
      .Filter("contains")
      .Placeholder("-- Select State --")                                                                                              
      .DataTextField("Text")                                                                                              
      .DataValueField("Value")
      .BindTo(new SelectList(stateList, "StateId", "StateName"))
      .Suggest(true)
       .HtmlAttributes(new { @id = "StateId",  onchange = "ComboChangeEvent(this)" 
  }));
</div>

js:

  function CountryChangeEvent(elem) {
    var chosenId = $("#CountryId").data('kendoComboBox').value();

        if (!chosenId) return;

        $("#ProfileStateId").kendoComboBox({
            dataTextField: "Text",
            dataValueField: "Value",
            dataSource: {
                transport: {
                    read: {
                        // call this method in the controller and reset datasource
                        cache: false,
                        serverFiltering: true,
                        async: false,
                        dataType: "json",
                        url: '@Url.Action("GetStatesByCountryJson", "Home")?countryId=' + chosenId,
                    }
                }
            },
            filter: "contains",
            suggest: true
        });
        var combobox = $("#StateId").data('kendoComboBox');
        combobox.select(function (dataItem) {
            // clear the statecombobox
            return dataItem.Value === '';
        });
  }

Ожидается

Я ожидаю, что список состояний изменится при вызове функции CountryChangeEvent.Кроме того, когда вы отправляете форму, значение StateId будет сохранено в модели.

Actual

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

Текущий обходной путь / хак

Я обнаружил, что если я загружаю все состояния (для всех стран)в начале, то работает как задумано.

1 Ответ

0 голосов
/ 23 мая 2019

Я нашел другой обходной путь / хак, который работает намного лучше, чем загрузка всех состояний при загрузке.Я изменил элемент управления из поля со списком в раскрывающийся список и вуаля, теперь он работает.

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

Если вы столкнетесь с этой проблемой в надежде найти решение, загляните в каскадный выпадающий список Предоставлено CarstenFranke

Должно работать лучше для вас.

...