3

我有一个列出道路信息的网格,并且想要一个工具栏模板,它允许我通过从 DropDownList 中选择一个特许权来过滤道路。

像这样的东西

我的代码:

CSHTML

<div id="datagrid">
    @(Html.Kendo().Grid<SustIMS.Models.RoadModel>()
        .Name("datagrid_Roads")
        .Columns(columns =>
        {
            columns.Bound(r => r.RoadCode).Title(ViewBag.lblCode).Width(140);
            columns.Bound(r => r.RoadType).Title(ViewBag.RoadType).Width(140);
            columns.Bound(r => r.RoadMediumDescription).Title(ViewBag.lblDescription);
            columns.Bound(r => r.ConcessionCode).Title("CCode").Hidden();
            columns.Bound(r => r.ConcessionMediumDescription).Hidden().Title(ViewBag.Concession);
        })
        .ToolBar(toolbar =>
        {
            toolbar.Template(@<text>
                <div class="toolbar">
                        <label class="category-label" for="category">Concessão:</label>
                            @(Html.Kendo().DropDownList()
                                .Name("concessions")
                                .OptionLabel("All")
                                .DataTextField("ConcessionMediumDescription")
                                .DataValueField("CCode")
                                .AutoBind(false)
                                .Events(e => e.Change("concessionChange"))
                                .DataSource(ds =>
                                {
                                    ds.Read("ConcessionFiltering", "MasterData");
                                })
                            ) 
                            </div>
            </text>);
        })
        .HtmlAttributes(new { style = "height: 534px;" })
        ...
        )
    )
</div>

<script type="text/javascript">

    function concessionChange() {
        var value = this.value(),
                grid = $("#datagrid_Roads").data("kendoGrid");

        if (value) {
            grid.dataSource.filter({ field: "ConcessionMediumDescription", operator: "eq", value: value });
        } else {
            grid.dataSource.filter({});
        }
    }

控制器

public ActionResult ConcessionFiltering()
{
    ConcessionModel cm = new ConcessionModel();
    var aux = cm.getConcessions();
    return Json(aux.concessions.Select(c => c.concession.mediumDescription).Distinct(), JsonRequestBehavior.AllowGet);
}

这是当前的结果:

zzz

列表中填满了“未定义”这个词 16 次,这是我目前拥有的让步次数。当我选择一个未定义的选项时,它会显示特许权的实际名称,刷新网格但不过滤它。

我希望列表显示特许权名称并在我选择其中一个时按特许权过滤网格。我错过了什么?

4

3 回答 3

1

改变这个

return Json(aux.concessions.Select(c => c.concession.mediumDescription).Distinct(), hJsonRequestBehavior.AllowGet);

return Json(aux.concessions.Select(c => new ConcessionModel { Description = c.concession.mediumDescription }).Distinct(), JsonRequestBehavior.AllowGet);
于 2014-08-01T07:02:07.603 回答
1

First, double check what Json you are returning from the controller method. It looks like your ConcessionMediumDescriptions may have no data in them.

Second, it looks like, in your controller, that you are returning a list of "ConcessionMediumDescription" data objects.

I am guessing it looks like this...

{ConcessionMediumDescription: {
  CCode: 'mycode',
  ...
  }
}

You may consider returning a title field as a part of this Json and to use that for the text field of your dropdown. This is just me guessing from what you are returning in that controller.


Ideal Json would be somting like this...

[{
  {{id: 'id1'},{text: 'text1'}},
  {{id: 'id2'},{text: 'text2'}}
}]

And you defind your dropdown as such.

.DataTextField("text")
.DataValueField("id")
于 2014-07-31T16:05:13.030 回答
0

你必须像这样做json返回线。

return Json(aux.concessions.Select(c => new { Value = c.concession.DATAVALUE, Text = c.concession.DATATEXT }), JsonRequestBehavior.AllowGet);

只需更改 DATAVALUE 和 DATATEXT

于 2015-01-18T15:26:17.427 回答