Сетка для Кендо:Проблема с шаблоном панели инструментов
-
22-12-2019 - |
Вопрос
У меня есть сетка, в которой указана информация о дорогах, и мне нужен шаблон панели инструментов, который позволит мне фильтровать дороги, выбирая концессию из выпадающего списка.
Что - то вроде этого
Мой код:
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);
}
Это текущий результат:
Список заполнен словом "неопределено" 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