2011-11-30 33 views
8

在我的项目的“属性”使用条件编译符号我有以下几点:在MVC意见

enter image description here

我要检查,如果TEST符号存在,也只有这样,做一些事情。 所以我做了你在下面的图片和课堂上看到的作品。但是这在视图中不起作用。

enter image description here

在此块中的文字是灰色的,即使TEST定义!

如果TEST被定义,我该如何使它工作?

回答

10

问题是相关的事实,观点只在编译时您运行应用程序,因此您定义的TEST符号不再由编译器应用,因为它不知道它。

假设你使用的是C#,你需要配置编译器使用TEST标志性建筑的看法时,为此您使用需要override its configurationWeb.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 transformations,这样符号只适用于正确的构建配置。

+0

是的,现在文本不是“灰色” - 但它可以或者如果我删除“测试”或不...“ – ParPar

+0

你需要同步'TEST'的两个定义。如果从项目属性中删除它,则还需要将其从配置中删除。 –

+0

我明白了,非常感谢! – ParPar

2

您设置的符号仅在编译期间使用。否则不存在。所以,你的web项目的DLL确实有而不是有这个符号。因此,编译View时。该符号不存在,并且不会像您所期望的那样工作。

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> 
    } 
} 
+0

我必须这样做只是在视图模型? – ParPar

+0

@ParPar:您必须在视图模型中进行检查(可以使用编译符号),然后设置视图模型标志。在上面的答案中,我在视图模型构造函数中设置了这个标志。该标志可以在传递给模型后进行测试。 – Dangerous

9

而不是在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> 
} 
+0

这与Dangerous建议的效果不一样吗? –

+0

不,不同之处在于我使用的是在构建时自动设置的标志(请参阅我的答案的第一句)。 –