면도기보기 엔진, 전 처리기 입력 방법 (#if 디버그)


233

오늘 첫 면도기 페이지를 작성 중입니다. 입력 방법을 알 수 없습니다 #if debug #else #endif

면도기에서 전처리기를 어떻게 입력 할 수 있습니까?



10
내 요점은 당신이 #if debug면도기를 원하지만 항상 사실이라는 것입니다. 따라서 귀하의 질문에 대한 답변은 Razor가 항상 디버그 모드에서 컴파일하므로 그렇게 할 필요가 없다는 것입니다.
빌드는

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"를 생성했습니다. Jordan Gray의 답변은 완벽하게 작동했습니다.
Timothy Kanski

이것이 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
릴리스 모드에서는 디버그 속성이 web.config에서 완전히 제거되기 때문에 이것을 사용하여 null 참조 예외가 발생합니다.
Alex Angas

1
@AlexAngas 재현 할 수 없습니다. :( .NET 4.5.1 (ASP.NET MVC 5, System.Web버전 4.0.0.0) 에서 프로젝트를 만들었 으며 debug속성 (또는 전체 compilation요소)이 제거 된 경우에도 예외가 발생하지 않습니다. 최상의 가설은 이것이 이후 버전의 System.Web어셈블리 에서 수정 된 버그 이거나 내가 모르는 특정 상황과는 다른 문제라는 것입니다. 최소의 테스트 프로젝트를 만들어서 어딘가에 업로드 할 수 있습니까?
Jordan Gray

4
@JordanGray 살펴보기 주셔서 감사합니다-방금 새 프로젝트를 시도했지만 재현 할 수 없습니다! 솔루션이 작동 중입니다. 불행히도 지금 당장 더 살펴볼 시간이 없지만 이유를 발견하면이 게시물을 업데이트 할 것입니다.
Alex Angas

5
피의 찬란한 친구; 이것은 OP 답변이어야합니다.
nocarrier

23

C # 및 ASP.NET MVC : 뷰에서 #if 지시문 사용

실제로 그 대답은 정답입니다. 모델을 통해 디버그 모드인지 여부를 전달해야합니다. 모든 뷰가 디버그 모드로 컴파일되므로 (또는 ViewBag).


27
Razor 뷰는 항상 디버그 모드에서 컴파일되므로 이러한 방식으로 전 처리기 지시문을 설정하면 실제로 아무런 영향을 미치지 않습니다. 항상 실행합니다// your debug stuff
marcind

1
네, 글을 썼을 때 깨달았습니다.
빌드 시작

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 또는 구성 변수를 사용하여 환경을 결정할 수 있습니다.
sree

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를 사용하고 싶습니다 (cuz IE11은 es6을 모릅니다). 이것은 나에게 훌륭한 솔루션입니다.
Matthias Burger

마티아스 감사합니다!
tedebus

좋은 하나-간단한 직접, 모호하지 않은
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

나를 위해, 아래 코드는 매우 잘 작동했습니다.

응용 프로그램이 디버깅 중일 때 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>
} 

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.