web-dev-qa-db-ja.com

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

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

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

220
mamu

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

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シンボルでコンパイルされているため、機能します。

358

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

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

IMO、これはビューの条件付きコンパイルよりも意味があり、一部のテストシナリオに役立ちます。 ( コードチーフのコメント を参照してください。)


サイドノート:NullReferenceException for HttpContext.Current

Alex Angasが述べた このソリューションでNullReferenceExceptionを取得し、少数の人々がこれが孤立したイベントではないかもしれないことを示すことに賛成しています。

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

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

285
Jordan Gray

C#およびASP.NET MVC:ビューで#ifディレクティブを使用

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

23
Buildstarted

これは質問に対する直接的な答えではないことはわかっていますが、デバッグ設定は実際にローカルで実行しているという事実と当然の結果であるため、テストのようなデバッグとしていつでもRequest.IsLocalプロパティを使用できます。副<文>この[前述の事実の]結果として、それ故に、従って、だから◆【同】consequently; therefore <文>このような方法で、このようにして、こんなふうに、上に述べたように◆【同】in this manner <文>そのような程度まで<文> AひいてはB◆【用法】A and thus B <文>例えば◆【同】for example; as an example :

@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">
}
14
Simon Budin

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

  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
}
5
Yannick Richard

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

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

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

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

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>
}
1
tedebus