C# 使用ViewBag与跨多个视图直接引用静态属性

C# 使用ViewBag与跨多个视图直接引用静态属性,c#,asp.net-mvc,properties,viewbag,C#,Asp.net Mvc,Properties,Viewbag,我试图集中一些相当静态的信息,例如用户名或徽标图像URL。我最初清理的代码将在每个需要它的控制器操作中查找该信息,并在强类型模型中设置它。这导致在整个应用程序中重复许多相同(有时略有不同,具体取决于作者)代码块 我已经创建了一个静态属性来构建此信息,例如 public static class SampleInfo { public static string LogoUrl { get { string logoUrl = "wo

我试图集中一些相当静态的信息,例如用户名或徽标图像URL。我最初清理的代码将在每个需要它的控制器操作中查找该信息,并在强类型模型中设置它。这导致在整个应用程序中重复许多相同(有时略有不同,具体取决于作者)代码块

我已经创建了一个静态属性来构建此信息,例如

public static class SampleInfo
{
    public static string LogoUrl
    {
        get {
                string logoUrl = "would-do-something-to-store/look-up-image-here";
                return logoUrl;
            }
    }
}
现在我可以引用SampleInfo.LogoUrl并获取URL,而不是每次单独查找。但目前,该字段仍然传递给模型中的视图,因此每次我仍然必须键入
model.LogoUrl=SampleInfo.LogoUrl

一种想法是将视图中的
替换为
,然后设置
ViewBag.Logo=SampleInfo.LogoUrl。似乎大多数人都不赞成使用ViewBag,但这似乎是一个很好的选择,因为它只设置在一个位置,如果视图引用
@ViewBag.Logo
,它将能够自动从基本控制器中拉出,而无需任何额外编码。特定于特定视图的所有数据仍将通过强类型视图传递,只是徽标将从模型中删除并放置在ViewBag中

按照同样的思路,我可以将图像更改为
,直接引用静态属性,完全跳过ViewBag

跳过ViewBag并直接引用静态属性是一种好的替代方法还是一种糟糕/更糟糕的编码实践


第三种想法是将代码添加到基类或操作过滤器中,该过滤器将查找当前模型中的特定字段(例如徽标),并设置它(如果存在)。但是,我不确定这是否可以通过动态方式轻松实现?

我建议使用


您的视图已绑定到网站程序集,因此我认为从视图中直接引用此变量没有问题。

您可能需要重新检查为什么有这么多位置首先输出徽标。很可能你可以利用布局和渲染将这一职责引入到单个控制器/视图中。这并不是说它是分散在每个视图中的单个数据字段,而是有几个字段有时在整个站点中使用。大多数视图位于布局页面和多个视图引用的部分视图中。无论哪种方式,这都是一个很好的观点。谢谢,这正是我所倾向的——这似乎是保持特定信息集中的最干净的方式,而且它不必引入ViewBag中间层。我甚至会在views目录中的web.config中添加一个名称空间(这相当于在每个视图中添加一个using语句),这样我就可以将静态变量和其他常量放在名称空间中。有关详细信息,请参阅上的第二个答案。