传递kendo DropDownListFor的值来读取另一个DropDownListFor的动作

时间:2014-09-03 22:32:42

标签: c# asp.net-mvc kendo-ui dropdownlistfor

我有一个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。我做错了什么?

谢谢。

2 个答案:

答案 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的示例:

Cascading DropDownList