[asp.net-mvc] 면도기보기 엔진, 전 처리기 입력 방법 (#if 디버그)
오늘 첫 면도기 페이지를 작성 중입니다. 입력 방법을 알 수 없습니다 #if debug #else #endif
면도기에서 전처리기를 어떻게 입력 할 수 있습니까?
답변
방금 확장 방법을 만들었습니다.
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 기호로 컴파일되므로 작동합니다.
답변
이것은 내장되어 있습니다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
.
이 오류가 발생하면 미리 컴파일 된 뷰 또는 다른 스레드에서 뷰가 부분적으로 렌더링 / 실행 될 수있는 특별한 설정을 사용하고 있다면 의견을 알려주십시오.
답변
C # 및 ASP.NET MVC : 뷰에서 #if 지시문 사용
실제로 그 대답은 정답입니다. 모델을 통해 디버그 모드인지 여부를 전달해야합니다. 모든 뷰가 디버그 모드로 컴파일되므로 (또는 ViewBag).
답변
나는 이것이 질문에 대한 직접적인 대답은 아니라는 것을 알고 있지만 디버그 구성이 실제로 로컬에서 실행되고 있다는 사실에 필연적이라고 확신하기 때문에 항상 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 구성에 액세스하기 위해보기를 컴파일하려면 다음을 수행해야합니다.
- Visual Studio에서 프로젝트를 마우스 오른쪽 버튼으로 클릭하십시오.
- 프로젝트 언로드
- 프로젝트 편집
다음 속성을 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>
}