2014-04-22 4 views
12

Ich habe ein Kendo Grid wie folgt.Senden Sie zusätzliche Parameter in Kendo Grid Lesen Aktion

@(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)) 
) 

Hier ist mein Controller-Code

public ActionResult WeeklyRevenue([DataSourceRequest]DataSourceRequest request) 
     { 
      ... 
      DataSourceResult result = res.ToDataSourceResult(request); 
      return Json(result, JsonRequestBehavior.AllowGet); 
     } 

Es funktioniert gut. Aber ich möchte zusätzliche Daten senden, wenn Grid Daten liest, etwa so:

public ActionResult WeeklyRevenue([DataSourceRequest]DataSourceRequest request, string AdditionalParam) 

Ich konnte keine Lösung finden, wie dies zu tun ist. Danke im Voraus.

Antwort

18

Wenn die zusätzlichen Daten auf Server-Seite bekannt ist, sollten Sie die Überlastung der Aktionsmethode benutzen, die Route-Werte akzeptiert:

.DataSource(dataSource => dataSource.Server() 
    .Read(read => read.Action("Read", "Home", 
     new { AdditionalParam = ViewData["AdditionalParam"] })) 
) 

Wenn diese zusätzlichen Daten auf der Client-Seite bekannt ist, nur sollten Sie die Datenmethode:

.DataSource(dataSource => dataSource.Ajax() 
    .Read(read => read 
     .Action("Read", "Home") 
     .Data("additionalData") 
) 
) 
<script> 
function additionalData() { 
    return { 
     AdditionalParam: $("#search").val() 
    }; 
} 
</script> 
13

Sie können dies versuchen;

.Read(read => read.Action("WeeklyRevenue", "Home", new { AdditionalParam = "Test" })) 

Oder über JavaScript-Funktion;

.Read(read => read.Action("Products_Read", "Grid").Data("additionalInfo")) 

function additionalInfo() { 
    return { 
     AdditionalParam : "test" 
    } 
} 

Oder voller JavaScript;

transport: { 
    read: { 
     url: "/Home/WeeklyRevenue", 
     type: "POST", 
     contentType: "application/json", 
     dataType: "json", 
     data: { 
     AdditionalParam : "Test" 
     } 
    } 
    } 

Wenn Sie parameterMap verwenden stellen Sie sicher, stringify wie folgt vor:

parameterMap: function (data, operation) { 
        if (operation != "read") { 
         return kendo.stringify(data.models); 
        } 
        else if (operation === "read") { 
         return kendo.stringify(data); 
        } 
       } 

In Controller so etwas wie dieses

public ActionResult Products_Read([DataSourceRequest] DataSourceRequest request, string AdditionalParam) {...} 

Weitere Unterlagen sind in here und here finden.

+2

Dank Mahib, die erste Option funktionierte für mich. Ich habe lange auf der Telerik-Site danach gesucht und konnte keine Beispiele finden. Wenn Sie die Methode Data() in treeview verwenden überschreibt es den Standard-ID-Parameter, so dass Sie Folgendes zurückgeben müssen: [code] return {id: _curId, param1: _val1, param2: _val2} –

0

In meinem Fall: Ich habe einen Eingabetyp Text, und ich mag, dass meine Netzlast Daten mit Filter aus meiner Texteingabe, und das Gitter wird die Daten geladen werden, wenn ich btnSearch drücken:

@(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> 

An dem Controller :

public ActionResult GetUserSample([DataSourceRequest]DataSourceRequest request, string lanid) 
     { 
      IEnumerable<UserViewModel> userModel = GetListUser(lanid); 
      return Json(userModel.ToDataSourceResult(request)); 
     } 
2

können wir unten zusätzliche Parameter angegeben verwenden zu übergeben.

//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>)) 
+0

weiß nicht warum, aber keine andere Methode arbeitete für mich außer diesem. Ich habe eine js-Funktion wie in anderen Antworten verwendet, aber Vorlagen-Delegat löste es –