【问题标题】:How to populate strongly typed viewdata from a base controller?如何从基本控制器填充强类型视图数据?
【发布时间】:2009-12-17 00:18:03
【问题描述】:

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

谢谢!

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    来自您的评论:

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

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

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

    【讨论】:

    • 是的,lang 是我路线的一部分。在控制器中,我使用 lang 值来确定要显示的视图。例如,www.apoads.com/en/Yokota。路线看起来像:“{language}/{b}”(b 是 base 的缩写,在这种情况下是军事基地 - 与编程无关)。
    • 我构建了一个 html 助手来获取路由数据并根据路由令牌返回语言。我的母版页对这个值进行了很多引用......使用 HtmlHelper 扩展意味着它每次都在做工作以获取这个值,对吗?这就是我在控制器上设置它的原因之一,只做一次工作并多次引用该值。还是我弄错了?
    • 所有非常好的建议。在我的例子中,有一个母版页可以根据语言提取几个不同的部分视图。在其他视图中,是的,语言是硬编码的。我现在正在做的是构建一个 BaseViewData 类,使其成为 BaseController 的属性,并在默认情况下使用语言设置的“en”对其进行实例化。由于每个视图都需要访问一些关键数据,所以我选择了这条路线。我仍然有你建议的 HtmlHelper,以防它变得方便。感谢您的回复。
    【解决方案2】:

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

    【讨论】:

    • 嗯...可能。感谢您提供链接 - 我第一次看到它,并且一直想更多地研究动作过滤器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-22
    • 2023-03-11
    • 1970-01-01
    • 2015-08-17
    相关资源
    最近更新 更多