如何使模型与动态数据源保持最新?

时间:2019-05-16 21:08:51

标签: asp.net-mvc razor kendo-ui

在我从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值将存储在模型中。

实际

实际上,它确实在视觉上更改了状态组合框。您可以查看所有状态和过滤器。但是,当您提交和调试时,可以看到模型中的StateId为空。

当前解决方法/黑客

我发现,如果我一开始就下载了所有国家的所有州,那么它将按预期工作。

1 个答案:

答案 0 :(得分:0)

我发现了另一个解决方法/黑客,其工作原理比下载所有加载状态更好。我将控件从组合框更改为下拉列表,瞧​​,现在可以使用了。

不知道为什么这不起作用,但是由于我的问题已解决,因此我将其关闭,而且无论如何,组合框对于这种问题确实是致命的。

  

如果您遇到此问题,希望找到解决方案,请查看cascading dropdownlist   由CarstenFranke提供

应该为您更好地工作。