2014-04-22 19 views
12

Ho una griglia di kendo come segue.Invia parametro aggiuntivo in Kendo Grid Leggi l'azione

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

Ecco il mio codice di controllo

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

Funziona benissimo. Ma voglio inviare dati aggiuntivi quando Grid legge i dati, qualcosa come il seguente;

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

Non ho trovato alcuna soluzione su come farlo. Grazie in anticipo.

risposta

18

Se i dati aggiuntivi è noto al lato server è necessario utilizzare l'overload del metodo d'azione che accetta i valori del percorso:

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

Se questi dati aggiuntivi è noto al lato client solo si dovrebbe usare il metodo Data:

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

Si può provare questo;

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

Oppure tramite la funzione JavaScript;

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

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

Oppure codice JavaScript completo;

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

Se si utilizza parameterMap assicurarsi che stringa i come segue:

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

controller qualcosa di simile

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

Ulteriore documentazione può essere trovato in here e here.

+2

Grazie Mahib, la prima opzione ha funzionato per me. Ho passato molto tempo a cercarlo sul sito Telerik e non ho trovato esempi. Quando usi il metodo Data() in treeview sostituisce il parametro id predefinito, quindi devi restituirlo: [code] return {id: _curId, param1: _val1, param2: _val2} –

0

Nel mio caso: ho un testo tipo di ingresso, e voglio miei dati di carico griglia con filtro dal mio metodo di scrittura, e la griglia caricare i dati quando si preme 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 controllore :

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

Possiamo utilizzare le opzioni indicate di seguito per passare parametri aggiuntivi.

//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

non so perché ma nessun altro metodo ha funzionato per me, tranne questo. Ho usato una funzione js come in altre risposte ma il delegato del template l'ha risolto –