在 Razor 中使用静态变量

本文关键字:静态 变量 Razor | 更新日期: 2023-09-27 18:19:48

为什么不能在视图中使用静态类中的静态变量?

例如,假设您有一个设置类:

public static class GlobalVariables
{
    public static string SystemColor
    {
        get { return Properties.Settings.Default.SystemColor; }
    }
}

为什么你不能在视图中调用它?

这样

@using AppName.Models
<html>
<div ><h1 style="color:@GlobalVariables.SystemColor">System Color</h1></div>
</html>

在 Razor 中使用静态变量

据我所知,如果您将类的命名空间包含在适当的 using 语句中,您可以从 MVC ASP.NET 视图中的视图内部访问静态变量:

@using WhateverNamespaceGlobalVariablesIsIn

更重要的是,无论如何,您都不应该直接从视图访问静态变量。为了与 MVC 模式保持一致,视图的所有数据都应该可以在视图模型中访问:

public ActionResult MyAction()
{
    var model = new MyViewModel();
    model.SystemColor = GlobalVariables.SystemColor;
    ...
    return View(model);
}

视图:

@model MyViewModel
<div>
    <h1 style="color:@(Model.SystemColor)">System Color</h1>
</div>

如果需要在布局文件中执行此操作,可以使用 RenderAction 调用控制器操作并改为返回分部视图。然后可以将部分键入为 MyViewModel ,可以按上述方式使用。

你的全局类应该是这样的

public class GlobalVariables
{
    public static string SystemColor
    {
        get { return Properties.Settings.Default.SystemColor; }
    }
}

并在页面 @AppName 中。GlobalVariables.SystemColor appname 替换为全局类的命名空间

@using AppName.Models
<html>
<div ><h1 style="color:@AppName.GlobalVariables.SystemColor">System Color</h1></div>
</html>
</p>

您可以在视图中访问静态变量。有三种方法可以做到这一点:

1( 正如 Ant P 所建议的,在视图中包含 using 语句。给定 GlobalVariables 类的命名空间为 AppName.GlobalVariables

@using AppName.GlobalVariables
<html>
    <div ><h1 style="color:@GlobalVariables.SystemColor">System Color</h1></div>
</html>

2(另一种方法是直接在要访问变量的行中使用命名空间:

<div ><h1 style="color:@AppName.GlobalVariables.SystemColor">System Color</h1></div>

3(最后,您可以将所需的命名空间添加到视图文件夹下的web.config文件中:

<system.web.webPages.razor>
  <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
  <pages pageBaseType="System.Web.Mvc.WebViewPage">
    <namespaces>
      <add namespace="System.Web.Mvc" />
      <add namespace="System.Web.Mvc.Ajax" />
      <add namespace="System.Web.Mvc.Html" />
      <add namespace="System.Web.Routing" />
      <add namespace="System.Web.Optimization" />
      <add namespace="AppName.GlobalVariables" />
    </namespaces>
  </pages>
</system.web.webPages.razor>

至于将变量粘贴到模型中并从那里传递给视图......事实上,它符合MVC模式,并确保关注点和所有好处的分离。但在我看来,在某些情况下,"坚持模式"被带到了荒谬的程度。在您的情况下,我只会从视图中访问此变量。