2009-02-03 91 views
7

爲了讓我的頭一輪使用MVC和LINQ一些基本面SQL我工作的適應斯蒂芬·瓦爾特TaskList applicationMVC批量編輯 - Sql的Linq列表保存

我添加使用批量編輯系統在Steve Sanderson's blog中描述的概念。

這一切都按預期工作,但是,我無法保存我返回的任務列表。 Post到我的BulkEdit循環遍歷返回的列表並更新我的LinqToSql db任務列表中的每個項目。

我BulkEdit視圖繼承ViewPage<List<TaskList.Models.Task>>和如下:

<% 
using (Html.BeginForm()) 
{ 
%> 
     <div id="items"> 

<% 
      foreach (var task in ViewData.Model) 
      { 
       Html.RenderPartial(
        "TaskEditor", 
        task, 
        new ViewDataDictionary(ViewData) 
          { 
           {"prefix", "tasks"} 
          } 
       ); 
      } 
%> 

     </div> 

     <input type="submit" value="Save changes" /> 

<% 
    } 
%> 

的TaskEditor控制繼承System.Web.Mvc.ViewUserControl<Models.Task>,看起來像這樣:

<div> 
<%= Html.Hidden(ViewData["prefix"] + ".index", ViewData.Model.Id) %> 

<% var fieldPrefix = string.Format("{0}[{1}].", ViewData["prefix"], ViewData.Model.Id); %> 

<%= Html.Hidden(fieldPrefix + "Id", ViewData.Model.Id) %> 
Description: 
<%= Html.TextBox(fieldPrefix + "TaskDescription", ViewData.Model.TaskDescription)%> 
Date: 
<%= Html.TextBox(fieldPrefix + "EntryDate", ViewData.Model.EntryDate.ToString("o"))%> 
Completed: 
<%= Html.CheckBox(fieldPrefix + "IsCompleted", ViewData.Model.IsCompleted)%> 
</div> 

的控制器GET和POST方法如下:

[AcceptVerbs(HttpVerbs.Get)] 
    public ActionResult BulkEdit() 
    { 
     var tasks = from t in db.Tasks orderby t.EntryDate descending select t; 

     return View(tasks.ToList()); 
    }   

    [AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult BulkEdit(IList<Task> tasks) 
    { 
     foreach(Task task in tasks) 
     { 
      foreach(Task dbTask in db.Tasks) 
      { 
       if (dbTask.Id == task.Id) 
       { 
        dbTask.TaskDescription = task.TaskDescription; 
        dbTask.EntryDate = task.EntryDate; 
        dbTask.IsCompleted = task.IsCompleted; 
       } 
      } 
     } 

     db.SubmitChanges(); 

     return RedirectToAction("Index"); 
    } 

我的問題是,這似乎太複雜的,我還沒有考慮添加或刪除列表中的任務。我寧願做是一樣的東西

db.Tasks = tasks; 

,讓LINQ的做這一切的神奇制定出哪些已經改變,哪些是新/老。

這可能嗎?或者我很快就會對Linq有點太期待?

回答

3

你正在處理的事實,LINQ to SQL中有沒有多層次的故事。我認爲這是你在找什麼:

http://blog.irm.se/blogs/eric/archive/2008/08/20/Go-Distributed-With-LINQ-to-SQL.aspx

,這傢伙的禮物可以很容易地變成DataContext類的「擴展方法」的合併方法,它幾乎將只是喜歡它內置於LINQ to SQL中。我之所以這樣說,幾乎是因爲你必須包含擴展方法所在的名稱空間才能使用它。

0

我認爲你應該考慮使用視圖來實現你想要的。 ObservebleCollection集合來保存項目,然後你可以在列表中綁定到該集合的視圖,你仍然需要處理添加和刪除項目的情況,但你也可以選擇一個IBindingList,它會給你一個將更新數據庫的BindingListCollectionView,所有你需要做的就是調用視圖AddNew()CommitNew()等等。

HTH, 埃裏克