Использование условных символов компиляции в представлениях MVC - PullRequest
8 голосов
/ 30 ноября 2011

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

enter image description here

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

enter image description here

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

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

Ответы [ 4 ]

13 голосов
/ 03 мая 2012

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

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

2 голосов
/ 30 ноября 2011

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

1 голос
/ 30 ноября 2011

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

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

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>
    }
}
...