Razorビューエンジン、プリプロセッサへの入り方(#if debug)


234

今日、最初のかみそりのページを書いています。入力方法がわかりません #if debug #else #endif

かみそりでプリプロセッサに入るにはどうすればよいですか?



10
私のポイントは、あなた#if debugがカミソリで欲しいということですが、それは常に本当です。Razorは常にデバッグモードでコンパイルするため、質問の答えはそれを行う意味がないということです。
ビルドは'18年

4
@mamuその答えを受け入れずに、Shawnからの答えを受け入れることができますか?
user247702

回答:


370

私は拡張メソッドを作成しました:

public static bool IsDebug(this HtmlHelper htmlHelper)
{
#if DEBUG
      return true;
#else
      return false;
#endif
}

それから私のビューでそれを次のように使用しました:

<section id="sidebar">
     @Html.Partial("_Connect")
     @if (!Html.IsDebug())
     { 
         @Html.Partial("_Ads")
     }
     <hr />
     @RenderSection("Sidebar", required: false)
</section>

ヘルパーはDEBUG / RELEASEシンボルでコンパイルされているため、機能します。


32
もちろん、この拡張メソッドは、さまざまなオプションでコンパイルされる可能性のある個別のライブラリではなく、MVCプロジェクトに移動する必要があります...
Eric J.

2
これは私にはまったく効果がありませんでした。コンパイルモードに関係なく、 "True"が生成されました。ジョーダン・グレイの答えは完璧に機能しました。
Timothy Kanski、2017

DEBUGモードの場合、プリプロセッサは本質的にを読み取りpublic static bool IsDebug(...){ return true; }、非DEBUGモードの場合はその逆になります。
facepalm42

300

これはに組み込まれていHttpContextます:

@if (HttpContext.Current.IsDebuggingEnabled)
{
    // Means that debug="true" in Web.config
}

IMO、これはビューの条件付きコンパイルよりも意味があり、一部のテストシナリオで役立ちます。(下のトニー・ウォールのコメントを参照。)


サイドノート:NullReferenceExceptionについてHttpContext.Current

Alex AngasNullReferenceException、この解決策を手に入れたと述べ、これは孤立したイベントではないかもしれないと指摘する賛成票を集めた人もいます。

私の推測では、HttpContext.Currentはに格納さCallContextれています。つまり、これは、着信HTTPリクエストを処理するスレッドによってのみアクセス可能です。ビューが別のスレッドでレンダリングされている場合(おそらく、プリコンパイル済みビューのいくつかのソリューション?)、のnull値を取得しますHttpContext.Current

このエラーが発生した場合は、コメントでお知らせください。プリコンパイル済みのビューを使用しているか、ビューが別のスレッドで部分的にレンダリング/実行される可能性のある特別な設定を使用しているかどうかをお知らせください。


2
統合テスト環境でオンにして、開発者以外のPCにインストールするまで見られないことが多い展開の問題を診断できるという利点があります。
Tony Wall

2
これを使用してnull参照例外が発生します。これは、おそらくリリースモードでは、デバッグ属性がweb.configから完全に削除されているためです。
Alex Angas 14

1
@AlexAngas再現できません。:(私は.NET 4.5.1(ASP.NET MVC 5、System.Webバージョン4.0.0.0)でプロジェクトを作成し、debug属性(または実際にはcompilation要素全体)を削除しても、例外は発生しません。次の最良の仮説は、これがSystem.Webアセンブリの以降のバージョンで修正されたバグであるか、私が認識していない特定の状況に何か異なるものがあることです。最小限のテストプロジェクトを作成してどこかにアップロードできますか?
ジョーダングレイ

4
@JordanGray見てくれてありがとう-私も新しいプロジェクトを試しましたが、再現もできません!ソリューションは機能しています。残念ながら現時点でこれ以上詳しく説明する時間はありませんが、理由がわかればこの投稿を更新します。
Alex Angas

5
血まみれの華麗な仲間; これがOPの答えになるはずです。
nocarrier 2014

23

C#とASP.NET MVC:ビューで#ifディレクティブを使用する

実際、その答えには正しい答えがあります。モデルを介してデバッグモードであるかどうかを渡す必要があります。(またはViewBag)すべてのビューはデバッグモードでコンパイルされるため。


27
Razorビューは常にデバッグモードでコンパイルされるため、このようにプリプロセッサディレクティブを設定しても実際には効果がないことに注意してください。あなたは常に実行します// your debug stuff
marcind

1
ええ、ええ、私はそれを書いたときに気づきました。
ビルドは、2011年

14

これが質問への直接の回答ではないことはわかっていますが、デバッグ構成が実際にローカルで実行されているという事実に当然の帰結であると確信しているため、Request.IsLocalテストのようなデバッグとしていつでもプロパティを使用できます。したがって:

@if (Request.IsLocal)
{
    <link rel="stylesheet" type="text/css" href="~/css/compiled/complete.css">
}
else
{
    <link rel="stylesheet" type="text/css" href="~/css/compiled/complete.min.css">
}

1
必ずしも。たとえば、ステージング/本番環境でリリースモードでコンパイルする前に、テスト/開発サーバーでデバッグモードで実行する場合があります。
jonnybot

この場合、リンクタグをレンダリングするhtmlヘルパー拡張メソッドが役立ちます。拡張メソッド内では、#if DEBUGまたは構成変数を使用して環境を決定できます。
2016年

6

私の解決策は非常に愚かですが、うまくいきます。静的ファイルのどこかにグローバル定数を定義します。

public static class AppConstants
{
#if DEBUG
        public const bool IS_DEBUG = true;
#else
        public const bool IS_DEBUG = false;
#endif
}

次に、HTMLのRazorで使用します。

@if (AppConstants.IS_DEBUG)
{
    <h3>Debug mode</h3>
}
else
{
    <h3>Release mode</h3>
}

私見、それは馬鹿ではありません。デバッグではes6-javascriptを使用したいので(開発中にes6-errorsが表示されます)、リリースでは自動変換された非es6-javascriptを使用します(IE 11はes6を認識していません)。これは私にとって素晴らしい解決策です。
Matthias Burger

マティアスありがとう!
テデバス

素敵なもの-シンプルで直接的、明確
Serexx

5

デフォルトではMVCビューはコンパイルされないため、#IF DEBUGはビューで機能しません。IF DEBUG設定にアクセスするためにビューをコンパイルする場合は、次のことを行う必要があります。

  1. Visual Studioでプロジェクトを右クリックします。
  2. プロジェクトをアンロード
  3. プロジェクトを編集

次の属性をfalseからtrueに変更します

<MvcBuildViews>true</MvcBuildViews>

プロジェクトをリロードすると、ビューがコンパイルされます。

他の唯一の回避策は、コード内に関数を含めることです

public static Boolean DEBUG(this System.Web.Mvc.WebViewPage page)
{
   var value = false;
   #if(DEBUG)
       value=true;
   #endif
   return value;
}

そして、それをビューから呼び出します:

if(DEBUG())
{
  //debug code here
}
else
{
  //release code here
}

3

私にとって、以下のコードは非常にうまく機能しています。

アプリケーションがデバッグ中の場合はボタンが表示されますが、リリースの場合は表示されません。

@if (this.Context.IsDebuggingEnabled)
{
    <button type="button" class="btn btn-warning">Fill file</button>
    <button type="button" class="btn btn-info">Export file</button>
} 

3

これは私にとってホワイトラベルプロジェクト.net core 3.0で機能します

    @{
    #if CORPA
    }
         <button type="button" class="btn btn-warning">A Button</button>
    @{
    #else
    }
         <p>Nothing to see here</p>
    @{
    #endif
    }

2

.NET Coreでは、プリプロセッサ変数をチェックする代わりに、次のことを実行できます。

<environment include="Development">
  <!--Debug code here-->
</environment>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.