Kendo MVC如何在初始选择列表之后使用AJAX重新填充下拉列表?

Kendo MVC如何在初始选择列表之后使用AJAX重新填充下拉列表?,ajax,asp.net-mvc-4,kendo-ui,dropdownlistfor,Ajax,Asp.net Mvc 4,Kendo Ui,Dropdownlistfor,我有一个剑道下拉列表控件,我通过页面初始加载时的SelectList填充该控件 @(Html.Kendo().DropDownListFor(m => m.AssociatedWithType) .Events(x => x.Select("CR.TodoAddEditDialog.AssociatedWithSelected")) .Value(ViewBag.AssociatedWithTypesId) .BindTo(ViewBag.Associated

我有一个剑道下拉列表控件,我通过页面初始加载时的SelectList填充该控件

@(Html.Kendo().DropDownListFor(m => m.AssociatedWithType)
    .Events(x => x.Select("CR.TodoAddEditDialog.AssociatedWithSelected"))
    .Value(ViewBag.AssociatedWithTypesId)
    .BindTo(ViewBag.AssociatedWithTypesSelectList)
)

@(Html.Kendo().DropDownListFor(m => m.AssociatedWithId)
   .BindTo(ViewBag.AssociatedWithIdsSelectList)
)
这一切都很好,但当第一个下拉菜单更改值时,我需要重新加载数据。我有以下javascript:

AssociatedWithSelected: function(e) {
    var dataItem = this.dataItem(e.item.index());

    var associatedWithIdsDropDown = $("#todoAddEditDialogForm #AssociatedWithId").data("kendoDropDownList"); 
    var url = settings.getAssociatedWithIdsUrl + "?associatedWithType=" + dataItem.Text;
    associatedWithIdsDropDown.dataSource.read({
        url: url
    });
}
然而,什么也没说

我怀疑这是因为我从未在dropdownlist中定义过数据源,但我不知道如何在MVC部分中定义一个数据源,而不使用它来初始填充列表


有什么想法吗?

我想您正在研究如何创建级联下拉列表。我建议您使用本文介绍的方法。

不要使用viewbag绑定模型。下面是您如何从服务器上删除它的方法

 @(Html.Kendo().DropDownListFor(x => x.FromOpportunity)
          .Name("OpportunityDDL")                 
          .DataTextField("OpportunityName")              
          .DataValueField("OpportunityId")                         
          .DataSource(source => {
              source.Read(read =>
               {
                   read.Action("GetOpportunityListByAccount", "CrmIntegration")
                      .Data("OnAdditionalData");
               })
                . ServerFiltering(true);
          })             
          .HtmlAttributes( new { style = "margin-left:13px; width: 275px;" })
控制器 这是一种伪代码,但基本上返回一个Json列表

List<OpportunityViewModel> oppVMList = new List<OpportunityViewModel>();
        var oppList = new OrderManager().GetOpportunitiesByAccount(Id); 

        foreach (var op in oppList)
        {
            OpportunityViewModel opvm = new OpportunityViewModel();
            opvm.OpportunityId = op.OpportunityId;
            opvm.OpportunityName = op.OpportunityName;

            oppVMList.Add(opvm);
        }

    return Json(oppVMList , JsonRequestBehavior.AllowGet);
您的参数名称必须是Id

任何问题只要问:)

这是我的用于OnAdditionalData的JS函数,基本上,它在读取控制器方法GetOpportunityListByAccount之前,会转到这个函数来获取参数

function OnAdditionalData() {

    var dataItem = $("#Advertisers").data("kendoMultiSelect").value();

    return {
        //call would not work when expecting a Guid, 
        //now it expects a string            
        Id: "" + dataItem
    };
}

我最后做了这件事,这似乎奏效了。也许有更好的方法使用剑道绑定,但我仍然没有弄清楚如何使用

AssociatedWithSelected: function(e) {
    var dataItem = this.dataItem(e.item.index());

    var associatedWithIdsDropDown = $("#todoAddEditDialogForm #AssociatedWithId").data("kendoDropDownList");

    var url = settings.getAssociatedWithIdsUrl + "?associationType=" + dataItem.Text;
    $.ajax({
        url: url
    })
    .done(function (response) {
        associatedWithIdsDropDown.dataSource.data(response);
    });
}

您的select事件正在查找名为CR.toLoadedItDialoge.AssociatedWithSelected的函数,而不是简单地查找JS函数AssociatedWithSelected@CSharper,是的,为了简洁起见,我没有包含名称空间代码。不,我不想级联。我只希望下拉列表的初始填充来自模型,任何下拉列表的刷新都来自服务器。当然有一种方法可以实现我想要的。加载表单后,执行一系列AJAX调用来填充下拉列表看起来很糟糕!它是一个级联下拉列表,因此基于multi-select字段的值,它将重新填充下拉列表,因此需要多个ajax调用。你甚至不需要读取中的数据,只要调用read.action我有点困惑你到底想做什么?这是我的问题。我有几个下拉列表需要在这个特定的表单上填充。如果我对下拉列表进行动态绑定,使它们都进行ajax调用来进行初始填充,这看起来很糟糕,而且功能也很糟糕,因为页面需要很长时间才能准备好。因此,取而代之的是,我获取控制器中的所有数据,并在HTML退出之前填充下拉列表。这一切都很好,但是,有一种情况,如果用户更改了一个下拉列表,我需要通过ajax重新加载另一个下拉列表的值。如果read不需要参数,则不必使用参数调用read。只需说
opportunity.dataSource.read()
AssociatedWithSelected: function(e) {
    var dataItem = this.dataItem(e.item.index());

    var associatedWithIdsDropDown = $("#todoAddEditDialogForm #AssociatedWithId").data("kendoDropDownList");

    var url = settings.getAssociatedWithIdsUrl + "?associationType=" + dataItem.Text;
    $.ajax({
        url: url
    })
    .done(function (response) {
        associatedWithIdsDropDown.dataSource.data(response);
    });
}