2011-11-30 86 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

不,不同之處在於我使用的是在構建時自動設置的標誌(請參閱我的答案的第一句)。 –