Мне нужно привязать сетку кендо нажатием кнопки и получить пример в другом вопросе SO: Kendo Grid - привязать данные после поиска, но это не работает для меня. Мое действие контроллера возвращает объект json, но этот объект не отображается в моей сетке.
Ниже приведен один и тот же код, представленный в другом вопросе:
@(Html.Kendo().Grid<Project.Data.Entity.SearchResult>()
.Name("ClaimantSearch")
.DataSource(dataSource => dataSource
.Ajax()
//.Read(read => read.Action("Search", "Claimant")) )
.Columns(columns =>
{
columns.Bound(x => x.Name);
columns.Bound(x => x.Authorized);
columns.Bound(x => x.CompanyName);
columns.Bound(x => x.Address);
})
.Resizable(resizing => resizing.Columns(true))
)
Javascript:
$('#btnSearch').click(function () {
alert('a');
$.ajax({
data: '@Url.Action("Search", "Claimant")',
type: 'POST',
contentType: "application/json;charset=utf-8",
data: "",
dataType: "json",
success: function (data) {
alert(data);
var grid = $('#Claimant').getKendoGrid();
grid.dataSource.data(result);
grid.refresh();
}
});
return false;
});
Чтобы передать параметр из представления в контроллер,.Data("дополнительная информация") добавляется в свойство.Read сетки.DataSource
Решение ASP.NET MVC
@(Html.Kendo().Grid<Your_Model>()
.Name("grd_yourGrid")
.AutoBind(false)
.Columns(columns =>
{
columns.Bound(c => c.modelAttribute).Width(300);
})
.HtmlAttributes(new { style = "height: 500px;" })
.Scrollable()
.Pageable(pageable => pageable
.Refresh(true)
.PageSizes((new int[] { 5, 10, 20, 50, 100, 200 }).ToList())
.ButtonCount(15))
.DataSource(dataSource => dataSource
.Ajax().ServerOperation(false)
.Read(read => read.Action("MyActionName", "MyController").Data("additionalInfo"))
.PageSize(100)
))
Javascript:
<script>
$('#btn_yourButtonName').click(function () {
$("#grd_yourGrid").data("kendoGrid").dataSource.read();
return false; // WITHOUT THIS GRID WILL NOT BE FILLED
});
function additionalInfo() {
return {
startRange: $("#inputValueOne").data("kendoNumericTextBox").value(),
endRange: $("#inputValueTwo").data("kendoNumericTextBox").value()
}
}
</script>
Контроллер (MyController):
[HttpPost]
public ActionResult MyActionName([DataSourceRequest]DataSourceRequest request, string startRange, string endRange){}
Вы можете добавить .AutoBind(false)
@(Html.Kendo().Grid<Project.Data.Entity.SearchResult>()
.Name("ClaimantSearch")
.AutoBind(false)
.DataSource(dataSource => dataSource
.Ajax()
.Read(read => read.Action("Search", "Claimant")) )
.Columns(columns =>
{
columns.Bound(x => x.Name);
columns.Bound(x => x.Authorized);
columns.Bound(x => x.CompanyName);
columns.Bound(x => x.Address);
})
.Resizable(resizing => resizing.Columns(true))
)
<input type="button" value="Generate" id="btnGenerate" />
Вы можете добавить $ ("# ClaimantSearch"). Data ("kendoGrid"). DataSource.read(); в событии нажатия кнопки JQuery
<script>
$('#btnGenerate').click(function () {
$("#ClaimantSearch").data("kendoGrid").dataSource.read();
});
</script>
Замените обратный вызов успеха следующим образом:
success: function (result) {
alert(result);
var grid = $('#Claimant').getKendoGrid();
grid.dataSource.data(result);
grid.refresh();
}
Проблема заключалась в том, что вы переименовали аргумент функции в data
но вы все еще пытались связать result
. Измените его на result
и он должен работать.
Кроме того, я заметил, что у вас есть два атрибута data
в вашем вызове ajax, возможно, вы захотите удалить пустой.