2011-12-10 101 views
0

訪問懶加載的屬性我有一個郵政類:NHibernate的ASP.NET MVC3剃刀代碼


public class Post 
{ 
    ... 
    public virtual IList<Comment> Comments { get; set; } 
    ... 
} 

在映射我集註釋爲多對一參考。正如我們所知,默認情況下它被設置爲延遲加載。

在我的Razor視圖腳本中,我想檢查帖子是否有任何評論,如果是,請添加一個按鈕,通過注入html來調用操作以通過ajax獲取該帖子的評論並顯示它們。
當我嘗試調用在剃刀上Post.Comments東西(如Model.Comments.Count())我收到一個異常說會話不存在。我知道爲什麼會發生 - 因爲延遲加載。
我的問題是如何處理這種情況?什麼是'最佳實踐'?

兩種解決方案在我腦海中:
1)設置註釋不懶加載 - 也不行,因爲我得到通過AJAX的意見後和這次我只需要評論 2伯爵)創建一個視圖模型類,包含信息,如果發佈有評論或通過ViewBag傳遞。

你如何看待這個建議?

感謝, 鮑爾泰克

回答

3

就個人而言,我會選擇2

創建一個視圖模型去,包括像HasComments的屬性和使用,在您的視圖,而不是試圖評估Model.Comments.Count()

+2

恕我直言,這個解決方案是一個你應該去。在action方法中產生由所有數據庫特定信息組成的ViewModel。 Razor應該使用該ViewModel來生成所需的HTML - 並且這不會對數據庫進行任何調用。 –

1

爲什麼你會話結束這麼早?

您應該仍然保持在打開它渲染,像那個時代。

+0

我使用:'using(session){(...)return ViewModel(...); }'所以會話應該是活動的,因爲使用塊尚未結束。但它不起作用。其實我不喜歡從視圖中使用複雜的邏輯和數據庫操作。我同意@John Allers和@Julian S,我應該選擇。 – bodziec

+1

實際上,你只是返回一個ViewResult實例,並且當該方法返回時(在使用塊已經放置之後),視圖被生成,因此你的錯誤。 – Andrew