Parameter an Kendo-UI-DataSource sind im Controller NULL

kendoui
mvc
asp.net
Tags: #<Tag:0x00007f9ae1117988> #<Tag:0x00007f9ae1117640> #<Tag:0x00007f9ae1116f38>

#1

In einem Kendo-UI-Projekt habe ich wie im Handbuch beschrieben weitere Parameter in der View an die Datenquelle übergeben:

// ...
.DataSource(dataSource => dataSource
    .Ajax()
    .Read(read => read.Action(@"Do_Read", @"Admin", new { filter = Model.Filter }))

In meinem Controller sah die entsprechende Funktion dann so aus:

public ActionResult Do_Read(
    [DataSourceRequest] DataSourceRequest request,
    string filter)
{
    // ...
}

Beim Aufruf der Funktion war der filter-Parameter komischerweise immer leer/null, obwohl ein Wert in der View übergeben wurde.

Auch im Request["filter"] stand der Wert korrekt drin.

Das war seltsam.

Ursache

Die Ursache war dann, dass “filter” wohl ein von Kendo UI intern verwendeter Bezeichner war, der im Aufruf von Do_Read auch irgendwie übergeben wurde.

Das ist irgendwie mit meinem Parameter kollidiert.

Lösung

Die Lösung bestand dann darin, den Parameter von “filter” in “myFilter” umzubenennen.

Anschließend wurde dann in der aufgerufenen Methode der Wert korrekt übergeben.

Also:

// ...
.DataSource(dataSource => dataSource
    .Ajax()
    .Read(read => read.Action(@"Do_Read", @"Admin", new { myFilter = Model.Filter }))

und:

public ActionResult Do_Read(
    [DataSourceRequest] DataSourceRequest request,
    string myFilter)
{
    // ...
}

Weitere Anmerkungen

Wenn der zusätzliche Parameter nicht nur ein string sondern ein komplexes Model ist, ist eventuell im ModelState auch ein Fehler gesetzt.

Das trat zumindest in einem Update-Handler bei einem anderen Kendo-Projekt auf, in dem auch ein reservierter Bezeichner (in diesem Fall ein Name aus dem Model des Grids) verwendet wurde.

Zusammenfassung

Zusätzliche Parameter in Kendo-UI-Grid-Handler, egal ob Update oder Read oder ähnliches immer so eindeutig benennen, dass sie weder mit dem Namen einer Eigenschaft im verwendeten Model noch mit Kendo-internen Namen kollidieren.