Сетка для Кендо:Проблема с шаблоном панели инструментов

StackOverflow https://stackoverflow.com//questions/25062785

Вопрос

У меня есть сетка, в которой указана информация о дорогах, и мне нужен шаблон панели инструментов, который позволит мне фильтровать дороги, выбирая концессию из выпадающего списка.

Что - то вроде этого

Мой код:

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 раз, что соответствует количеству уступок, которые у меня есть в данный момент.Когда я выбираю один из неопределенных параметров, он показывает фактическое название концессии, обновляет сетку, но не фильтрует ее.

Я хочу, чтобы в списке отображались названия концессий и фильтровалась сетка по концессиям, когда я выбираю одну из них.Что я упускаю из виду?

Это было полезно?

Решение

измени это

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);

Другие советы

Во-первых, дважды проверьте, какой Json вы возвращаете из метода контроллера.Похоже, что в ваших описаниях ConcessionMediumDescriptions могут отсутствовать данные.

Во-вторых, похоже, что в вашем контроллере вы возвращаете список объектов данных "ConcessionMediumDescription".

Я предполагаю, что это выглядит примерно так...

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

Вы можете рассмотреть возможность возврата поля заголовка как части этого Json и использовать его для текстового поля вашего выпадающего списка.Это просто я догадываюсь по тому, что вы возвращаете в этом контроллере.


Идеальный Json был бы примерно таким...

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

И вы определяете свой выпадающий список как таковой.

.DataTextField("text")
.DataValueField("id")

Вы должны выполнить строку возврата json следующим образом.

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

Просто измените DATAVALUE и DATATEXT

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top