今日、最初のかみそりのページを書いています。入力方法がわかりません #if debug #else #endif
かみそりでプリプロセッサに入るにはどうすればよいですか?
#if debug
がカミソリで欲しいということですが、それは常に本当です。Razorは常にデバッグモードでコンパイルするため、質問の答えはそれを行う意味がないということです。
今日、最初のかみそりのページを書いています。入力方法がわかりません #if debug #else #endif
かみそりでプリプロセッサに入るにはどうすればよいですか?
#if debug
がカミソリで欲しいということですが、それは常に本当です。Razorは常にデバッグモードでコンパイルするため、質問の答えはそれを行う意味がないということです。
回答:
私は拡張メソッドを作成しました:
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シンボルでコンパイルされているため、機能します。
public static bool IsDebug(...){ return true; }
、非DEBUGモードの場合はその逆になります。
これはに組み込まれていHttpContext
ます:
@if (HttpContext.Current.IsDebuggingEnabled)
{
// Means that debug="true" in Web.config
}
IMO、これはビューの条件付きコンパイルよりも意味があり、一部のテストシナリオで役立ちます。(下のトニー・ウォールのコメントを参照。)
NullReferenceException
についてHttpContext.Current
Alex AngasはNullReferenceException
、この解決策を手に入れたと述べ、これは孤立したイベントではないかもしれないと指摘する賛成票を集めた人もいます。
私の推測では、HttpContext.Current
はに格納さCallContext
れています。つまり、これは、着信HTTPリクエストを処理するスレッドによってのみアクセス可能です。ビューが別のスレッドでレンダリングされている場合(おそらく、プリコンパイル済みビューのいくつかのソリューション?)、のnull
値を取得しますHttpContext.Current
。
このエラーが発生した場合は、コメントでお知らせください。プリコンパイル済みのビューを使用しているか、ビューが別のスレッドで部分的にレンダリング/実行される可能性のある特別な設定を使用しているかどうかをお知らせください。
System.Web
バージョン4.0.0.0)でプロジェクトを作成し、debug
属性(または実際にはcompilation
要素全体)を削除しても、例外は発生しません。次の最良の仮説は、これがSystem.Web
アセンブリの以降のバージョンで修正されたバグであるか、私が認識していない特定の状況に何か異なるものがあることです。最小限のテストプロジェクトを作成してどこかにアップロードできますか?
C#とASP.NET MVC:ビューで#ifディレクティブを使用する
実際、その答えには正しい答えがあります。モデルを介してデバッグモードであるかどうかを渡す必要があります。(またはViewBag)すべてのビューはデバッグモードでコンパイルされるため。
// your debug stuff
これが質問への直接の回答ではないことはわかっていますが、デバッグ構成が実際にローカルで実行されているという事実に当然の帰結であると確信しているため、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">
}
私の解決策は非常に愚かですが、うまくいきます。静的ファイルのどこかにグローバル定数を定義します。
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>
}
デフォルトではMVCビューはコンパイルされないため、#IF DEBUGはビューで機能しません。IF DEBUG設定にアクセスするためにビューをコンパイルする場合は、次のことを行う必要があります。
次の属性を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
}
私にとって、以下のコードは非常にうまく機能しています。
アプリケーションがデバッグ中の場合はボタンが表示されますが、リリースの場合は表示されません。
@if (this.Context.IsDebuggingEnabled)
{
<button type="button" class="btn btn-warning">Fill file</button>
<button type="button" class="btn btn-info">Export file</button>
}
これは私にとってホワイトラベルプロジェクト.net core 3.0で機能します
@{
#if CORPA
}
<button type="button" class="btn btn-warning">A Button</button>
@{
#else
}
<p>Nothing to see here</p>
@{
#endif
}