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