我遇到了级联 DropDownListFor 的问题。我正在将一个页面从 Telerik 2012 MVC Extensions 升级到 ASP.NET MVC 的 UI。虽然其他页面都很轻而易举,但带有级联下拉列表的页面却是一场噩梦。
控制器称为“SalesOrder”。这是我想要从我的 Kendo 下拉列表中获得的行为:
- SourceSystem 下拉列表 (DDL) 是第一个加载的。
- Consignee DDL 必须根据 SourceSystem DDL 中的值进行填充。
- 还有第三个 DDL 必须根据收货人 DDL 中的值填充,但我认为如果我可以让收货人 DDL 工作,我也可以让这第三个 DDL 工作。
这是下拉列表和javascript。
@(Html.Kendo().DropDownListFor(model => model.SourceSystem)
.BindTo(ViewBag.SourceSystemShortNames)
.DataTextField("SourceSystemDisplayName")
.DataValueField("SourceSystemId")
.Value(Model.SourceSystem)
)
@(Html.Kendo().DropDownListFor(model => model.Consignee)
.CascadeFrom("SourceSystem")
.DataSource(source =>
{
source.Read(read =>
{
read.Action("GetConsignees", "SalesOrder")
.Data("GetSourceSystemVal");
});
})
.Value(Model.Consignee)
.DataTextField("ConsigneeDisplayName")
.DataValueField("ConsigneeId")
.AutoBind(false)
)
<script type="text/javascript">
function GetSourceSystemVal() {
return {
SourceSystem: $("#SourceSystem").val()
};
}
</script>
这是 SalesOrder 控制器中的 GetConsignees,它应该在 SourceSystem 更改时获取收货人。
public JsonResult GetConsignees(string SourceSystem)
{
var consignees = dbContext.Consignees.AsQueryable();
var returnConsignees = consignees
.Where(r => r.SourceSystemShortName == SourceSystem)
.Select(r => new { ConsigneeId = r.Consignee1, ConsigneeDisplayName = r.Consignee1 });
return Json(returnConsignees, JsonRequestBehavior.AllowGet);
}
SourceSystem 下拉列表填充得很好,因为它在页面加载时设置为 ViewBag 对象。当页面加载时,我什至接到了对 ~/SalesOrder/GetConsigness/?SourceSystem=TEST 的调用。我验证了我在 returnConsignees 变量中得到了记录,并且我总是得到 1 与预期的 TEST SourceSystem。但是,唯一填充的 DDL 是 SourceSystem 列表。当我更改 SourceSystem 列表中的值时,我什至看不到对 GetConsignees 方法的新调用。我需要在 SourceSystem 更改时更改 Consignee DDL,所以这是一个问题。
我不明白为什么我在这里级联遇到这么多麻烦。有什么我想念的吗?我想错了吗?请帮忙!