23

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

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

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>
4

3 回答 3

18

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

@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,可以如上所述使用。

于 2013-06-24T09:14:40.137 回答
12

你的全球班级应该像

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>
于 2013-06-24T09:29:56.657 回答
5

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

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) 最后,您可以在 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>

至于将变量粘贴在模型中并将其从那里传递给视图......确实它符合 MVC 模式并确保关注点分离和所有这些优点。但在我看来,在某些情况下,“坚持模式”被认为是荒谬的。在您的情况下,我只需从视图中访问此变量。

于 2013-06-24T09:42:49.890 回答