2009-02-03 21 views
7

Ben bir uyarlama üzerinde çalışıyorum SQL MVC ve Linq kullanarak bazı temel yuvarlak başımı almak için Stephen Walther en TaskList application:MVC Toplu Düzenleme - Sql Liste Kaydet Linq

kullanıyorum bir Toplu Düzenleme sistemini ekliyorum Steve Sanderson's blog'da açıklanan kavramlar.

Tüm bunlar beklendiği gibi çalışıyor, ancak döndüğüm Görev Listesini kaydetmede sorun yaşıyorum. BulkEdit'e gönderim, iade edilen listeden döngüler alır ve her öğeyi, Görevlerim'in LinqToSql db listesindeki güncelleştirir. Benim BulkEdit görünümü ViewPage<List<TaskList.Models.Task>> devralır ve aşağıdaki gibidir

: TaskEditor kontrolü System.Web.Mvc.ViewUserControl<Models.Task> devralır ve şöyle
<% 
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" /> 

<% 
    } 
%> 

:

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

Kontrolörü alın ve aşağıdaki gibi Mesaj yöntemler şunlardır:

[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"); 
    } 

Sorum şu ki, bu da öyle görünüyor karmaşık ve henüz listeden eklenen veya silinen görevleri henüz yapmadım. Ne yapmayı tercih ediyorum

db.Tasks = tasks; 

gibi bir şey ve Linq olanları değişti ve hangilerinin eski/yeni olan atlatmanın tüm sihrini yapalım.

Bu mümkün mü? Yoksa birazdan Linq'den biraz fazla bekliyorum?

cevap

3

Sen LINQ to SQL hiçbir çok katmanlı hikayesi vardır aslında uğraşıyoruz. Bunun aradığınız şey olduğunu düşünüyorum: bu adam hediyeler kolayca DataContext sınıfının bir "uzantı yöntemi" haline getirilebilecek

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

Birleştirme yöntemi ve neredeyse sadece doğru olur SQL için LINQ içine doğru inşa edildi. Neredeyse söylüyorum çünkü onu kullanmak için uzantı yönteminizin bulunduğu ad alanını eklemelisiniz.

0

Sanırım ne istediğinizi gerçekleştirmek için bir görünüm kullanmayı düşünmelisiniz. öğeleri tutmak için ObservebleCollection koleksiyonu ve o zaman bu koleksiyonun görünümüne listenizde bir bağlayıcı olabilir, hala öğeleri ekleme ve deleing vakaları ele almak gerekir, ama aynı zamanda size verecek bir IBindingList tercih edebilirsiniz DB'yi güncelleyen bir BindingListCollectionView, yapmanız gereken tek şey AddNew() CommitNew() ve benzeri görünümleri çağırmaktır.

HTH, Eric