Использование статических переменных в бритве

Почему невозможно использовать статическую переменную из статического класса внутри представления?

Например, скажем, у вас есть класс настроек:

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>

Ответы

Ответ 1

Насколько мне известно, вы можете получить доступ к статическим переменным изнутри представления в 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, который можно использовать, как указано выше.

Ответ 2

ваш глобальный класс должен выглядеть как

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>

Ответ 3

Вы можете получить доступ к статическим переменным в представлении. Существует три способа сделать это:

1) Как предлагает Ant P, используйте инструкцию в представлении. Учитывая, что пространство имен класса 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 и обеспечивает разделение проблем и всей этой доброты. Но, по-моему, в некоторых случаях "придерживаться шаблона" доходит до уровня абсурда. В вашем случае я бы просто получил доступ к этой переменной из представления.