【问题标题】:Passing contextual info to Views in ASP.NET MVC将上下文信息传递给 ASP.NET MVC 中的视图
【发布时间】:2010-05-25 07:01:42
【问题描述】:

我想知道 - 向视图(或母版页)提供上下文(即与任何特定视图无关,但同时与所有视图相关)信息的最佳方式是什么?

考虑以下场景。

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

为了满足这些要求,我计划制作一个 javascript 片段,用于在客户端上隐藏当前的语言选项卡。为此,我需要客户端上当前的语言选项卡 ID。因此,我需要某种方式将 Id 传递给母版页(以便将其“融合”到 js 脚本中)。

我能想到的最好的事情是我所有的 ViewModel 都应该继承一些 ViewModeBase,它有一个字段来保存当前语言选项卡 ID。然后,无论我渲染什么视图,这个 Id 将始终可用于母版页的隐藏脚本。

但是,我担心这个 ViewModelBase 可能会以不受控制的方式增长,因为此类上下文信息(如当前语言)的数量将会增长..

有什么想法吗?

【问题讨论】:

    标签: asp.net-mvc viewmodel


    【解决方案1】:

    如果所有视图都需要此上下文信息,那么拥有基本视图模型似乎是一个不错的解决方案。问题是在哪里填充此信息以避免混乱您的所有控制器操作。 custom action filter 似乎是个好地方。在OnActionExecuted 方法中,您可以获取控制器操作返回的视图模型,如果它派生自基本类型,则填充上下文部分。

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

    【讨论】:

    • 感谢您的回答!为了避免控制器混乱,我通过工厂创建视图模型。所以,工厂负责填充 ViewModelBase 的属性。
    【解决方案2】:

    如果您认为 ViewModeBase 会增长很多,您也可以让视图模型实现一个接口。

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

    【讨论】:

    • 我明白你的意思。谢谢。但我只是有一种直觉,认为那里有更好的解决方案 :) 此外,我不记得确切是谁,但我猜来自 MVC 团队的某个人在博客中评论说,将 ViewModelBase 用于这些目的并不是一件好事..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-21
    • 2020-10-24
    • 2013-07-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多