2010-06-01 16 views
44

Visual Studio'daki projemin özelliklerinde belirttiğim "RELEASE" adlı bir koşullu derleme sembolüm var. Belirli bir CSS'nin RELEASE sembolü tanımlandığında elemanlara uygulanmasını istiyorum ve bunu görüntüden yapmaya çalışıyorum, ancak çalışmıyor gibi görünüyor. Bu kod ileC# ve ASP.NET MVC: Bir görünümde #if yönergesini kullanma

<% #if (RELEASE) %> 
    <div class="releaseBanner">Banner text here</div> 
<% #else %> 
    <div class="debugBanner">Banner text here</div> 
<% #endif %> 

ve RELEASE sembol seti ile, 'başka' kod çalıştıran ve ben bir alıyorum:

Bence kodu (demo amaçlı biraz kısaltılmış) şöyle debugBanner sınıfı ile div. Dolayısıyla, RELEASE'un tanımlandığını düşünmüyor. .cs dosyalarındaki gerçek C# kodumun RELEASE değerini tanıması ve doğru kodu çalıştırması dikkat çekicidir. Sadece bana problemi veren görüş.

Bu konuda herhangi bir bilgisi var mı? Herhangi bir yardım takdir edilecektir. Teşekkürler.

Açıklama: Bu görüntünün zaten kısmi bir görünüm olduğunu ve yalnızca ihtiyacım olan sayfalarda oluşturduğumu belirtmeliydim. Çünkü bu afişler başka sayfalarda değil, belirli sayfalarda olacak. yoluyla kısmi görünüşü onu işlerken Yani bile:

Html.RenderPartial("BannerView");

işe yaramıyor. Size göre

bool isRelease = false; 

<% #if (RELEASE) %> 
    isRelease = true; 
<% #endif %> 

: senin modelde

+3

Neden bir html yardımcı yöntemi oluşturmuyorsunuz ve kodunuzu oraya koymuyorsunuz? Daha sonra HTML – Rippo

+0

öğesini saklamak için kısmi işlem yapabilir ve kısmi olarak yapabilirsiniz. Html helper yöntemlerine aşina değildir. Sorunun, bununla çalıştığım kısmi bir görünüm olduğunu belirtmek için açıklığa kavuştum. Öneriniz hakkında biraz bilgi verebilir misiniz? –

+1

önişlemci yönergeleri sadece çalışma @ derleme zamanı ... @DeveloperArt'ın zarif bir çözümü vardır ... – xandercoded

cevap

17

Görüntüleme

HttpContext.Current.IsDebuggingEnabled 

, kurtarır hangi:

<% if (Model.isRelease) { %> 
    <div class="releaseBanner">Banner text here</div> 
<% } else { %> 
    <div class="debugBanner">Banner text here</div> 
<% } %> 
+0

Bu yanıttan derleme sembollerini bir görünümden kontrol edemediğinizi ve bunun bir .cs dosyasından yapılması gerektiğini düşünüyorum. Bu doğru mu? –

+0

Güzel bir çözüm, ancak bu mantığı tüm Denetleyicilerin devraldığı bir temel denetleyiciye yerleştirmek. Daha sonra tüm kontrolörler aracılığıyla bu mülke erişebilirsiniz ... – xandercoded

+1

, tamamen xander çalışacak emin değilim. Bu görünümden ona erişebilmek için, o mülkle bir Modele, o mülke sahip bir Denetçiye değil, bir Modele ihtiyacımız olacaktır. Bu yüzden, aynı Modeli birden çok kontrolörden geçmek ve bu görüşü oluşturmak zorunda kalacağım, ki bu bir çeşit acı olacaktır. –

104

Geçenlerde test basitçe keşfetti uygulamanızın diğer bölümlerindeki sembolleri kontrol etme.

+1

Bu en iyi yaklaşım IMO'dur. –

+2

Bunun yerine 'this.Context.IsDebuggingEnabled' kullanmanız gerekmiyor mu? Gerçekten sadece bağlamla alay ettiysen veya bir şekilde [bir tıraş makinesinin dışındaki jilet görüşlerini kullandıysanız] uygulanabilir (http://stackoverflow.com/questions/3628895/is-it-possible-to-use-razor-view-engine- out-asp-net) – drzaus

-7

Koşullu derleyici yönergeleri için Razor sözdizimi aşağıdadır. DEBUG değişkeni VS profilinde veya web.config ayarlandığında jQuery'nin geliştirici sürümünü yükler. Aksi takdirde min versiyonu yüklenir.Herhangi görünüm (jilet sözdizimi) 'de şöyle böyle

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

Daha sonra kullanabilirsiniz:

@{#if (DEBUG) 
    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.6/jquery.js"></script> 
    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.12/jquery-ui.js"></script> 

#else 
    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.6/jquery.min.js"></script> 
    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.12/jquery-ui.min.js"></script> 
#endif 
} 
+1

bu görüşlerin derlenmediğinden ve (DEBUG) derleyici bir direktif olduğundan işe yaramaz mı? – Tom

+1

Bu, Razor'da çalışmaz. Tam olarak asıl soru budur. – trailmax

57

Daha iyi, daha genel bir çözüm nedenle tüm görünümler bu bilgilere erişimi olan, bir uzatma yöntemi kullanmaktır:

@if(Html.IsReleaseBuild()) 
... 
+1

Bu harika bir yöntem! paylaşım için teşekkürler! – trailmax

+1

elbette, bu yöntemin nerede olduğuna bağlı olarak - bu, serbest bırakma modunda derlenmiş bir paylaşılan kütüphanede bulunuyorsa, hata ayıklama modunda derlenmiş bir projeye dahil edildiğinde "false" i döndürecektir. – drzaus

+0

Lütfen bu soruyu kontrol edin http://stackoverflow.com/questions/28400135/public-conditional-razor-views-with-minified-js-and-css – chemitaxis

9
@if (HttpContext.Current.IsDebuggingEnabled) 
{ 
    // Debug mode enabled. Your code here. Texts enclosed with <text> tag 
} 
3

yerine ViewModel arasında ViewBag kullanabilirsiniz (ancak ViewModel benzeri yaklaşım iyidir):

Denetleyici:

controller code

Görünüm:

@{ 
    bool hideYoutubeVideos = ViewBag.hideYoutubeVideos ?? false;  
} 

Kullanımı:

@if (!hideYoutubeVideos) 
{ 
    <span>hello youtube</span> 
} 

Ayrıca NIKITA_DEBUG değişken projenizin inşa sekmede var olduğunu, emin olun:

build tab

1

Benim için aşağıdaki kod çok iyi çalıştı. Uygulama Hata ayıklama olduğunda düğmelerim görünür, Yayınlama ne zaman yapılmaz.

@if (this.Context.IsDebuggingEnabled) 
{ 
    <button type="button" class="btn btn-warning">Fill file</button> 
    <button type="button" class="btn btn-info">Export file</button> 
}