2016-08-05 79 views
0

我已經完成了這個網格自動同步,這樣你可以編輯它,每次改變一個字段的時候,它會提交的更新動作。爲此,您必須設置批處理(true)屬性,該屬性支持編輯多行,但這不是我使用它的方式,因爲自動同步會自動觸發更新事件,所以您沒有機會編輯多個調用更新之前的行。劍道UI MVC網格總是試圖挽救2條

出於某種原因,它總是提交一個新的記錄更新。例如,當我點擊添加新工具欄按鈕toolbar.Create().Text("Add New Time Task");),你可以在Chrome開發者工具的網絡標籤看到2個記錄被提交給我的控制器......在一個更新的呼叫模型[0]和模型1

但如果我執行盒內編輯和離開細胞的焦點觸發更新調用... 2個獨立的更新調用正在作出...第一個是增加新的(我可以告訴大家,因爲標識= 0,所有的默認值都是按照我的網格配置)。

人知道爲什麼添加新類型的呼叫被觸發?

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

圖片雙通話時編輯單個細胞更新: enter image description here

+0

你在Grid_SaveOrUpdate控制器操作中做什麼?在創建時,你必須在響應中返回創建的項目,其非零ID設置,否則Kendo網格在下一篇文章中仍然認爲它是新的(id == 0),並將其提交以再次創建。查看http://demos.telerik.com/aspnet-mvc/grid/editing上Editing_Create的實現,並查看它返回的內容。 –

+0

@TheDreadPirateStephen感謝您的想法。我正在那樣做。但這似乎不是問題。如果我刷新頁面,所以沒有掛起的更新或任何操作,然後編輯任何單元格,結果是對我的控制器操作進行了2個不同的調用。第一個數據模型用於ID = 0的新記錄....這是問題調用。第二個調用是使用真正編輯的記錄的數據模型的正確更新調用。看到我添加到原始問題的圖片。 –

回答

0

嗯,這是一個有趣的6小時搞清楚了這一點。事實證明,在我們的測試數據庫中,某人關閉了Id主鍵列上的Identity默認規範。然後在測試過程中,保存了Id = 0的測試記錄,以便每次都進入網格,然後在保存或更新另一行時,Id = 0的那一行也在該批處理中嘗試被保存。