4

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

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

这是我的第二个列表患者下拉列表

@(
 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();
 }
 });
}

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

4

4 回答 4

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")
)
于 2012-11-20T21:38:14.033 回答
2

而不是创建这样对数据源无用的数组:

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);
 }
 });
于 2012-11-01T20:14:28.873 回答
2

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

.CascadeTo("DropDownList2")

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

Telerik 下拉列表中下拉的级联

于 2012-11-01T11:27:17.160 回答
0

如果您不使用

.DataSource(source =>
                        {
                            source.Read(read =>
                            {
                                read.Action        ("FunctionName", "ControllerName").Data("filterDropdown1");
                            }).ServerFiltering(true);
                        })
.CascadeFrom("Dropdown1")

第二个下拉列表定义中的属性,并且您正在使用上面提到的定义。IE:-

@(
 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”函数的参数email,并且不需要ddlpatients。 reload(),实际上不支持.reload(),它会破坏执行,所以不要使用.reload()。

于 2015-03-10T08:10:26.950 回答