在MVC视图中使用条件编译符号

时间:2011-11-30 11:08:49

标签: asp.net-mvc-3 views conditional-compilation

在我的项目的“属性”中,我有以下内容:

enter image description here

我想检查是否存在TEST符号,然后才做一些事情。 所以我做了你在下面的图片和它所在的课程中所看到的。但是这在视图中不起作用。

enter image description here

即使定义了TEST,此块中的文本也是灰色的!

如果定义了TEST,我该如何使其工作?

4 个答案:

答案 0 :(得分:13)

不是根据接受的答案在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>
}

答案 1 :(得分:10)

问题与以下事实有关:只有在运行应用程序时才编译视图,因此编译器不再应用您定义的TEST符号,因为它不了解它。

假设您正在使用C#,您需要将编译器配置为在构建视图时使用TEST符号,为此,您需要Web.config中的override its configuration使用以下内容:< / p>

<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 transformations,这样符号才会应用于正确的构建配置。

答案 2 :(得分:2)

您设置的符号仅在编译期间使用。否则就不存在了。因此,您的Web项目的DLL 根本没有该符号。因此,编译View时。符号不存在,它不会像你期望的那样起作用。

答案 3 :(得分:1)

我不认为可以在视图中使用条件符号,正如Andrew Barber已经说过的那样。

但你可以在模型中使用条件符号:

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>
    }
}
相关问题