我有两个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);
}
答案 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 })
)