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

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

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

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

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

4 ответа

Решение

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

Предполагая, что вы используете C#, вам нужно настроить компилятор для использования 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, чтобы символ применялся только для правильных конфигураций сборки.

Вместо того, чтобы указывать флаг компилятора в 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>
}

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

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

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

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>
    }
}
Другие вопросы по тегам