将上下文信息传递给ASP.NET MVC中的视图

问题描述:

我想知道什么是向视图(或主视图)提供上下文(即与任何特定视图无关,但同时与所有视图无关)信息的最佳方式页)?将上下文信息传递给ASP.NET MVC中的视图

请考虑以下情况。

假设我们有一个支持多种UI语言的应用程序。用户可以通过UI的小部件(如页面顶部的标签)切换它们。每种语言都作为一个单独的选项卡呈现。不应呈现当前语言的选项卡。

为了解决这些要求,我打算在客户端上隐藏当前的语言选项卡。为此,我需要客户端上当前的语言选项卡标识。所以,我需要一些方法将Id传递给master页面(为了将它融合到js脚本中)。

我能想到的最好的事情是,我所有的ViewModel都应该继承一些ViewModeBase,它有一个字段来存放当前语言标签ID。然后,无论我要呈现的视图如何,该ID始终可用于主页的隐藏脚本。

不过,我担心这ViewModelBase可以以不受控制的方式可能成长为这样的片段上下文信息(如当前的语言)将增长数..

任何想法?

如果所有视图都需要此上下文信息,那么拥有基本视图模型似乎是一个很好的解决方案。问题是在哪里填充此信息以避免混淆所有控制器操作。 A custom action filter看起来像个好地方。在OnActionExecuted方法中,您可以获取由控制器操作返回的视图模型,并在来自基本类型的情况下填充上下文部分。

另一种选择是将上下文信息放入ViewData(强类型视图也可以使用ViewData),但是我个人讨厌使用魔术字符串并在我的视图中进行投射(这可以通过使用HTML助手来解决ViewData的)。

+0

感谢您的回答! 为了避免控制器混乱,我通过工厂创建了我的视图模型。所以,工厂负责填充ViewModelBase的属性。 – Ant 2010-05-25 07:32:23

如果您认为ViewModeBase会增长太多,您也可以让viewmodels实现一个接口。

View或Partial可以具有该接口的类型。 如果只有一些页面具有这种功能,那特别有用。

+0

我明白你的观点。谢谢。 但我只是有一种直觉,认为有更好的解决方案:) 此外,我不记得确切是谁,但有人从MVC团队我猜在一个博客中说,有ViewModelBase为这些目的不是一件好事。 。 – Ant 2010-05-25 11:17:05