如何从基本控制器填充强类型视图数据?

时间:2009-12-17 00:18:03

标签: c# asp.net-mvc class controller viewdata

我的所有控制器都基于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”]不会被填充的任何原因。因此,我正在重写网站以仅使用强类型视图数据(并设置一些硬默认值)。但如果另一种方法更好,我会这样做。

谢谢!

2 个答案:

答案 0 :(得分:1)

也许您可以使用action filters添加所需的数据,而不是此继承方案。

答案 1 :(得分:1)

我不确定我是否完全遵循您要做的事情,但如果您的视图使用路线中的值来显示某些信息,那么为HtmlHelper添加自己的扩展方法似乎是更好的方法去。

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

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

更新2:我认为不考虑使用HtmlHelper扩展方法,因为它重新评估路由数据可能是过早优化的情况。您的控制器继承方案听起来过于复杂,您提出了问题,因为您设置ViewData的方式不可靠。我怀疑从路由数据中提取值将会比设置和从ViewData读取的效率更高(如果有的话)。

来自你的评论:

  

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

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

另一种考虑的替代方法是使用嵌套母版页。您可以为站点布局创建一个母版页,然后为每种语言创建一个嵌套母版页,其中只包含硬编码的lang值。