Kendo MVC如何在初始选择列表之后使用AJAX重新填充下拉列表?
我有一个剑道下拉列表控件,我通过页面初始加载时的SelectList填充该控件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
@(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);
});
}