0

我所有的控制器都基于 BaseController,在它们之间共享属性并覆盖 OnActionExecuting 以根据路由设置一些值。

我正在创建一个 BaseViewData 类来对我的所有视图数据执行相同的操作。

目前我正在填充视图数据,如下所示(C#):

var viewData = new BaseViewData
{
    Name = "someName",
    Language = "aLanguage",
    Category = "aCategoryName"
};

我在需要视图数据的每个操作中都这样做。一些属性是通用的,需要在每个动作中设置。有没有办法在更全局的范围内设置一些属性?

如果我在 BaseController 上的 OnActionExecuting 方法中实例化 BaseViewData 类,如何从常规控制器(从 BaseController 派生)中的操作访问 BaseViewData 属性?

响应丹尼斯·帕尔默的更新:

我之所以这样做,是因为我在某些请求上没有随机填充 ViewData["lang"] 时遇到的一个烦人的问题。如果语言是英语,则 ViewData["lang"] 包含“en”,如果是日语,则包含“ja”(好吧,无论如何都应该如此)。我在 BaseController 上的 OnActionExecuting 中填充 ViewData["lang"]。

在我看来,我根据语言调用了一些部分视图:

<% Html.RenderPartial(ViewData["lang"] + "/SiteMenu"); %>

但是我随机收到“找不到/SiteMenu”状态的错误,这表明 ViewData["lang"] 没有价值。我只是找不到 ViewData["lang"] 不会被填充的任何原因。因此,我正在重写站点以仅使用强类型视图数据(并设置一些硬默认值)。但如果另一种方法更好,我会走那条路。

谢谢!

4

2 回答 2

1

也许您可以使用操作过滤器来添加您需要的数据,而不是您拥有的这种继承方案。

于 2009-12-17T00:21:19.767 回答
1

我不确定我是否完全按照您要执行的操作,但是如果您的视图使用路由中的值来显示某些信息,那么为 HtmlHelper 添加您自己的扩展方法似乎是一种更好的方法。

您的路线中是否包含名称、语言和类别?如果是这样,那么 HtmlHelper 将有权访问路线信息,并可以通过扩展方法确定要显示的内容。你的路线和你的观点需要知道什么之间有什么关联?

更新:lang您路线的一部分吗?如果是这样,那么我仍然认为您可以编写一个 HtmlHelper 扩展方法,直接查看路由数据并确定要呈现的部分视图。这样你的控制器甚至不需要担心设置 ViewData["lang"]。视图将始终知道如何根据路由进行渲染。

更新 2:我认为取消使用HtmlHelper扩展方法,因为它重新评估路线数据可能是过早优化的情况。您的控制器继承方案听起来过于复杂,您提出这个问题是因为您的设置方式ViewData不可靠。我怀疑从路由数据中提取值会比设置和读取ViewData.

从您的评论中:

在控制器中,我使用 lang 值来确定要显示的视图。

那只会让我觉得为了提供更好的建议,我需要查看更多的系统部分。如果您对每种语言都有单独的视图,那么为什么需要告诉视图使用哪种语言?

要考虑的另一种选择是使用嵌套母版页。您可以为站点布局创建一个母版页,然后为每种语言创建一个嵌套母版页,该母版页仅包含硬编码的 lang 值。

于 2009-12-17T00:27:11.947 回答