2016-08-05 26 views
0

Ich habe dieses Raster auf autoSync konfiguriert, so dass Sie es bearbeiten können und jedes Mal, wenn Sie ein Feld ändern, wird die Aktualisierungsaktion gesendet. Damit dies funktioniert, müssen Sie die Batch (true) -Eigenschaft festlegen, die das Bearbeiten mehrerer Zeilen unterstützt. Dies ist jedoch nicht die Art, wie ich sie verwende, da die automatische Synchronisierung das Update-Ereignis auslöst. Sie erhalten keine Gelegenheit, mehrere zu bearbeiten Zeilen vor dem Aufruf des Updates.Kendo UI MVC Grid versucht immer, 2 Datensätze zu speichern

Aus irgendeinem Grund sendet es immer ein neues Rekordupdate. Wenn ich zum Beispiel auf die Schaltfläche "Neu hinzufügen" in der Symbolleiste klicken, sehen Sie in der Chrome-Tools-Netzwerk-Registerkarte, dass zwei Datensätze an meinen Controller gesendet werden ... ein Modell [0] und ein Modell 1 in einem einzigen Update-Aufruf.

Aber wenn ich ein InCell-Edit führe und den Fokus der Zelle belasse, um den Update-Aufruf auszulösen ... werden 2 separate Update-Aufrufe gemacht ... das erste ist ein Add New (Ich kann sagen, weil die Id = 0 und alle Voreinstellungen entsprechen meiner Gitterkonfiguration).

Wer weiß, warum dieser Aufruf "Neuer Typ" ausgelöst wird?

@using Kendo.Mvc.UI; 

@Html.Partial("_IndexEditViewHeader") 

@(Html.Kendo().Grid<OTIS.AppServ.Shared.ViewModels.TimeTaskViewModel>() 
    .Name("TimeTasksGrid") 
    .Columns(columns => 
    { 
     columns.Bound(l => l.Id).Hidden(); 
     columns.Bound(l => l.CompanyId).Hidden(); 
     columns.Bound(l => l.CompanyName); 
     columns.Bound(l => l.TaskDescription); 
     columns.Bound(l => l.TaskTypeId) 
      .EditorTemplateName("TimeTaskTypesDDL") 
      .ClientTemplate("#= TaskTypeDescription #"); 
     columns.Bound(l => l.UserSelectable) 
      .ClientTemplate("<input type='checkbox' value='#= UserSelectable #' " + 
           "class='chkbx' onclick='setCheckBoxModelValue(this,&quot;TimeTasksGrid&quot;,&quot;UserSelectable&quot;)'" + 
           "# if (UserSelectable) { #" + 
            "checked='checked'" + 
           "# } #" + 
          " />" 
         ); 
     columns.Bound(l => l.HoursMultiplier); 
     columns.Command(command => command.Destroy()).Width(110); 
    }) 
    .Editable(editing => editing.Mode(GridEditMode.InCell)) 
    // Add "Create" command 
    .ToolBar(toolbar => 
    { 
     toolbar.Create().Text("Add New Time Task"); 
     //toolbar.Save(); 
    }) 
    .DataSource(dataSource => dataSource 
     .Ajax() // Specify that the data source is of ajax type 
     .ServerOperation(false) // paging, sorting, filtering and grouping will be applied client-side 
     .Model(model => 
      { 
       model.Id(c => c.Id); 
       model.Field(c => c.CompanyId).DefaultValue(ViewBag.CompanyId); 
       model.Field(c => c.TaskDescription).DefaultValue("Task Description"); 
       model.Field(c => c.TaskTypeId).DefaultValue(20); 
       model.Field(c => c.TaskTypeDescription).DefaultValue("Billable"); 
       model.Field(c => c.HoursMultiplier).DefaultValue(1); 
      } 
     ) 
     .Sort(sort => 
     { 
      sort.Add(c => c.CompanyName); 
      sort.Add(c => c.TaskDescription); 
     }) 
     // Specify a handler for the error event 
     .Events(events => events.Error("KendoGridErrors")) 
     .Batch(true) 
     // CRUD configuration --> 
     .Create(create => create.Action("Grid_SaveOrUpdate", "ManageTimeTasks", new { area = "Shared" })) 
     .Read(read => read.Action("Grid_Read", "ManageTimeTasks", new { area = "Shared" })// Specify the action method and controller name 
     ) 
     .Update(update => update.Action("Grid_SaveOrUpdate", "ManageTimeTasks", new { area = "Shared" })) 
     .Destroy(destroy => destroy.Action("Grid_Delete", "ManageTimeTasks", new { area = "Shared" })) 
      // <-- CRUD configuration  
    ) 
    .Groupable() 
    .Sortable() 
    .Filterable() 
) 

<script> 
    $(function() { 
     $('#TimeTasksGrid').data().kendoGrid.dataSource.options.autoSync = true; 
    }); 
</script> 

Bild von Doppel Anruf auf Aktualisieren einer einzelnen Zelle Bearbeitung: enter image description here

+0

Was machen Sie in der Grid_SaveOrUpdate Controller-Aktion? Bei einem create müssen Sie das erstellte Element in der Antwort mit seinem ID-Set ungleich Null zurückgeben, da das Kendo-Grid beim nächsten Post immer noch denkt, es sei neu (id == 0), und es erneut zur Erstellung einsenden. Sehen Sie sich die Implementierung von Editing_Create unter http://demos.telerik.com/aspnet-mvc/grid/editing an und schauen Sie sich an, was sie zurückgibt. –

+0

@TheDreadPirateStephen danke für die Idee. Ich mache das. Aber das scheint nicht das Problem zu sein. Wenn ich meine Seite aktualisiere, also keine ausstehenden Aktualisierungen oder Aktionen vorhanden sind und dann eine Bearbeitung für eine beliebige Zelle vornehmen, sind zwei unterschiedliche Aufrufe meiner Controller-Aktion die Folge. Das erste Datenmodell ist für einen neuen Datensatz mit ID = 0 .... das ist der Problemaufruf. Der zweite Aufruf ist der korrekte Aktualisierungsaufruf mit dem Datenmodell des wirklich bearbeiteten Datensatzes. Siehe Bild, das ich zur ursprünglichen Frage hinzugefügt habe. –

Antwort

0

Gut, dass ein Spaß 6 Stunden war dies herauszufinden. Es stellt sich heraus, dass in unserer Testdatenbank jemand die Identity-Standardspezifikation in der Id-Primärschlüsselspalte deaktiviert hat. Dann wurde während des Testens ein Testdatensatz mit einer ID = 0 gespeichert, so dass er jedes Mal ins Grid kam. Wenn Sie dann eine andere Zeile speichern oder aktualisieren, wurde auch diese Zeile mit der ID = 0 versucht gerettet werden.