2011-06-06 73 views
0

所以我剛開始使用ASP.NET MVC,我很喜歡它,除了我似乎有一個奇怪的訣竅,遇到最奇怪的錯誤。我正在爲自己製作一個簡單的博客應用程序。我有兩個簡單的模型:postcomment。我有一個局部視圖,用於創建每個帖子的詳細信息視圖中嵌入的評論。當我提交表單更新註釋,它進入我CommentsController的創建行動,它看起來像......數據庫沒有在MVC中更新模型

[HttpPost] 
    public ActionResult Create(comment comment) 
    { 
     comment.date = DateTime.Now; 
     if (ModelState.IsValid) 
     { 
      post p = db.posts.Find(comment.post); //I've verified that comment.post is coming in 
      if (p.comments == null) p.comments = new List<comment>(); 
      p.comments.Add(comment); 
      db.Entry(p).State = EntityState.Modified; //I'm using this line since that's how its done in the edit actionmethod of the BlogController. I was just updating db.posts.Find(... manually, but that wasn't workign either. 
      db.comments.Add(comment); 
      db.SaveChanges(); 
      return RedirectToAction("Details", "Blog", new { id = comment.post }); 
     } 

     return PartialView(comment); 
    } 

的問題是,雖然評論被添加到數據庫中就好了,後沒有按」 t更新。當我在保存更改之前檢查p時,它已更新,但顯然它從未實際提交到數據庫,因爲當我重定向到Details時,那些註釋不存在。我的代碼有什麼明顯的錯誤嗎?我是否缺少.NET或MVC的一些基本基礎?讓我知道如果我需要提供更多的代碼或上下文。

有趣的提示:無論如何,post.comments似乎總是空白。我在創建帖子時將其設置爲空列表,但它似乎仍然返回null。不知道這是否僅僅是試圖存儲一個空列表的結果,或者是否與我的問題有關。再次,我知道,我會堅持任何其他需要在這裏。

謝謝!

回答

3

也許保存更改工作正常,但您沒有看到保存的帖子的評論,因爲您在顯示帖子時未加載它們。您可以渴望加載在你的行動後,顯示後,像這樣的評論:

post p = db.posts 
    .Include(p1 => p1.comments) 
    .Where(p1 => p1.Id == id) 
    .SingleOrDefault(); 

我也認爲你可以簡化您創建行動:

[HttpPost] 
public ActionResult Create(comment comment) 
{ 
    comment.date = DateTime.Now; 
    if (ModelState.IsValid) 
    { 
     db.comments.Add(comment); 
     db.SaveChanges(); 

     return RedirectToAction("Details", "Blog", new { id = comment.post }); 
    } 

    return PartialView(comment); 
} 

這應該工作,如果comment.post是對相關帖子發表評論的外鍵。 (你的代碼看起來是這樣的話,因爲Find(comment.post)

+0

沒有,我包括在細節上每篇文章的評論查看與'@foreach(在Model.comments VAR項目)'...加,我知道他們沒有得到保存,因爲下次我嘗試添加評論時,「p.comments」仍然爲空。謝謝。 – 2011-06-06 16:22:00

+0

我確實喜歡在ActionMethod中抓取匹配的註釋,而不是從post.comments加載。如果我無法解決這個問題,我會使用它。謝謝! – 2011-06-06 16:24:50

+0

@Thomas Shields:你不使用延遲加載,對吧? (否則'p.comments'不能爲'null',它至少是一個空集合。)如果你不使用延遲加載,上面代碼中的'p.comments'將總是*爲'null' ,無論你在數據庫中有多少評論。你如何加載帖子的詳細信息視圖的評論?您的foreach循環中的「Model.comments」是否爲空? – Slauma 2011-06-06 16:31:23

0

雖然@Slauma使我對我的解決方案,我只是發表我的我用於未來參考(感謝@George施托克爾)

public ActionResult Create(comment comment) 
    { 
     comment.date = DateTime.Now; 
     if (ModelState.IsValid) 
     { 
      db.comments.Add(comment); 
      db.SaveChanges(); 
      return RedirectToAction("Details", "Blog", new { id = comment.post }); 
     } 

     return PartialView(comment); 
    } 
最終代碼

和檢索評論...

public ActionResult Details(int id) 
    { 
     var post = (from p in db.posts 
        where p.id == id 
        select new { p.id, p.title, p.content, p.date, p.tag, comments = (from c in db.comments where c.post == id select c) }).SingleOrDefault(); 

     post p2 = new post(post.id, post.title, post.content, post.date,post.tag, post.comments.ToList()); 
     return View(p2); 
    }