我有一个DropDownListFor组件,它有一个读取操作,从数据库中获取值。但是,我想根据另一个DropDownListFor的值过滤这些值。
这是具有过滤值
的DropDownListFor组件 <div class="editor-field">
@(Html.Kendo().DropDownListFor(model => model.ReleaseID)
.DataTextField("Value")
.DataValueField("Key")
.DataSource(ds => ds
.Read(read=>read.Action("GetReleases", "Task"))
)
)
@Html.ValidationMessageFor(model => model.ReleaseID)
</div>
我想要做的是将ReleaseID的值传递给另一个DropDownListFor的读取操作。我试着这样做:
<div class="editor-field">
@(Html.Kendo().DropDownListFor(model => model.MarketModelID)
.Events(e => e.Select("onSelectMarketModel"))
.Template("<span data-title='Model Description: #: data.Item3 #'>#: data.Item2 # </span>")
.DataTextField("Item2")
.DataValueField("Item1")
.DataSource(ds => ds
.Read(read => read.Action("GetMarketModels", "Task", new { release = Model.ReleaseID }))
))
@Html.ValidationMessageFor(model => model.MarketModelID)
</div>
使用控制器方法签名:
public JsonResult GetMarketModels(int? release)
{
//code to get market models based on release
}
但是,无论顶部的ReleaseID DropDownFor选择是什么,GetMarketModels方法中的版本始终为0。我做错了什么?
谢谢。
答案 0 :(得分:3)
我真的不喜欢这个例子,所以我想我会说明你如何从你拥有的东西,到应该起作用的东西 - 为了我自己的利益,你的和其他人阅读这个:
首先,您需要在ReleaseID上使用Name属性:
@(Html.Kendo().DropDownListFor(model => model.ReleaseID)
.Name("ReleaseID") // <-- needs this line added
.DataTextField("Value")
.DataValueField("Key")
.DataSource(ds => ds
.Read(read=>read.Action("GetReleases", "Task"))
)
)
接下来,您需要输入.Data()
,指定一个函数,为您提供ReleaseID,表明您正在执行.ServerFiltering(true)
和.Cascade
来自其他下拉列表,并创建函数您指定以Json格式返回要在级联中使用的版本ID:
@(Html.Kendo().DropDownListFor(model => model.MarketModelID)
.Events(e => e.Select("onSelectMarketModel"))
.Template("<span data-title='Model Description: #: data.Item3 #'>#: data.Item2 # </span>")
.DataTextField("Item2")
.DataValueField("Item1")
.DataSource(source =>
{
source.Read(read =>
{
read.Action("GetMarketModels", "Task").Data("filterMarket");
})
.ServerFiltering(true);
})
.CascadeFrom("ReleaseID") // <-- "Name" attribute, from above
.Value(Model.MarketModelID != null ? Model.MarketModelID.ToString() : "1")
)
<script>
function filterMarket() {
return {
strReleaseID : $("#ReleaseID").val()
}
}
</script>
然后,在任务控制器中,传入变量:
public JsonResult GetMarketModels(string strReleaseID)
{
int releaseID = int.Parse(strReleaseID);
var data = db.MarketModels.Where(t => t.ReleaseID == releaseID).ToList();
return Json(data, JsonRequestBehavior.AllowGet);
}
请注意,您在JavaScript中为参数指定的名称必须与控制器函数中的名称匹配。这种方法是我用来在应用程序中级联下拉列表并为我工作的方法。
答案 1 :(得分:1)
您需要使用级联DropDownLists。在这里,您可以找到如何创建级联DropDownLists的示例: