2009-06-24 68 views
0

我想弄清楚在我的所有部分以及在我的觀點中有'全球'成員(如CurrentUser,主題等)的好方法。查看模型(ViewData),UserControls/Partials和全局變量 - 最佳實踐?

我不想有一個邏輯類可以返回此數據(如BL.CurrentUser)我認爲它需要在我的意見模型的一部分所以我嘗試從這些成員繼承BaseViewData。在我的控制器中,以這種或那種方式(我的BaseController中的過濾器或基本方法),我創建了一個繼承類的實例並將其作爲視圖數據傳遞。一切都很完美,直到這一點,因此,我有我的觀點數據在主視圖與基礎成員。但是偏心呢?

如果我有一個簡單的部分,需要顯示的博客文章則是這樣的:

<%@ Control Language="C#" AutoEventWireup="true" Inherits="ViewUserControl<Post>" %> 

和簡單的代碼來使這個部分,我認爲(其model.Posts爲IEnumerable<Post>):

<%foreach (Post p in this.Model.Posts) {%> 
    <%Html.RenderPartial("Post",p); %> 
<%}%> 

由於partial的Model不是BaseViewData,我無法訪問這些屬性。因此,我試圖讓一個名爲PostViewData從BaseViewData繼承類,但後來我的含意見,將有一個代碼,它們實際上是創建PostViewData,以便將其傳遞給部分:

<%Html.RenderPartial("Post",new PostViewData { Post=p,CurrentUser=Model.CurrentUser,... }); %> 

我也可以使用複製構造函數

<%Html.RenderPartial("Post",new PostViewData(Model) { Post=p }); %> 

我只是想知道在我繼續之前是否還有其他方法來實現這個。

有什麼建議嗎?

謝謝!

回答

0

你是否考慮在會話中保留這些內容,並在會話周圍編寫一個強類型的包裝,以便您訪問這些信息?然後在任何視圖中,您可以使用ViewPage(或ViewUserControl's)屬性創建一個新的包裝類並使用它。

+0

我不認爲Session是很長時間以來存儲在服務器上的解決方案,但是您給了我一個新的方向來思考:使用HttpContext.Current.Items,並讓BaseViewData從那裏檢索數據。當一個動作最初準備ViewData時,BaseViewData會將數據存儲在HttpContext.Current.Items中(使用BaseViewData設置器),當其他部分將訪問這些屬性時,將從HttpContext.Current.Items中讀取這些屬性(使用BaseViewData getters) 。 仍在尋找更優雅的解決方案,儘管這聽起來更好。 謝謝! – elado 2009-06-24 13:41:34