2017-04-26 6 views
1

Ich habe ein MVC Kendo Grid und ich möchte es über einen jQuery Ajax Call füllen. Ich habe jQuery ‚jeweils‘ Methode, um es so zu tun:Poping ASP.NET MVC Kendo Grid über Ajax Call

function FillRowsByRequest(reqRow) { 
     var readDataUrl = '@Url.Action("GetGoodsByReq")'; 
     var targetGrid = $("#storeReceiptRowsGrid").data("kendoGrid"); 

     $.get(readDataUrl, { reqseq: reqRow }, function (d, t, j) { 
      var counter = 0; 
      targetGrid.cancelChanges(); 
      $(d).each(function (i, e) { 
       targetGrid.dataSource.insert(counter++, { 
        GOOD_ID: e.GOOD_ID, 
        GOOD_CODE: e.GOOD_CODE, 
        GOOD_CODE_DESC: e.GOOD_CODE_DESC, 
        GOOD_DESC: e.GOOD_DESC 
       }); 
      }); 
     }); 
    } 

Ich kann meine Kendo Gitter sehen, die mit Daten gefüllt ist (nicht vollständig), aber die Sache ist, dass, wenn ich auf die Schaltfläche Speichern klicken, es tut Die Save Action Method wird nicht ausgelöst und folglich wird nichts in die Tabelle eingefügt und Grid enthält nichts, nachdem es aktualisiert wurde.

@(Html.Kendo() 
    .Grid<Tpph.Models.STORE_RECEIPT_ROW>() 
    .Name("storeReceiptRowsGrid") 
    .Columns(columns => 
    { 
     columns.Bound(o => o.GOOD_ID).Title("Good ID").HtmlAttributes(new { @class = "goodid" }).Visible(false); 
     columns.Bound(o => o.GOOD_CODE).Title("Good Code").HtmlAttributes(new { @class = "goodcode" }).Width(100); 
     columns.Bound(o => o.GOOD_CODE_DESC).Title("Good Code Desc").HtmlAttributes(new { @class = "goodcodedesc" }).Width(100); 
     columns.Bound(o => o.GOOD_DESC).Title("Good Desc").HtmlAttributes(new { @class = "gooddesc" }).Width(155); 
    }) 
    .ToolBar(toolbar => 
    { 
     toolbar.Create().Text("New Row").HtmlAttributes(new { @class = "k-primary", style = "background-color: #e6ffe6; border-color: #10c4b2; min-width: 100px; color: black;" }); 
     toolbar.Save().Text("Save").SaveText("Save").CancelText("Cancel").HtmlAttributes(new { @class = "k-primary", style = "background-color: #e6ffe6; border-color: #10c4b2; min-width: 100px; color: black;" }); 
    }) 
    .ColumnMenu() 
    .Selectable(s => s.Type(GridSelectionType.Row)) 
    .Sortable() 
    .Editable(editable => editable.Mode(GridEditMode.InCell).DisplayDeleteConfirmation("Delete?")) 
    .Filterable() 
    .Groupable() 
    .Scrollable() 
    .Pageable(p => p.Refresh(true)) 
    .Resizable(resize => resize.Columns(true)) 
    .Reorderable(reorder => reorder.Columns(true)) 
    .DataSource(dataSource => dataSource 
     .Ajax() 
     .Events(ev => ev.RequestEnd("storeReceiptRowsGridOnRequestEnd")) 
     .Batch(true) 
     .ServerOperation(true) 
     .Model(model => 
     { 
      model.Id(p => p.GOOD_ID); 
     }) 
     .Read(read => read.Action("StoreReceiptRowsRead", "StorageForms")) 
     .Update(u => u.Action("StoreReceiptRowsEdit", "StorageForms")) 
     .Create(c => c.Action("StoreReceiptRowsCreate", "StorageForms")) 
     .Destroy(de => de.Action("StoreReceiptRowsDestory", "StorageForms"))) 
    .Events(ev => 
    { 
     ev.DataBound("storeReceiptRowsGridOnBound"); 
    }) 
    ) 

Wie kann ich das tun?

+0

Nehmen wir an, durch Ajax-Aufruf, ich möchte füllen diese Felder und dann, wenn ich auf die Schaltfläche Speichern klicke, möchte ich, dass die aufgefüllten Daten gespeichert werden. Wenn ich die Felder manuell eintippe, funktioniert es, aber wenn ich das Raster über den jQuery Ajax-Aufruf bevölke, löst es nicht die Save Action Method aus. –

+0

Bitte fügen Sie den Ajaxcall in Ihrem obigen Code hinzu. – TechVision

+0

Sie sollten keinen AJAX-Aufruf in Ihrem JS benötigen, wenn Sie das Ereignis dataSource '.Create' korrekt verbunden haben. Veröffentlichen Sie Ihre Controller-Funktion 'StoreReceiptRowsCreate'. – Sandman

Antwort

0

Nach vielen Kämpfen mit diesem Problem, fand ich schließlich heraus, dass das Kendo Grid die CRUD Action Methoden nur dann auslöst, wenn das Attribut "dirty" einer Zeile auf true gesetzt ist. (schmutziges Flag ist ein winziges kleines rotes Dreieck, das in der Ecke einer Zelle erscheint, wenn Sie diese Zelle bearbeiten). So ist die Lösung für dieses Problem setzt schmutzige Flagge von jeder Zeile wahr wie folgt aus:

.set("dirty", true); 

Also meine letzte JavaScript-Code ist wie folgt:

function FillRowsByRequest(reqRow) { 
     var readDataUrl = '@Url.Action("GetGoodsByReq")'; 
     var targetGrid = $("#storeReceiptRowsGrid").data("kendoGrid"); 

     $.get(readDataUrl, { reqseq: reqRow }, function (d, t, j) { 
      var counter = 0; 
      targetGrid.cancelChanges(); 
      $(d).each(function (i, e) { 
       targetGrid.dataSource.insert(counter++, { 
        GOOD_ID: e.GOOD_ID, 
        GOOD_CODE: e.GOOD_CODE, 
        GOOD_CODE_DESC: e.GOOD_CODE_DESC, 
        GOOD_DESC: e.GOOD_DESC 
       }).set("dirty", true); 
      }); 
     }); 
    }