रेजर व्यू इंजन, प्रीप्रोसेसर (# डिबग) कैसे दर्ज करें


233

मैं आज अपना पहला रेजर पेज लिख रहा हूं, यह पता नहीं लगा सकता कि कैसे प्रवेश करना है #if debug #else #endif

मैं रेजर में प्रीप्रोसेसर कैसे दर्ज कर सकता हूं?


के संभावित डुप्लिकेट stackoverflow.com/questions/378982/...
Handcraftsman

10
मेरा कहना यह है कि आप #if debugरेजर में चाहते हैं लेकिन यह हमेशा सच होगा। तो आपके प्रश्न का उत्तर यह है कि इसे करने का कोई मतलब नहीं है क्योंकि रेजर हमेशा डिबग मोड में संकलित होगा।
बिल्डस्टार्टेड

4
@ मामू क्या आप उस जवाब को अस्वीकार कर सकते हैं और शॉन से एक को स्वीकार कर सकते हैं?
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
यह मेरे लिए बिल्कुल भी काम नहीं आया-इसने संकलन मोड की परवाह किए बिना "ट्रू" का उत्पादन किया। जॉर्डन ग्रे के जवाब ने पूरी तरह से काम किया।
टिमोथी कांसकी

यदि यह डिबग मोड है, तो पूर्व-प्रोसेसर अनिवार्य रूप से पढ़ा जाएगा public static bool IsDebug(...){ return true; }, और इसके विपरीत गैर-डीबग मोड के लिए।
फेसपालम

300

इसे निम्न में बनाया गया हैHttpContext :

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

IMO, यह विचारों के लिए सशर्त संकलन की तुलना में अधिक समझ में आता है और कुछ परीक्षण परिदृश्यों के लिए काम आता है। ( नीचे देखें टोनी वॉल की टिप्पणी ।)


साइड नोट: के NullReferenceExceptionलिएHttpContext.Current

एलेक्स एंगस ने उल्लेख किया कि वे NullReferenceExceptionइस समाधान के साथ मिलते हैं, और कुछ लोगों ने संकेत दिया है कि यह एक अलग घटना नहीं हो सकती है।

मेरा सबसे अच्छा अनुमान: HttpContext.Currentमें संग्रहीत है CallContext, जिसका अर्थ है कि यह केवल उस थ्रेड द्वारा सुलभ है जो आने वाले HTTP अनुरोध को संभालता है। यदि आपके विचारों को एक अलग धागे पर प्रस्तुत किया जा रहा है (शायद precompiled विचारों के लिए कुछ समाधान?) तो आपको एक nullमूल्य मिलेगा HttpContext.Current

यदि आपको यह त्रुटि मिलती है, तो कृपया मुझे टिप्पणियों में बताएं और उल्लेख करें कि क्या आप पहले से देखे गए दृश्यों या किसी विशेष सेट का उपयोग कर रहे हैं, जिसके परिणामस्वरूप आपके विचार किसी अन्य थ्रेड पर आंशिक रूप से रेंडर / निष्पादित हो सकते हैं!


2
गैर-डेवलपर पीसी पर स्थापित होने तक अक्सर दिखाई देने वाली परिनियोजन समस्याओं का निदान करने के लिए आपको एकीकरण परीक्षण वातावरण में इसका लाभ मिल सकता है।
टोनी वॉल

2
मुझे इसका उपयोग करते हुए एक शून्य संदर्भ अपवाद मिलता है, शायद क्योंकि रिलीज़ मोड में डिबग विशेषता web.config से पूरी तरह से हटा दी जाती है।
एलेक्स एंगस

1
@AlexAngas नहीं दोहरा सकते हैं। :( मैंने .NET 4.5.1 (ASP.NET MVC 5, System.Webसंस्करण 4.0.0.0) में एक परियोजना बनाई , और यहां तक ​​कि debugविशेषता (या, वास्तव में, पूरे compilationतत्व) को हटा दिया गया, मुझे कोई अपवाद नहीं मिला। मेरा अगला सर्वोत्तम परिकल्पनाएं हैं कि यह एक बग है जो System.Webविधानसभा के बाद के संस्करणों में तय किया गया था या कि आपकी विशिष्ट स्थिति के बारे में कुछ अलग है जो मुझे नहीं पता है। क्या आप एक न्यूनतम परीक्षण परियोजना बना सकते हैं और इसे कहीं अपलोड कर सकते हैं?
जॉर्डन ग्रे

4
@JordanGray एक नज़र लेने के लिए धन्यवाद - मैंने बस एक नई परियोजना की कोशिश की और फिर भी नहीं कर सकता! आपका समाधान काम कर रहा है। दुर्भाग्य से इस समय आगे देखने का समय नहीं है, लेकिन यदि मैं इस कारण से आता हूं तो मैं इस पोस्ट को अपडेट करूंगा।
एलेक्स एंगस

5
खूनी शानदार दोस्त; यह ओपी उत्तर होना चाहिए।
नोकरईर

23

C # और ASP.NET MVC: एक दृश्य में #if निर्देश का उपयोग करना

वास्तव में उस उत्तर का सही उत्तर है। आप मॉडल के माध्यम से डिबग मोड में हैं या नहीं, आपको पास करना होगा। (या ViewBag) चूंकि सभी दृश्य डिबग मोड में संकलित हैं।


27
ध्यान दें कि क्योंकि रेजर विचारों को हमेशा डिबग मोड में संकलित किया जाता है, इस तरह से एक पूर्वप्रक्रमक निर्देशन स्थापित करने से वास्तव में कोई प्रभाव नहीं पड़ेगा। आप हमेशा निष्पादित करेंगे// your debug stuff
१४'११

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
जरुरी नहीं। आप परीक्षण / विकास सर्वर पर डिबग मोड में चल सकते हैं, उदाहरण के लिए, स्टेजिंग / प्रोडक्शन पर रिलीज़ मोड में संकलन करने से पहले।
जॉनीबॉट

लिंक टैग को रेंडर करने के लिए एक html सहायक एक्सटेंशन विधि इस मामले में मदद करेगी। विस्तार विधि के अंदर आप या तो #if DEBUG या पर्यावरण को तय करने के लिए एक कॉन्फ़िगर चर का उपयोग कर सकते हैं।
श्री

6

मेरा समाधान बहुत बेवकूफ है, लेकिन यह काम करता है। वैश्विक स्थिर स्थैतिक फ़ाइल में कहीं परिभाषित करें:

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

फिर इसे HTML में रेज़र के साथ उपयोग करें:

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

imho, यह बेवकूफी नहीं है। डीबग में मैं es6-javascript का उपयोग करना चाहता हूं (इसलिए मैं विकास करते समय es6-त्रुटियों को देखता हूं) और रिलीज में मैं ऑटो-परिवर्तित गैर-es6-javascript (cuz IE11 को es6 नहीं जानता) का उपयोग करना चाहता हूं। यह मेरे लिए एक महान समाधान है।
मथायस बर्गर

शुक्रिया माथियास!
tedebus

अच्छा एक - सरल प्रत्यक्ष, असंदिग्ध
Serexx

5

डिफ़ॉल्ट रूप से MVC दृश्य संकलित नहीं किए जाते हैं, इसलिए #IF DEBUG एक दृश्य में काम नहीं कर सकता है। यदि आप IF DEBUG कॉन्फ़िगर करने के लिए दृश्य संकलन करना चाहते हैं, तो आपको निम्न करने की आवश्यकता है:

  1. Visual Studio में अपने प्रोजेक्ट पर राइट क्लिक करें
  2. उतराई परियोजना
  3. परियोजना संपादित करें

निम्न विशेषता को असत्य से सत्य में बदलें

<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

मेरे लिए, नीचे दिए गए कोड ने बहुत अच्छा काम किया है।

जब अनुप्रयोग डीबगिंग है मेरे बटन दिखाई देते हैं, जब रिलीज़ होता है , तो वे नहीं करते हैं।

@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

यह मेरे लिए एक सफेद लेबल प्रोजेक्ट में काम करता है। नेट कोर 3.0

    @{
    #if CORPA
    }
         <button type="button" class="btn btn-warning">A Button</button>
    @{
    #else
    }
         <p>Nothing to see here</p>
    @{
    #endif
    }

2

.NET कोर में, आप प्रीप्रोसेसर चर की जाँच करने के बजाय निम्नलिखित कर सकते हैं:

<environment include="Development">
  <!--Debug code here-->
</environment>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.