2013-01-21 46 views
0

我在我的mvc項目中有一個kendo網格(內聯模式),並且我通過mvc初始化網格。 問題是,當我添加一個新的行時,它得到一個0 ID,它的髒屬性設置爲true。 如何刷新添加的項目併爲其設置正確的ID?Kendo Grid不爲我處理髒物。爲什麼?

這是我的劍道網:

@(Html.Kendo().Grid<IranHost.Tools.Services.Core.DataModel.Site>() 
            .Name("grid") 
            .Columns(columns => 
            { 
             columns.Bound(p => p.Domain).Width(250).Title("دامین"); 
             columns.Command(command => { command.Edit().Text("ویرایش").UpdateText("ذخیره").CancelText("لغو"); command.Destroy().Text("حذف"); }); 
            }) 
            .ToolBar(toolbar => toolbar.Create().Text("افزودن دامین جدید").HtmlAttributes(new { @class = "add-button" })) 
            .Editable(editable => { editable.Mode(GridEditMode.InLine); }) 
            .Sortable() 
            .Pageable() 
            .Scrollable() 
            .Events(action => { action.Edit("gridEdit"); action.Save("gridSave"); action.SaveChanges("gridSaveChanges"); }) 
            .DataSource(dataSource => dataSource 
             .Ajax() 
             .Events(events => { events.Error("result_handler"); }) 
             .Model(model => model.Id(p => p.Id)) 
             .Create(create => create.Action("AddDomain", "Service", new { customerID = ViewBag.CustomerId })) 
             .Read(read => read.Action("GetDomainListForGrid", "Service", new { customerID = ViewBag.CustomerId })) 
             .Update(update => update.Action("EditDomain", "Service")) 
             .Destroy(destroy => destroy.Action("DeleteDomain", "Service")) 
            ) 
            ) 

,這就是我在服務器端所做的:

public ActionResult AddDomain([DataSourceRequest] DataSourceRequest request, DataModel.Site site) 
    { 
     if (ModelState.IsValid) 
     { 
      var pattern = "([\\da-z\\.-]+)\\.([a-z\\.]{2,6})([\\/\\w\\.-]*)"; 
      if (!Regex.IsMatch(site.Domain, pattern)) 
      { 
       //TODO: Must be added in the framework. 
       ModelState.AddModelError("ERROR", "Wrong URL Format!"); 
       return Json(ModelState.ToDataSourceResult(), JsonRequestBehavior.AllowGet); 
      } 

      var siteContext = new Biz.Site(DataContext); 
      siteContext.Add(site); 
      DataContext.SaveChanges(); 
      ModelState.AddModelError("ADDED", site.id); 
      return Json(new[] { site }.ToDataSourceResult(request, ModelState), JsonRequestBehavior.AllowGet); 
     } 

     return new HttpStatusCodeResult(403); 
    } 

但它仍然無法正常工作!

回答

0

問題解決了! 我使用的是舊版本的KendoUI,它沒有requestEnd,所以我開始使用AddModelError來處理服務器端的結果。 其實我用AddModelError不是爲了錯誤,而是告訴客戶端添加/編輯項目是成功的。

這實際上是一個非常糟糕的主意,但我目前沒有選擇。在客戶端,我提出了Events.Error(「result_handler」)。劍道雖然它確實是一個錯誤,所以它沒有對UI做任何改變,但將髒屬性設置爲真!

現在我的老闆正試圖在新版本的KendoUI中使用ajaxComplete來引發其他事件。不幸的是,我沒有太多的選擇,直到我得到更新的版本!

+0

很高興你明白了。現在,我看到你的服務器端代碼,它看起來很可疑。你可能會嘗試的,因爲你在捏,是添加一個額外的領域到你的模型,把你的成功消息在這個領域。當視圖加載並通知用戶(通過kendo彈出窗口很好)時,請選中此字段。我這樣做是爲了在沒有模型狀態的情況下將錯誤傳遞給頁面。如果你做了這樣的事情,你將能夠通知用戶它已被'添加',而不會像現在這樣破壞ModelState。爲什麼site.Domain = site.Domain? –

+0

:D site.Domain = site.Domain! 其實它在編輯這篇文章後被刪除。這是離開那裏沒有任何地方的事情之一! :D –

+0

是的。感謝您的建議! –

0

創建新記錄時,默認的int id值爲0。

這個想法是當你點擊保存按鈕,記錄發送到服務器,你需要返回與更新的ID(從數據庫中檢索一個)的項目。然後,當網格讀取該值並查看它與默認值(零)不同時,客戶端返回到客戶端,它會將新記錄標記爲成功插入。 如果沒有項目返回或缺少更新的id值,Grid將繼續將該記錄標記爲髒,並且在將來的save/saveChanges按鈕單擊時它將繼續將其重新發送到服務器。

如果要更改默認ID值,可以在模型定義中使用DefaultValue方法。

.Model(model => model.Id(p => p.Id).DefaultValue(-42)) 
+0

是的,我知道這個過程必須是這樣的。但問題是我不知道如何得到正確的結果。正如你所看到的,我在問題的底部添加了額外的信息。請閱讀並告訴我你的想法。 –

0

您需要在任何CRUD操作後將記錄返回到網格。你甚至想在Destory上做這件事,爲你的error_handler事件返回一個錯誤。這是我在這裏發佈的許多答案上使用的代碼,還有一些額外的東西,但是您應該關注的是單個記錄如何像最初的Read一樣轉換爲List。如果需要,請查看我的其他答案以獲取有關模型和FlattenToThis的更多詳細信息。但我認爲這應該足以讓你知道你要去的地方。

[HttpPost] 
public JsonResult CreatePerson([DataSourceRequest]DataSourceRequest request, Person person) 
{ 
    if (ModelState.IsValid) 
    { 
     try 
     { 
      person = _personDataProvider.Create(person); 
     } 
     catch (Exception e) 
     { 
      ModelState.AddModelError(string.Empty, e.InnerException.Message); 
     } 
    } 
    var persons = new List<Person> {person}; 
    DataSourceResult result = PersonModel.FlattenToThis(persons).ToDataSourceResult(request, ModelState); 
    return Json(result, JsonRequestBehavior.AllowGet); 
} 

public JsonResult ReadPeople([DataSourceRequest]DataSourceRequest request) 
{ 
    var persons = _personDataProvider.Read(false); 
    DataSourceResult result = PersonModel.FlattenToThis(persons).ToDataSourceResult(request); 
    return Json(result, JsonRequestBehavior.AllowGet); 
} 

[HttpPost] 
public JsonResult UpdatePerson([DataSourceRequest]DataSourceRequest request, Person person) 
{ 
    if (ModelState.IsValid) 
    { 
     try 
     { 
      person = _personDataProvider.Update(person); 
     } 
     catch (Exception e) 
     { 
      ModelState.AddModelError(string.Empty, e.InnerException.Message); 
     } 
    } 
    var persons = new List<Person>() {person}; 
    DataSourceResult result = PersonModel.FlattenToThis(persons).ToDataSourceResult(request, ModelState); 
    return Json(result, JsonRequestBehavior.AllowGet); 
} 

[HttpPost] 
public JsonResult DestroyPerson([DataSourceRequest]DataSourceRequest request, Person person) 
{ 
    if (ModelState.IsValid) 
    { 
     try 
     { 
      person = _personDataProvider.Destroy(person); 
     } 
     catch (Exception e) 
     { 
      ModelState.AddModelError(string.Empty, "There was an error deleting this record, it may still be in use."); 
     } 
    } 
    var persons = new List<Person>() {person}; 
    DataSourceResult result = PersonModel.FlattenToThis(persons).ToDataSourceResult(request, ModelState); 
    return Json(result, JsonRequestBehavior.AllowGet); 
} 
+0

我已將我的代碼的服務器端部分添加到我的原始問題中。請看看並告訴我你的意見。 –

相關問題