如何动态绑定kendo mvc ui下拉列表

时间:2012-11-01 10:22:02

标签: asp.net-mvc kendo-ui

我正在使用Kendo UI mvc开发asp.net mvc。我有两个剑道下拉列表。一个用于诊所列表,另一个用于选定诊所的患者列表。但是,临床和患者之间没有使用级联下拉列表的直接关系。因为我在dropdownlist更改事件中使用了ajax调用并获取了患者列表。这是我列表诊所的第一个下拉列表

 @(
  Html.Kendo().DropDownList()
  .Name("ddlClinics")
  .Events(e=>e.Change("ChangeClinic"))
  .BindTo(new SelectList((List<Account.Entities.Clinic>)ViewBag.lstClinic,
 "ClinicID", "ClinicName")))

这是我的第二个listpatients下拉列表

@(
 Html.Kendo().DropDownList()
.Name("ddlPatients")
.BindTo(new SelectList((List<Patient>)ViewBag.Patients, 
"PatId", "PatName"))))

我希望在第一个下拉列表更改时将患者列表动态绑定到第二个下拉列表,

function ChangeClinic()
{
$.ajax({
url: '/Messages/GetPatient',
 type: 'Post',
 data: { email: '@User.Identity.Name' },
 cache: false,
 success: function (result) {
 var ddlPatients = $('#ddlPatients').data('kendoDropDownList');
 var main = [];
 $.each(result, function (k, v) {
 main.push({ "PatId": v.PatId, "PatName": v.PatName });
  });
  ddlPatients.dataTextField = "PatName";
  ddlPatients.dataValueField = "PatId";
  ddlPatients.dataSource.data(main);
  ddlPatients.reload();
 }
 });
}

我可以将列表绑定到下拉列表,但所有项目都显示为'undefined'。所以请指导我。

4 个答案:

答案 0 :(得分:5)

据我所知,诊所和患者之间存在关系,因此您应该能够使用包装中提供的 CascadeFrom(“DropDownList1”)。我们以类似的方式使用级联下拉列表来确定学区和学校之间的关系:

@(Html.Kendo().DropDownList()
            .Name("District")
            .HtmlAttributes(new { style = "width:300px;" })
            .BindTo(ViewBag.districts)
            .DataTextField("DistrictName")
            .DataValueField("DistrictID")
            .OptionLabel("Select District")
)
@(Html.Kendo().DropDownList()
            .Name("School")
            .HtmlAttributes(new { style = "width:300px;" })
            .CascadeFrom("District")
            .BindTo(ViewBag.schools)
            .DataTextField("SchoolName")
            .DataValueField("SchoolID")
            .OptionLabel("Select School")
)

答案 1 :(得分:2)

而不是创建对dataSource无用的数组:

success: function (result) {
 var ddlPatients = $('#ddlPatients').data('kendoDropDownList');
 var main = [];
 $.each(result, function (k, v) {
 main.push({ "text": v.PatId, "value": v.PatName });
  });

  ddlPatients.dataSource.data(main);
 }
 });

答案 2 :(得分:1)

如果你想根据第一个DropDown值填充第二个DropDown。 Telerik提供,

.CascadeTo("DropDownList2")

有关详细信息,请参阅以下链接。

Cascading of Dropdown in Telerik dropdownlist

答案 3 :(得分:0)

如果您不使用

.DataSource(source =>
                        {
                            source.Read(read =>
                            {
                                read.Action        ("FunctionName", "ControllerName").Data("filterDropdown1");
                            }).ServerFiltering(true);
                        })
.CascadeFrom("Dropdown1")
第二个下拉列表定义中的

属性,您正在使用上面提到的定义。即: -

@(
 Html.Kendo().DropDownList()
.Name("ddlPatients")
.BindTo(new SelectList((List<Patient>)ViewBag.Patients,"PatId", "PatName"))
)

然后你可以直接在ajax post的成功函数中将数据绑定到第二个下拉列表。

    function ChangeClinic()
        {
        $.ajax({
        url: '/Messages/GetPatient',
         type: 'Post',
         data: { email: '@User.Identity.Name' },
         cache: false,
         success: function (result) {
         $('#ddlPatients').data('kendoDropDownList').dataSource.data(result);
             //ddlPatients.reload();

  }
         });
        }

@注意: - 1)结果值应包含具有属性“PatId”和“PatName”的新患者列表,这些患者基于传递给GetPatient控制器中“Messages”功能的参数电子邮件,并且不需要对于ddlpatients.reload(),不支持infact .reload(),它会中断执行,所以不要使用.reload()。