J'ai une grille de kendo comme suit.
@(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))
)
Voici mon code de contrôleur
public ActionResult WeeklyRevenue([DataSourceRequest]DataSourceRequest request)
{
...
DataSourceResult result = res.ToDataSourceResult(request);
return Json(result, JsonRequestBehavior.AllowGet);
}
Ça fonctionne bien. Mais je veux envoyer des données supplémentaires lorsque Grid lit des données, comme ce qui suit:
public ActionResult WeeklyRevenue([DataSourceRequest]DataSourceRequest request, string AdditionalParam)
Je n'ai pas trouvé de solution pour faire cela. Merci d'avance.
Si les données supplémentaires sont connues sur le serveur, vous devez utiliser la surcharge de la méthode Action qui accepte les valeurs de route:
.DataSource(dataSource => dataSource.Server()
.Read(read => read.Action("Read", "Home",
new { AdditionalParam = ViewData["AdditionalParam"] }))
)
Si ces données supplémentaires sont connues uniquement du côté client, vous devez utiliser la méthode Data:
.DataSource(dataSource => dataSource.Ajax()
.Read(read => read
.Action("Read", "Home")
.Data("additionalData")
)
)
<script>
function additionalData() {
return {
AdditionalParam: $("#search").val()
};
}
</script>
Vous pouvez essayer ceci;
.Read(read => read.Action("WeeklyRevenue", "Home", new { AdditionalParam = "Test" }))
Ou via la fonction JavaScript;
.Read(read => read.Action("Products_Read", "Grid").Data("additionalInfo"))
function additionalInfo() {
return {
AdditionalParam : "test"
}
}
Ou JavaScript complet;
transport: {
read: {
url: "/Home/WeeklyRevenue",
type: "POST",
contentType: "application/json",
dataType: "json",
data: {
AdditionalParam : "Test"
}
}
}
Si vous utilisez parameterMap, assurez-vous de stringifier comme suit:
parameterMap: function (data, operation) {
if (operation != "read") {
return kendo.stringify(data.models);
}
else if (operation === "read") {
return kendo.stringify(data);
}
}
Dans le contrôleur quelque chose comme ça
public ActionResult Products_Read([DataSourceRequest] DataSourceRequest request, string AdditionalParam) {...}
Une documentation complémentaire est disponible dans ici et ici .
Nous pouvons utiliser les options données ci-dessous pour transmettre des paramètres supplémentaires.
//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>))
Dans mon cas: j'ai un texte de type entrée et je veux que mes données de chargement de grille soient filtrées à partir de mon entrée de texte; la grille chargera les données lorsque j'appuierai sur 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>
Un contrôleur:
public ActionResult GetUserSample([DataSourceRequest]DataSourceRequest request, string lanid)
{
IEnumerable<UserViewModel> userModel = GetListUser(lanid);
return Json(userModel.ToDataSourceResult(request));
}