오늘 첫 면도기 페이지를 작성 중입니다. 입력 방법을 알 수 없습니다 #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 AngasNullReferenceException
는이 솔루션 을 사용한다고 언급 했으며 일부 사람들은 이것이 격리 된 이벤트가 아닐 수도 있음을 지적했습니다.
내 최선의 추측 : 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
}
나를 위해, 아래 코드는 매우 잘 작동했습니다.
응용 프로그램이 디버깅 중일 때 Release 가 표시되면 표시 되지 않습니다.
@if (this.Context.IsDebuggingEnabled)
{
<button type="button" class="btn btn-warning">Fill file</button>
<button type="button" class="btn btn-info">Export file</button>
}