在父 dropDownList 中选择选项不会将更新的值发送到子 dropDownList

Selecting option in parent dropDownList does not send updated value to child dropDownList

我有两个 dropDownLists 用于在局部视图的视图模型中填充数据。其中一个 dropDownLists 从另一个级联。当我更改父数据源的选择时,子数据源没有收到更新的值。

这是局部视图(可以多次出现在页面上):

@model ViewModel

@(Html.Kendo().DropDownListFor(m => m.Parent.Id)
              .Name("Parent_" + Model.Id)
              .OptionLabel("Select parent...")
              .DataTextField("Text")
              .DataValueField("Id")
              .DataSource(source =>
              {
                  source.Read(read =>
                  {
                      read.Action("GetParentOptions", "Controller");
                  });
              })
)

@(Html.Kendo().DropDownListFor(m => m.Child.Id)
              .Name("Child_" + Model.Id)
              .OptionLabel("Select child...")
              .DataTextField("Text")
              .DataValueField("Id")
              .DataSource(source =>
              {
                  source.Read(read =>
                  {
                      read.Action("GetChildOptions", "Controller", new { parentId = Model.Parent.Id });
                  })
                      .ServerFiltering(true);
              })
              .Enable(false)
              .AutoBind(false)
              .CascadeFrom("Parent_" + Model.Id)
)

控制器操作如下:

public JsonResult GetParentOptions()
{
    var options = ParentService.GetOptions();

    return Json(options, JsonRequestBehavior.AllowGet);
}

public JsonResult GetChildOptions(int? parentId)
{
    var options = ChildService.GetOptions(parentId);

    return Json(options, JsonRequestBehavior.AllowGet);
}

您将错误的 ParentId 传递给控制器​​。 ParentId 是来自模型的那个,当页面加载时,它将保持不变。您需要传递给控制器​​的是用户从父级下拉列表中选择的ParentId。操作方法如下:

@(Html.Kendo().DropDownListFor(m => m.Parent.Id)
     .Name("Parent_" + Model.Id)
     .OptionLabel("Select parent...")
     .DataTextField("Text")
     .DataValueField("Id")
     .DataSource(source =>
     {
         source.Read(read =>
         {
             read.Action("GetParentOptions", "Controller");
         });
     })
)

@(Html.Kendo().DropDownListFor(m => m.Child.Id)
     .Name("Child_" + Model.Id)
     .OptionLabel("Select child...")
     .DataTextField("Text")
     .DataValueField("Id")
     .DataSource(source =>
     {
         source.Read(read =>
         {
             read.Action("GetChildOptions", "Controller")
                  .Data("filterParentId");

         })
             .ServerFiltering(true);
     })
     .Enable(false)
     .AutoBind(false)
     .CascadeFrom("Parent_" + Model.Id)
)

<script>
    function filterParentId() {
        return {
            parentId: $("#Parent_@Model.Id").val()
        };
    }
</script>

顺便说一下,您不需要覆盖名称 属性。当您使用 DropDownListFor 时,名称将派生自 属性 来自 ModelMetadata 的名称。

更新:

我建议为您的下拉列表提供 id,而不是覆盖 name(如果必须的话)。操作方法如下:

@(Html.Kendo().DropDownListFor(m => m.Parent.Id)
     .OptionLabel("Select parent...")
     .DataTextField("Text")
     .DataValueField("Id")
     .DataSource(source =>
     {
         source.Read(read =>
         {
             read.Action("GetParentOptions", "Controller");
         });
     })
     .HtmlAttributes(new { @id = "Parent_" + Model.Id })        
)