Отправить дополнительный параметр в задании сетки Кендо
У меня есть кендо Сетка следующим образом.
@(Html.Kendo().Grid<RevenueModel>()
.Name("WeeklyRevenue")
.Resizable(resizing => resizing.Columns(true))
.Columns(columns =>
{
columns.Bound(p => p.Number).Width(100);
columns.Bound(p => p.Type).Width(100);
columns.Bound(p => p.Week1).Format("{0:c}");
columns.Bound(p => p.Week2).Format("{0:c}");
columns.Bound(p => p.Week3).Format("{0:c}");
columns.Bound(p => p.Week4).Format("{0:c}");
columns.Bound(p => p.Week5).Format("{0:c}");
columns.Bound(p => p.TotalRevenue).Format("{0:c}");
})
.Scrollable()
.Events(events => events.Change("onChange").DataBound("onDataBound"))
.DataSource(dataSource => dataSource.Ajax().Read(read => read.Action("WeeklyRevenue", "Home")).ServerOperation(false))
.Pageable(pager => pager.Refresh(true))
)
Вот мой код контроллера
public ActionResult WeeklyRevenue([DataSourceRequest]DataSourceRequest request)
{
...
DataSourceResult result = res.ToDataSourceResult(request);
return Json(result, JsonRequestBehavior.AllowGet);
}
Он отлично работает. Но я хочу отправить дополнительные данные, когда Grid считывает данные, что-то вроде следующего;
public ActionResult WeeklyRevenue([DataSourceRequest]DataSourceRequest request, string AdditionalParam)
Я не мог найти решение, как это сделать. Спасибо заранее.
Ответы
Ответ 1
Если дополнительные данные известны на стороне сервера, вы должны использовать перегрузку метода Action, который принимает значения маршрута:
.DataSource(dataSource => dataSource.Server()
.Read(read => read.Action("Read", "Home",
new { AdditionalParam = ViewData["AdditionalParam"] }))
)
Если эти дополнительные данные известны только на стороне клиента, вы должны использовать метод Data:
.DataSource(dataSource => dataSource.Ajax()
.Read(read => read
.Action("Read", "Home")
.Data("additionalData")
)
)
<script>
function additionalData() {
return {
AdditionalParam: $("#search").val()
};
}
</script>
Ответ 2
Вы можете попробовать это:
.Read(read => read.Action("WeeklyRevenue", "Home", new { AdditionalParam = "Test" }))
Или через функцию JavaScript;
.Read(read => read.Action("Products_Read", "Grid").Data("additionalInfo"))
function additionalInfo() {
return {
AdditionalParam : "test"
}
}
Или полный JavaScript;
transport: {
read: {
url: "/Home/WeeklyRevenue",
type: "POST",
contentType: "application/json",
dataType: "json",
data: {
AdditionalParam : "Test"
}
}
}
Если вы используете параметрMap, убедитесь, что вы выполните следующие строки:
parameterMap: function (data, operation) {
if (operation != "read") {
return kendo.stringify(data.models);
}
else if (operation === "read") {
return kendo.stringify(data);
}
}
В контроллере что-то вроде этого
public ActionResult Products_Read([DataSourceRequest] DataSourceRequest request, string AdditionalParam) {...}
Дополнительную документацию можно найти в здесь и здесь.
Ответ 3
Мы можем использовать приведенные ниже параметры для передачи дополнительных параметров.
//object route values
Read(read => read.Action("vs_Read", "vs", new{id=33})
//js function name
Read(read => read.Action("vs_Read", "vs").Data("passAdParam")
//By Template Delegate
Read(read => read.Action("Aggregates_Read", "Grid").Data(@<text>
function() {
//pass parameters to the Read method
return {
name: "test",
id: $("#search").val()
}
}
</text>))
Ответ 4
В моем случае: у меня есть текст типа ввода, и я хочу, чтобы мои данные загрузки сетки с фильтром из моего ввода текста, и сетка будет загружать данные, когда я нажимаю btnSearch:
@(Html.Kendo().Grid<ARM.Models.UserViewModel>()
.Name("gridUsers")
.Columns(columns =>
{
columns.Bound(c => c.Code);
columns.Bound(c => c.LanID);
columns.Bound(c => c.DepartmentName);
columns.Bound(c => c.UserRole);
columns.Bound(c => c.Level);
})
.DataSource(dataSource => dataSource
.Ajax()
.Read(read => read.Action("GetUserSample", "ApprovalManager").Data("filterLanID"))
.PageSize(20)
)
)
<script>
function filterLanID() {
return {
lanid: $('#txtFilterUserId').val().trim()
};
}
function btnSearchOnClick(){
$('#gridUsers').data("kendoGrid").dataSource.read();
}
</script>
Контроллер:
public ActionResult GetUserSample([DataSourceRequest]DataSourceRequest request, string lanid)
{
IEnumerable<UserViewModel> userModel = GetListUser(lanid);
return Json(userModel.ToDataSourceResult(request));
}