Использование статических переменных в бритве
Почему невозможно использовать статическую переменную из статического класса внутри представления?
Например, скажем, у вас есть класс настроек:
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 и обеспечивает разделение проблем и всей этой доброты. Но, по-моему, в некоторых случаях "придерживаться шаблона" доходит до уровня абсурда. В вашем случае я бы просто получил доступ к этой переменной из представления.