Jilet görünümü motoru, önişlemciye nasıl girilir (#if hata ayıklama)


234

Bugün ilk ustura sayfamı yazıyorum, nasıl girileceğini anlayamıyorum #if debug #else #endif

Ön işlemciye usturaya nasıl girebilirim?



10
#if debugDemek istediğim , jilet istiyorsun ama her zaman doğru olacak . Yani sorunuzun cevabı, Razor'un hata ayıklama modunda her zaman derleneceği için bunu yapmanın bir anlamı yok.
Buildstarted

4
@mamu bu cevabı kabul edemez ve Shawn'dan gelen cevabı kabul edebilir misin?
user247702

Yanıtlar:


370

Sadece bir uzantı yöntemi oluşturdum:

public static bool IsDebug(this HtmlHelper htmlHelper)
{
#if DEBUG
      return true;
#else
      return false;
#endif
}

Sonra benim görüşüme böyle kullanılır:

<section id="sidebar">
     @Html.Partial("_Connect")
     @if (!Html.IsDebug())
     { 
         @Html.Partial("_Ads")
     }
     <hr />
     @RenderSection("Sidebar", required: false)
</section>

Yardımcı DEBUG / RELEASE sembolü ile derlendiğinden çalışır.


32
Tabii ki bu genişletme yöntemi, farklı seçeneklerle derlenebilecek ayrı bir kütüphaneye değil, MVC projesine girmelidir ...
Eric J.

2
Bu benim için hiç işe yaramadı - derleme modundan bağımsız olarak "Doğru" üretti. Jordan Gray'in cevabı mükemmel çalıştı.
Timothy Kanski

DEBUG modu ise, ön işlemci esas olarak okuyacak public static bool IsDebug(...){ return true; }ve DEBUG olmayan mod için tersi olacaktır.
facepalm42

300

Bu yerleşikHttpContext :

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

IMO, görünümler için koşullu derlemeden daha mantıklı ve bazı test senaryoları için kullanışlı. (Aşağıdaki Tony Wall'un yorumuna bakın.)


Yan not: NullReferenceExceptioniçinHttpContext.Current

Alex AngasNullReferenceException bu çözümle birlikte olduklarını belirttiler ve birkaç kişi bunun izole bir olay olmayabileceğini belirterek iptal etti.

En iyi tahminim: HttpContext.Currentdepolanır CallContext, yani yalnızca gelen HTTP isteğini işleyen evre tarafından erişilebilir. Görüşleriniz farklı bir iş parçacığında işleniyorsa (belki de önceden derlenmiş görünümler için bazı çözümler?) Bir nulldeğer elde edersiniz HttpContext.Current.

Bu hatayı alırsanız, lütfen yorumlarda bana bildirin ve önceden derlenmiş görünümler veya görünümlerinizin başka bir iş parçacığında kısmen işlenmesine / yürütülmesine neden olabilecek özel bir ayar kullanıp kullanmadığınızı belirtin!


2
Geliştirici olmayan bilgisayarlara yüklenene kadar sık ​​karşılaşılmayan dağıtım sorunlarını teşhis etmek için entegrasyon test ortamlarında açabileceğiniz avantajı vardır.
Tony Wall

2
Muhtemelen Release modunda debug özniteliği web.config'den tamamen kaldırıldığı için bunu kullanarak bir null başvuru istisnası alıyorum.
Alex Angas

1
@AlexAngas Üreme edemezsiniz. :( .NET 4.5.1'de (ASP.NET MVC 5, System.Websürüm 4.0.0.0) bir proje oluşturdum ve hatta debugöznitelik (veya aslında tüm compilationöğe) kaldırıldığında bile bir istisna almıyorum. en iyi hipotezler bu sonraki sürümlerinde giderilmiştir bir hata olduğunu vardır System.Webfarklı bir şey ben farkında değilim o özel durum hakkında var montaj veya bir minimum test projesi oluşturmak ve bir yere yükleyin olabilir.?
Ürdün Gri

4
@JordanGray Bir göz attığınız için teşekkürler - Ben de yeni bir proje denedim ve ikisini de çoğaltamam! Çözümünüz çalışıyor. Ne yazık ki şu anda daha fazla bakmak için zaman yok ama neden rastlamak ben bu yazı güncelleyeceğim.
Alex Angas

5
Kanlı parlak dostum; bu OP'nin cevabı olmalı.
nocarrier

23

C # ve ASP.NET MVC: Bir görünümde #if yönergesini kullanma

Aslında bu cevabın doğru cevabı var. Model yoluyla hata ayıklama modunda olsanız da olmasanız da geçmeniz gerekecek. (veya ViewBag) tüm görünümler hata ayıklama modunda derlendiğinden.


27
Razor görünümleri her zaman Hata Ayıklama modunda derlendiğinden, bu şekilde bir önişlemci yönergesi ayarlamanın aslında herhangi bir etkisi olmayacağını unutmayın. Her zaman idam // your debug stuff
edeceksiniz

1
Heh, evet, bunu yazarken fark ettim.
Buildstarted

14

Bunun soruya doğrudan bir cevap olmadığını biliyorum ama hata ayıklama yapılandırmasının aslında yerel olarak yürüttüğünüzden emin olduğundan eminim, her zaman Request.IsLocalözelliği bir hata ayıklama benzeri test olarak kullanabilirsiniz . Böylece :

@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
Şart değil. Örneğin, Hazırlama / Üretimdeki Yayınlama modunda derlemeden önce bir test / geliştirme sunucusunda Hata Ayıklama modunda çalışabilirsiniz.
jonnybot

Bağlantı etiketini oluşturmak için bir html yardımcı uzantısı yöntemi bu durumda yardımcı olacaktır. Uzantı yönteminin içinde, ortama karar vermek için # if DEBUG veya bir config değişkeni kullanabilirsiniz.
sree

6

Benim çözümüm çok aptalca, ama işe yarıyor. Statik dosyada bir yerde genel bir sabit tanımlayın:

public static class AppConstants
{
#if DEBUG
        public const bool IS_DEBUG = true;
#else
        public const bool IS_DEBUG = false;
#endif
}

Ardından HTML'de Razor ile kullanın:

@if (AppConstants.IS_DEBUG)
{
    <h3>Debug mode</h3>
}
else
{
    <h3>Release mode</h3>
}

imho, o kadar aptal değil. hata ayıklamada es6-javascript kullanmak istiyorum (bu yüzden geliştirirken es6 hatalarını görüyorum) ve sürümde otomatik dönüştürülmüş olmayan es6-javascript (cuz IE11 es6 bilmiyor) kullanmak istiyorum. bu benim için harika bir çözüm.
Matthias Burger

Teşekkürler Matthias!
tedebus

güzel bir - basit doğrudan, açık
Serexx

5

Varsayılan olarak MVC görünümleri derlenmez, bu nedenle #IF DEBUG bir görünümde çalışamaz. IF DEBUG yapılandırmasına erişmek için görünümü derlemek istiyorsanız, şunları yapmanız gerekir:

  1. Visual Studio'da projenize sağ tıklayın
  2. Projeyi kaldır
  3. Projeyi düzenle

aşağıdaki özniteliği false yerine true olarak değiştir

<MvcBuildViews>true</MvcBuildViews>

projenizi yeniden yüklerseniz, görünümler derlenecektir.

Diğer tek çözüm, kodunuzda bir fonksiyona sahip olmak olacaktır.

public static Boolean DEBUG(this System.Web.Mvc.WebViewPage page)
{
   var value = false;
   #if(DEBUG)
       value=true;
   #endif
   return value;
}

ve daha sonra görünümden çağırın:

if(DEBUG())
{
  //debug code here
}
else
{
  //release code here
}

3

Benim için aşağıdaki kod çok iyi çalıştı.

Uygulama Hata Ayıklama düğmelerim görünür, Release olduğunda görünmez .

@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

Bu benim için beyaz etiket projesinde çalışıyor. 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'da, önişlemci değişkenlerini kontrol etmek yerine aşağıdakileri yapabilirsiniz:

<environment include="Development">
  <!--Debug code here-->
</environment>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.