Cascading DropDownListFor に問題があります。ページを Telerik 2012 MVC 拡張機能から UI for ASP.NET MVC にアップグレードしていました。他のすべてのページは簡単でしたが、カスケード ドロップダウン リストを含む 1 つのページは悪夢でした。
コントローラーは「SalesOrder」と呼ばれます。剣道ドロップダウンリストから私が望む動作は次のとおりです。
- SourceSystem ドロップダウン リスト (DDL) が最初に読み込まれます。
- 荷受人 DDL は、SourceSystem DDL の値に基づいて入力する必要があります。
- 荷受人 DDL の値に基づいて設定する必要がある 3 番目の DDL がありますが、荷受人 DDL を機能させることができれば、この 3 つ目の 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>
これは、SourceSystem が変更されたときに荷受人を取得するためにサポートされている SalesOrder コントローラーの GetConsignees です。
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 変数でレコードを取得することを確認しました。期待どおり、TEST SourceSystem で常に 1 を取得します。ただし、入力される唯一の DDL は SourceSystem リストです。SourceSystem リストの値を変更しても、GetConsignees メソッドへの新しい呼び出しすら表示されません。SourceSystem が変更されたときに Consignee DDL を変更する必要があるため、これは問題です。
ここでカスケードするのになぜそんなに苦労しているのか理解できません。足りないものはありますか?私はこれについて間違って考えていますか?助けてください!