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

时间:2015-01-30 16:46:03

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

我有两个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)
)

以下是Controller的行动:

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);
}

1 个答案:

答案 0 :(得分:1)

您将错误的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>

顺便说一下,您不需要覆盖Name属性。当您使用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 })        
)