Использование условных символов компиляции в представлениях MVC

В "Свойствах" моего проекта у меня есть следующее:

enter image description here

Я хочу проверить, существует ли символ TEST, и только потом делать некоторые вещи. Поэтому я сделал то, что вы видите на картинке ниже, и в классе, в котором он работает. Однако это не работает в представлениях.

enter image description here

Текст в этом блоке серый, даже если TEST определен!

Как я могу заставить его работать, если TEST определен?

Ответ 1

Проблема связана с тем, что представления компилируются только при запуске приложения, поэтому указанный TEST символ больше не применяется компилятором, потому что он не знает об этом.

Предполагая, что вы используете С#, вам нужно настроить компилятор для использования символа TEST при создании представлений, и для этого вам нужно переопределить его конфигурацию в Web.config, используя следующее:

<system.codedom>
  <compilers>
    <compiler
      language="c#;cs;csharp"
      extension=".cs"
      type="Microsoft.CSharp.CSharpCodeProvider, System, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
      compilerOptions="/define:TEST"
      warningLevel="1" />
  </compilers>
</system.codedom>

Важная часть состоит в том, что вы определяете compilerOptions="/define:TEST". В остальной части конфигурации вам необходимо адаптироваться к вашим конкретным потребностям, например, переключиться между .NET 2.0 или .NET 4.0.

Если вы примените его непосредственно в Web.config, он будет работать, но будет определять TEST каждый раз. Так что вы действительно должны использовать преобразования Web.config, чтобы символ использовался только для правильных конфигураций сборки.

Ответ 2

Вместо того, чтобы указывать флаг компилятора в web.config в соответствии с принятым ответом (который также требует указания версии компилятора в web.config, который является нестандартным местоположением), я пошел со следующим:

Добавить метод в базовый класс, совместно используемый моими моделями

public bool IsDebugBuild 
{ 
    get
    {
        #if DEBUG
        return true;
        #else
        return false;
        #endif
    }
}

Используйте этот метод в моих представлениях

if (mm.IsDebugBuild) {
    <div class="debug">
    // Do Stuff
    </div>
}

Ответ 3

Установленный вами символ используется только во время компиляции. В противном случае этого не существует. Таким образом, у вашего веб-проекта DLL нет этого символа вообще. Поэтому, когда View компилируется. символ не существует, и он не будет работать так, как вы ожидаете.

Ответ 4

Я не думаю, что его можно использовать условные символы в представлении, как уже сказал Эндрю Барбер.

Но вы можете использовать условные символы в модели:

public class ViewModel
{
//...whatever else you need to define

    private bool test;

    public bool Test
    {
        get
        {
            return test;
        }
    }

    public ViewModel()
    {
        #if (TEST)
            test = true;
        #endif
    }
}

И затем проверьте значение в представлении:

@{
    if (Model.Test)
    {
        <p>debug statements here</p>
    }
}