2010-06-22 42 views
0

我有一個簡單的MVC 2博客,我正在建設,因爲我學習。我的編輯頁面有標題,正文,日期,啓用和標籤。標籤是我的問題出現的地方。我有一個標籤表和一個Posts表和標籤通過PostTag表關聯到一篇文章。我有我的linq模型安裝正確,我甚至有添加HttpPost行動工作。HttpPost從編輯頁面更新我的模型與兒童的操作

我的問題是與編輯視圖,在這裏我想刪除了關於在加載時Post對象模型標記,並與上Post對象模型時,它是HttpPost-ED的標籤對其進行更新。我的模型是複雜的,我怎麼能做到這一點?我編輯觀點:

[HttpPost, Authorize, ValidateInput(false)] 
public ActionResult Edit(int id, FormCollection form) 
{ 
    Post p = repo.GetPost(id); 

    if (p == null) 
     return View("NotFound"); 

    if (ModelState.IsValid) 
    { 
     try 
     { 
      UpdateModel(p); 

      //Do something here to update the model p.TagList child model 
      // the p.TagList object is not updated through UpdateModel 

      repo.Save(); 

      return RedirectToAction("Post", "Blog", new { id = p.PostID }); 
     } 
     catch (Exception ex) 
     { 
      Debug.WriteLine(ex.Message); 
      ModelState.AddRuleViolations(p.GetRuleViolations()); 
     } 
    } 
    return View(p); 
} 

我所做的幫忙翻譯編輯頁面上標記對象的集合是通過TagListString對象剛剛連載用空格分隔每個標籤名稱。當我將它發回時,我可以通過迭代我的TagListString輕鬆地重建TagList對象 - 但它不會更新!

我試過幾種更新TagList模型的方法。循環播放並做回購。刪除()現有的,然後添加然後重建和添加新的。我試過只是創建一個新的集合,並以這種方式添加新的Tag對象。以下是我嘗試過的一些事情。

public void UpdateTagList(System.Data.Linq.EntitySet<PostTag> postTags, string tagListString) 
{ 
    db.PostTags.DeleteAllOnSubmit(postTags); 
    db.PostTags.InsertAllOnSubmit(GenerateTagListFromString(tagListString, postTags.SingleOrDefault().Post)); 
} 

private System.Data.Linq.EntitySet<PostTag> GenerateTagListFromString(string tagListString, Post post) 
{ 
    System.Data.Linq.EntitySet<PostTag> tagList = new System.Data.Linq.EntitySet<PostTag>(); 

    foreach (var t in tagListString.Trim().Split(' ')) 
    { 
     //look for this tag name in cache (MvcApplication.AllTags) 
     Tag found = MvcApplication.AllTags.SingleOrDefault(item => item.TagName.Trim().ToLower() == t.Trim().ToLower()); 

     //new PostTag for this new Post 
     PostTag pt = new PostTag(); 
     pt.Tag = found ?? new Tag() { TagName = t }; 
     pt.Post = post; 

     tagList.Add(pt); 
    } 
    return tagList; 
} 

回答

0

首先,我建議你用自定義來處理所有形式的數據模型綁定器,讓你的控制器動作接收與更新的標量數據和正確的標籤,而不是接收的FormCollection一個「郵報」對象。

然後,解決方案略有不同,這取決於您是否將.net 3.5與EF 1.0或.net 4.0與EF 4.0一起使用。

你能否提供這些信息以便我可以幫助你?謝謝。

+0

我最初實現了我的方法來獲取Post對象,但是我的子對象沒有正確傳入,是因爲我沒有自定義的ModelBinder指定如何綁定該對象?我使用.NET 3.5 – MaseBase 2010-06-24 04:48:46

+0

我創建了自定義的ModelBinder,它比我想象的要容易得多,但現在當我調用repo.Save()時,它不會將我的對象保存回數據庫。如果我在保存之前做了repo.Add(p),那麼它確實很好地添加它。但是,如何通知更新後的信息庫?由於某些原因,我的存儲庫類不知道發生了什麼變化。 – MaseBase 2010-06-24 06:25:42