มีดโกนมุมมองเครื่องยนต์วิธีการป้อน preprocessor (#if debug)


234

ฉันกำลังเขียนหน้ามีดโกนแรกของฉันในวันนี้ไม่สามารถหาวิธีเข้าได้ #if debug #else #endif

ฉันจะป้อนตัวประมวลผลล่วงหน้าในมีดโกนได้อย่างไร


อาจเป็นไปได้ซ้ำกับstackoverflow.com/questions/378982/…
ฝีมือ

10
จุดของฉันคือการที่คุณต้องการ#if debugในมีดโกน แต่มันจะเสมอเป็นจริง ดังนั้นคำตอบสำหรับคำถามของคุณคือไม่มีจุดทำเพราะมีดโกนจะรวบรวมในโหมดดีบักเสมอ
เริ่มเมื่อ

4
@muu คุณสามารถยอมรับคำตอบนั้นและยอมรับจาก Shawn ได้ไหม?
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
แน่นอนวิธีขยายนี้ได้ไปลงในโครงการ MVC ไม่เป็นห้องสมุดที่แยกต่างหากที่อาจจะมีการรวบรวมกับตัวเลือกที่แตกต่างกัน ...
เอริคเจ

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 สิ่งนี้สมเหตุสมผลกว่าการคอมไพล์ตามเงื่อนไขสำหรับมุมมองและมีประโยชน์สำหรับบางสถานการณ์การทดสอบ (ดูความคิดเห็นของ Tony Wallด้านล่าง)


หมายเหตุด้านข้าง: NullReferenceExceptionสำหรับHttpContext.Current

อเล็กซ์แองกัสกล่าวว่าพวกเขาได้รับการNullReferenceExceptionแก้ไขปัญหานี้และมีคนไม่กี่คนที่โหวตว่านี่อาจไม่ใช่เหตุการณ์โดดเดี่ยว

การเดาที่ดีที่สุดของฉัน: HttpContext.Currentถูกเก็บไว้ในCallContextซึ่งหมายความว่าสามารถเข้าถึงได้โดยเธรดที่จัดการคำขอ HTTP ขาเข้าเท่านั้น ถ้ามุมมองของคุณจะถูกแสดงผลในหัวข้อที่แตกต่างกัน (อาจจะแก้ปัญหาบางอย่างสำหรับมุมมอง precompiled?) คุณจะได้รับความคุ้มค่าnullHttpContext.Current

หากคุณได้รับข้อผิดพลาดนี้โปรดแจ้งให้เราทราบในความคิดเห็นและพูดถึงว่าคุณกำลังใช้มุมมองที่คอมไพล์หรือมีการตั้งค่าพิเศษใด ๆ


2
มีข้อได้เปรียบที่คุณสามารถเปิดใช้งานได้ในสภาพแวดล้อมการทดสอบการรวมเพื่อวินิจฉัยปัญหาการปรับใช้ที่มักไม่เห็นจนกว่าจะติดตั้งบนพีซีที่ไม่ใช่นักพัฒนาซอฟต์แวร์
Tony Wall

2
ฉันได้รับข้อยกเว้นอ้างอิง null โดยใช้สิ่งนี้อาจเป็นเพราะในโหมด Release แอตทริบิวต์ debug จะถูกลบออกจาก web.config ทั้งหมด
Alex Angas

1
@AlexAngas ไม่สามารถทำซ้ำได้ :( ฉันสร้างโครงการใน. NET 4.5.1 (ASP.NET MVC 5, System.Webรุ่น 4.0.0.0) และแม้ว่าจะมีdebugคุณลักษณะ (หรือแน่นอนcompilationองค์ประกอบทั้งหมด) ถูกลบออกฉันไม่ได้รับการยกเว้น สมมติฐานที่ดีที่สุดคือว่าปัญหานี้เป็นปัญหาที่ได้รับการแก้ไขในรุ่นที่ใหม่กว่าที่System.Webชุมนุมหรือว่ามีบางสิ่งบางอย่างที่แตกต่างกันเกี่ยวกับสถานการณ์เฉพาะของคุณว่าผมไม่ทราบว่าคุณสามารถสร้างโครงการทดสอบน้อยที่สุดและอัปโหลดไปที่ไหนสักแห่ง.
จอร์แดนสีเทา

4
@ JordanGray ขอบคุณสำหรับการมอง - ฉันเพิ่งลองโครงการใหม่ด้วยและไม่สามารถทำซ้ำได้เช่นกัน! โซลูชันของคุณใช้งานได้ ไม่มีเวลาดูเพิ่มเติมในขณะนี้น่าเสียดาย แต่ถ้าฉันเจอเหตุผลฉันจะปรับปรุงการโพสต์
Alex Angas

5
เพื่อนเลือดที่ยอดเยี่ยม; นี่ควรเป็นคำตอบ OPs
nocarrier

23

C # และ ASP.NET MVC: การใช้ #if directive ในมุมมอง

จริงๆแล้วคำตอบนั้นมีคำตอบที่ถูกต้อง คุณจะต้องผ่านไม่ว่าคุณจะอยู่ในโหมดดีบักผ่านทาง Model หรือไม่ (หรือ ViewBag) เนื่องจากมุมมองทั้งหมดได้รับการรวบรวมในโหมดแก้ไขข้อบกพร่อง


27
โปรดทราบว่าเนื่องจากมุมมองมีดโกนจะถูกรวบรวมในโหมดดีบั๊กเสมอการตั้งค่าคำสั่ง preprocessor ด้วยวิธีนี้จะไม่มีผลกระทบใด ๆ คุณจะดำเนินการเสมอ// your debug stuff
marcind

1
เฮ้ใช่ฉันเพิ่งรู้ว่าเมื่อฉันเขียนมัน
เริ่มตั้งแต่

14

ฉันรู้ว่านี่ไม่ใช่คำตอบที่ตรงกับคำถาม แต่เนื่องจากฉันค่อนข้างแน่ใจว่าการกำหนดค่าการดีบักนั้นเป็นข้อพิสูจน์ถึงความจริงที่ว่าคุณกำลังเรียกใช้งานจริงในเครื่องคุณสามารถใช้Request.IsLocalคุณสมบัติเป็น debug เช่น test ได้ ดังนั้น:

@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
ไม่จำเป็น. คุณอาจทำงานในโหมดดีบั๊กบนเซิร์ฟเวอร์ทดสอบ / พัฒนาตัวอย่างเช่นก่อนรวบรวมในโหมด Release บน Staging / Production
jonnybot

วิธีส่วนขยาย html helper เพื่อแสดงแท็กลิงก์จะช่วยได้ในกรณีนี้ ภายในเมธอดส่วนขยายคุณสามารถใช้ #if DEBUG หรือตัวแปร config เพื่อตัดสินใจเกี่ยวกับสภาพแวดล้อม
sree

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) นี่เป็นทางออกที่ดีสำหรับฉัน
Matthias Burger

ขอบคุณ Matthias!
tedebus

เป็นคนดี - ง่ายโดยตรงไม่คลุมเครือ
Serexx

5

ตามค่าเริ่มต้นมุมมอง MVC จะไม่ถูกรวบรวมดังนั้น #IF DEBUG จึงไม่สามารถทำงานได้ในมุมมอง หากคุณต้องการรวบรวมมุมมองเพื่อเข้าถึง IF DEBUG config คุณต้อง:

  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

สำหรับฉันรหัสด้านล่างทำงานได้ดีมาก

เมื่อแอปพลิเคชันกำลังดีบักปุ่มของฉันปรากฏขึ้นมาเมื่อปล่อยพวกเขาจะไม่

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


2

ใน. NET Core คุณสามารถทำสิ่งต่อไปนี้แทนการตรวจสอบตัวแปรพรีโปรเซสเซอร์

<environment include="Development">
  <!--Debug code here-->
</environment>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.