查看模型(ViewData),UserControls / Partials和全局变量 - 最佳实践?

时间:2009-06-24 13:21:14

标签: asp.net-mvc user-controls viewdata partials

我正试图想出一个在我的所有部分和我的观点中拥有'全球'成员(例如CurrentUser,Theme等)的好方法。

我不希望有一个可以返回此数据的逻辑类(如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 }); %>

我只是想知道在继续之前是否还有其他方法可以实现这一点。

有什么建议吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

您是否考虑过在会话中保留这些内容并在会话周围编写一个强类型包装器,以便您访问此信息?然后在任何视图中,您只需使用ViewPage(或ViewUserControl)的Session属性创建一个新的包装器类并使用它。