রেজার ভিউ ইঞ্জিন, কীভাবে প্রিপ্রোসেসর প্রবেশ করতে হবে (# ডিবাগ)


233

আমি আজ আমার প্রথম রেজার পৃষ্ঠাটি লিখছি, কীভাবে প্রবেশ করবেন তা অনুভব করতে পারছি না #if debug #else #endif

আমি রেজারে প্রিপ্রোসেসরটি কীভাবে প্রবেশ করতে পারি?



10
আমার #if debugবক্তব্যটি আপনি রেজারে চান তবে এটি সর্বদা সত্য হবে। সুতরাং আপনার প্রশ্নের উত্তর হ'ল রেজারটি সর্বদা ডিবাগ মোডে সংকলন করবে বলে এটি করার কোনও অর্থ নেই।
বিল্ডস্টার্ড

4
@ মামু আপনি কি এই উত্তরটি মেনে নিতে এবং শন-এর উত্তর গ্রহণ করতে পারেন?
ব্যবহারকারী 247702

উত্তর:


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
অবশ্যই এই এক্সটেনশন পদ্ধতিটি এমভিসি প্রকল্পে যেতে হবে, কোনও পৃথক লাইব্রেরিতে নয় যা বিভিন্ন বিকল্পের সাথে সংকলিত হতে পারে ...
এরিক জে।

2
এটি আমার পক্ষে মোটেও কার্যকর হয়নি - সংকলন মোড নির্বিশেষে এটি "সত্য" উত্পাদন করেছে। জর্ডান গ্রে এর উত্তর পুরোপুরি কার্যকর হয়েছিল।
টিমোথি কানস্কি

যদি এটি ডিইবিইউজি মোড হয় তবে প্রাক-প্রসেসরটি মূলত পড়তে হবে public static bool IsDebug(...){ return true; }এবং বিপরীতে ডিইবিইউজি মোড।
ফেসপাম 42

300

এটি এতে অন্তর্নির্মিতHttpContext :

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

আইএমও, এটি দর্শনগুলির জন্য শর্তসাপেক্ষ সংকলনের চেয়ে আরও বোধগম্য এবং কিছু পরীক্ষার পরিস্থিতিতে কার্যকর হয় hand ( নীচে টনি ওয়াল এর মন্তব্য দেখুন।)


পার্শ্ব নোট: NullReferenceExceptionজন্যHttpContext.Current

অ্যালেক্স আঙ্গাস উল্লেখ করেছিলেন যে তারা NullReferenceExceptionএই সমাধানটি দিয়ে একটি পেয়েছেন, এবং কয়েক জন লোক এটিকে বোঝায় যে এটি কোনও বিচ্ছিন্ন ঘটনা নয়।

আমার সর্বোত্তম অনুমান: এতে HttpContext.Currentসঞ্চিত রয়েছে CallContext, এটি কেবল আগত এইচটিটিপি অনুরোধটি পরিচালনা করে এমন থ্রেড দ্বারা অ্যাক্সেসযোগ্য। যদি আপনার মতামতগুলি অন্য কোনও থ্রেডে রেন্ডার করা হয় (সম্ভবত পূর্বনির্ধারিত দর্শনের জন্য কিছু সমাধান?) আপনি এর nullজন্য একটি মান পাবেন HttpContext.Current

আপনি যদি এই ত্রুটিটি পান তবে দয়া করে আমাকে মন্তব্যগুলিতে জানান এবং উল্লেখ করুন যে আপনি যদি পূর্বনির্ধারিত ভিউ বা বিশেষ কোনও সেট আপ ব্যবহার করছেন যা আপনার দৃষ্টিকোণকে অন্য থ্রেডে আংশিকভাবে রেন্ডার / এক্সিকিউটেড করতে পারে!


2
অ-বিকাশকারী পিসিগুলিতে ইনস্টল হওয়া অবধি প্রায়শই দেখা যায় না এমন মোতায়েনের সমস্যাগুলি নির্ণয়ের জন্য ইন্টিগ্রেশন টেস্ট পরিবেশগুলিতে এটি স্যুইচ করার সুবিধা রয়েছে।
টনি ওয়াল

2
আমি এটি ব্যবহার করে একটি নাল রেফারেন্সের ব্যতিক্রম পেয়েছি, সম্ভবত রিলিজ মোডে ডিবাগ বৈশিষ্ট্যটি সম্পূর্ণভাবে ওয়েবকনফিগ থেকে সরিয়ে দেওয়া হয়েছে।
অ্যালেক্স আঙ্গাস

1
@ অ্যালেক্সআঙ্গাস পুনরুদ্ধার করতে পারে না। :( আমি .NET 4.5.1 (এএসপি। নেট এমভিসি 5, System.Webসংস্করণ 4.0.0.0) তে একটি প্রকল্প তৈরি করেছি এবং এমনকি debugঅ্যাট্রিবিউট (বা, প্রকৃতপক্ষে, পুরো compilationউপাদানটি) মুছে ফেলাতে আমি ব্যতিক্রম পাচ্ছি না My আমার পরবর্তী সর্বোত্তম অনুমানগুলি হ'ল এটি একটি বাগ যা System.Webসমাবেশের পরবর্তী সংস্করণগুলিতে স্থির করা হয়েছিল বা আপনার নির্দিষ্ট পরিস্থিতি সম্পর্কে আমি আলাদাভাবে কিছু জানি যা সম্পর্কে আমি অবগত নই you আপনি কি কোনও ন্যূনতম পরীক্ষার প্রকল্প তৈরি করতে এবং কোথাও এটি আপলোড করতে পারবেন?
জর্ডান গ্রে

4
@ জর্ডানগ্রাই একবার দেখে নেওয়ার জন্য ধন্যবাদ - আমি পাশাপাশি একটি নতুন প্রকল্প চেষ্টা করেছি এবং কোনটিই আবার তিরস্কার করতে পারছি না! আপনার সমাধান কাজ করছে। দুর্ভাগ্যক্রমে এই মুহুর্তটি আরও দেখার জন্য সময় নেই তবে আমি যদি কারণটি দেখি তবে আমি এই পোস্টটি আপডেট করব।
অ্যালেক্স আঙ্গাস

5
রক্তাক্ত উজ্জ্বল সাথী; এটি ওপিএসের উত্তর হওয়া উচিত।
নিশাচর

23

সি # এবং এএসপি.নেট এমভিসি: একটি দৃশ্যে #if নির্দেশিকা ব্যবহার করে

আসলে সেই উত্তরটির সঠিক উত্তর রয়েছে। আপনি মডেলটির মাধ্যমে ডিবাগ মোডে আছেন কিনা তা আপনাকে পাস করতে চলেছেন। (বা ভিউব্যাগ) যেহেতু সমস্ত দর্শন ডিবাগ মোডে সংকলিত হয়েছে।


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
অগত্যা। আপনি কোনও পরীক্ষা / বিকাশ সার্ভারে ডিবাগ মোডে চালাতে পারেন, উদাহরণস্বরূপ, স্টেজিং / প্রোডাকশনে রিলিজ মোডে সংকলনের আগে।
jonnybot

লিঙ্ক ট্যাগটি রেন্ডার করার জন্য এইচটিএমএল সহায়ক সহায়ক এক্সটেনশন পদ্ধতি এই ক্ষেত্রে সহায়তা করবে। এক্সটেনশন পদ্ধতির অভ্যন্তরে আপনি হয় #if DEBUG বা পরিবেশটি সিদ্ধান্ত নিতে একটি কনফিগার ভেরিয়েবল ব্যবহার করতে পারেন।
শ্রী

6

আমার সমাধানটি খুব বোকা, তবে এটি কার্যকর হয়। স্থির ফাইলে কোথাও একটি বিশ্বব্যাপী ধ্রুবক সংজ্ঞায়িত করুন:

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

তারপরে এটি এইচটিএমএলে রেজারের সাথে ব্যবহার করুন:

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

imho, এটা যে বোকা না। ডিবাগ-এ আমি এস -6-জাভাস্ক্রিপ্টটি ব্যবহার করতে চাই (তাই আমি বিকাশের সময় এস 6-ত্রুটিগুলি দেখতে পাচ্ছি) এবং প্রকাশের সময় আমি স্বতঃ-রূপান্তরকৃত নন-এস 6-জাভাস্ক্রিপ্টটি ব্যবহার করতে চাই (আইজে 11 এসআই 6 জানেন না)। এটি আমার জন্য দুর্দান্ত সমাধান।
ম্যাথিয়াস বার্গার

ধন্যবাদ মাথিয়াস!
টেদেবাস

দুর্দান্ত এক - সরল প্রত্যক্ষ, দ্ব্যর্থহীন
সেরেএক্সএক্সএক্স

5

ডিফল্টরূপে এমভিসি ভিউগুলি সংকলিত হয় না তাই #IF DEBUG একটি দর্শনে কাজ করতে পারে না। আপনি যদি ডিএফবুগ কনফিগারেশন অ্যাক্সেস করতে দর্শনটি সঙ্কলন করতে চান তবে আপনার প্রয়োজন:

  1. ভিজ্যুয়াল স্টুডিওতে আপনার প্রকল্পে ডান ক্লিক করুন
  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>
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.