在Razor中使用静态变量

cli*_*uke 19 c# asp.net razor asp.net-mvc-4

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

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

public static class GlobalVariables
{
    public static string SystemColor
    {
        get { return Properties.Settings.Default.SystemColor; }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

像这样

@using AppName.Models
<html>
<div ><h1 style="color:@GlobalVariables.SystemColor">System Color</h1></div>
</html>
Run Code Online (Sandbox Code Playgroud)

Ant*_*t P 16

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

@using WhateverNamespaceGlobalVariablesIsIn
Run Code Online (Sandbox Code Playgroud)

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

public ActionResult MyAction()
{
    var model = new MyViewModel();
    model.SystemColor = GlobalVariables.SystemColor;
    ...
    return View(model);
}
Run Code Online (Sandbox Code Playgroud)

视图:

@model MyViewModel

<div>
    <h1 style="color:@(Model.SystemColor)">System Color</h1>
</div>
Run Code Online (Sandbox Code Playgroud)

如果需要在布局文件中执行此操作,则可以使用RenderAction调用控制器操作并返回部分视图.然后可以键入部分MyViewModel,可以如上所述使用.

  • 如果它类似于全局颜色,如问题中所述,那么完成所有额外工作只是为了在模型中公开它有什么意义?这比使用静态更好吗? (2认同)

san*_*mar 8

你的全球课应该是这样的

public class GlobalVariables
{
    public static string SystemColor
    {
        get { return Properties.Settings.Default.SystemColor; }
    }
}
Run Code Online (Sandbox Code Playgroud)

并在页面@ AppName的 .GlobalVariables.SystemColor 应用程序的名字取代全球类的命名空间

@using AppName.Models
<html>
<div ><h1 style="color:@AppName.GlobalVariables.SystemColor">System Color</h1></div>
</html>
</p>
Run Code Online (Sandbox Code Playgroud)


Dmi*_*try 5

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

1)正如Ant P建议的那样,在视图中包含using语句.鉴于GlobalVariables该类的名称空间是AppName.GlobalVariables:

@using AppName.GlobalVariables
<html>
    <div ><h1 style="color:@GlobalVariables.SystemColor">System Color</h1></div>
</html>
Run Code Online (Sandbox Code Playgroud)

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

<div ><h1 style="color:@AppName.GlobalVariables.SystemColor">System Color</h1></div>
Run Code Online (Sandbox Code Playgroud)

3)最后,您可以将所需的命名空间添加到Views文件夹下的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>
Run Code Online (Sandbox Code Playgroud)

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