2011-11-30 9 views
8

を条件付きコンパイルシンボルを使用:私は、次のしているMVCのビューに私のプロジェクトの「プロパティ」で

enter image description here

を私はTESTシンボルが存在するかどうかを確認したい、とだけにして、いくつかのことを行います。 私はあなたが下の図とそれが働くクラスで見たことをしました。しかし、これはビューでは機能しません。

enter image description here

このブロック内のテキストはTESTが定義されている場合でも、グレーです!

TESTが定義されている場合、どうすれば動作させることができますか?

答えて

10

問題は景色だけコンパイルされているという事実に関係していますアプリケーションを実行して、定義したTESTシンボルが認識されないため、コンパイラによって適用されなくなります。

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

重要な部分があることである:あなたはビューを構築するときTEST記号を使用するようにコンパイラを設定する必要があり、このためにあなたは、以下のものを使用してWeb.configoverride its configurationに必要なC#を使用していると仮定すると

compilerOptions="/define:TEST"を定義します。残りの設定は、特定のニーズに合わせて調整する必要があります(たとえば、.NET 2.0または.NET 4.0の切り替えなど)。

あなたはWeb.configで直接これを適用した場合、それは動作しますが、TESTたびに定義します。実際に行うべきことは、Web.config transformationsを使用することです。そのため、シンボルは正しいビルド構成にのみ適用されます。

+0

はい、テキストは "グレー"ではありませんが、 "テスト"を削除した場合でも動作します... – ParPar

+0

'TEST'の両方の定義を同期させる必要があります。プロジェクトのプロパティから削除する場合は、設定から削除する必要があります。 –

+0

私は理解しています、ありがとう! – ParPar

2

設定したシンボルは、コンパイル時にのみ使用されます。それ以外の場合は存在しません。だから、あなたのウェブプロジェクトのDLLはではありません。にはそのシンボルがありません。したがって、ビューがコンパイルされるとき。シンボルはそこにはなく、あなたが期待しているとおりに動作しません。

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

私はViewModelににそれをしなければならないでください、私の見解では、そのメソッドを使用しますか? – ParPar

+0

@ ParPar:ビューモデル(コンパイルシンボルが使用できる)でチェックを行い、ビューモデルフラグを設定する必要があります。上の答えでは、私はビューモデルのコンストラクタでこのフラグを設定しました。そのフラグは、モデルに渡された後にテストすることができます。 – Dangerous

9

ではなく(非標準の場所でもweb.configファイルでコンパイラのバージョンを指定する必要があり、)受け入れ答え通りのweb.configでコンパイラフラグを指定Iは、以下で行った:

私のモデル

public bool IsDebugBuild 
{ 
    get 
    { 
     #if DEBUG 
     return true; 
     #else 
     return false; 
     #endif 
    } 
} 

で共有する基本クラスにメソッドを追加します

if (mm.IsDebugBuild) { 
    <div class="debug"> 
    // Do Stuff 
    </div> 
} 
+0

これはDangerousが提案したものと事実上同じではありませんか? –

+0

いいえ、違いは、ビルド時に自動的に設定されるフラグを使用していることです(私の答えの最初の文を参照)。 –

関連する問題