Công cụ xem dao cạo, cách nhập bộ tiền xử lý (#if gỡ lỗi)


233

Tôi đang viết trang dao cạo đầu tiên của tôi ngày hôm nay, không thể tìm ra cách nhập #if debug #else #endif

Làm thế nào tôi có thể nhập tiền xử lý trong dao cạo?



10
Quan điểm của tôi là bạn muốn dùng #if debugdao cạo nhưng nó sẽ luôn đúng. Vì vậy, câu trả lời cho câu hỏi của bạn là không có lý do gì để làm điều đó vì Dao cạo sẽ luôn biên dịch trong chế độ gỡ lỗi.
Buildstarted

4
@mamu bạn có thể không chấp nhận câu trả lời đó và chấp nhận câu trả lời từ Shawn không?
user247702

Câu trả lời:


370

Tôi vừa tạo một phương thức mở rộng:

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

Sau đó, sử dụng nó trong quan điểm của tôi như vậy:

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

Vì trình trợ giúp được biên dịch với biểu tượng DEBUG / RELEASE, nên nó hoạt động.


32
Tất nhiên phương thức mở rộng này phải đi vào dự án MVC, không phải vào một thư viện riêng biệt có thể được biên dịch với các tùy chọn khác nhau ...
Eric J.

2
Điều này hoàn toàn không phù hợp với tôi - nó tạo ra "True" bất kể chế độ biên dịch. Câu trả lời của Jordan Gray hoạt động hoàn hảo.
Timothy Kanski

Nếu đó là chế độ DEBUG, về cơ bản, bộ xử lý trước sẽ đọc public static bool IsDebug(...){ return true; }và ngược lại với chế độ không DEBUG.
facepalm42

300

Điều này được xây dựng đểHttpContext :

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

IMO, điều này có ý nghĩa hơn so với việc biên dịch có điều kiện cho các khung nhìn và có ích cho một số tình huống thử nghiệm. (Xem bình luận của Tony Wall bên dưới.)


Lưu ý bên: NullReferenceExceptionchoHttpContext.Current

Alex Angas đã đề cập rằng họ có được một NullReferenceExceptiongiải pháp này và một vài người đã nêu lên ý kiến ​​rằng đây có thể không phải là một sự kiện biệt lập.

Dự đoán tốt nhất của tôi: HttpContext.Currentđược lưu trữ trong CallContext, có nghĩa là nó chỉ có thể được truy cập bởi luồng xử lý yêu cầu HTTP đến. Nếu chế độ xem của bạn đang được hiển thị trên một luồng khác (có lẽ một số giải pháp cho chế độ xem được biên dịch trước?), Bạn sẽ nhận được nullgiá trị choHttpContext.Current .

Nếu bạn gặp lỗi này, vui lòng cho tôi biết trong các nhận xét và đề cập nếu bạn đang sử dụng các chế độ xem được biên dịch trước hoặc bất kỳ điều gì đặc biệt được thiết lập có thể dẫn đến việc các chế độ xem của bạn được hiển thị / thực hiện một phần trên luồng khác!


2
Có lợi thế bạn có thể bật nó trong môi trường thử nghiệm tích hợp để chẩn đoán các vấn đề triển khai thường không thấy cho đến khi được cài đặt trên các PC không phải là nhà phát triển.
Tony Wall

2
Tôi nhận được một ngoại lệ tham chiếu null bằng cách sử dụng điều này, có lẽ vì trong chế độ Phát hành, thuộc tính gỡ lỗi được xóa hoàn toàn khỏi web.config.
Alex Angas

1
@AlexAngas Không thể repro. :( Tôi đã tạo một dự án trong .NET 4.5.1 (ASP.NET MVC 5, System.Webphiên bản 4.0.0.0) và ngay cả với debugthuộc tính (hoặc, thực sự, toàn bộ compilationphần tử) đã bị xóa Tôi không có ngoại lệ. giả thuyết tốt nhất là đây là một lỗi đã được sửa trong các phiên bản sau của System.Webhội đồng hoặc có điều gì đó khác biệt về tình huống cụ thể của bạn mà tôi không biết. Bạn có thể tạo một dự án thử nghiệm tối thiểu và tải nó lên đâu đó không?
Jordan Gray

4
@JordanGray Cảm ơn bạn đã xem - Tôi cũng vừa thử một dự án mới và cũng không thể trách mắng! Giải pháp của bạn đang hoạt động. Không có thời gian để nhìn xa hơn vào thời điểm này thật đáng tiếc nhưng nếu tôi đi qua lý do tôi sẽ cập nhật bài viết này.
Alex Angas

5
Người bạn đời máu lửa; đây sẽ là câu trả lời của OP
nocarrier

23

C # và ASP.NET MVC: Sử dụng chỉ thị #if trong chế độ xem

Thật ra câu trả lời đó có câu trả lời đúng. Bạn sẽ phải vượt qua cho dù bạn có ở chế độ gỡ lỗi thông qua Mô hình hay không. (hoặc ViewBag) vì tất cả các chế độ xem được biên dịch trong chế độ gỡ lỗi.


27
Lưu ý rằng vì các khung nhìn của Dao cạo luôn được biên dịch trong chế độ Gỡ lỗi, thiết lập một chỉ thị tiền xử lý theo cách này sẽ không thực sự có hiệu lực. Bạn sẽ luôn luôn thực thi// your debug stuff
hôn vào

1
Heh, yeah, tôi chỉ nhận ra rằng khi tôi viết nó.
Buildstarted

14

Tôi biết đây không phải là câu trả lời trực tiếp cho câu hỏi nhưng vì tôi khá chắc chắn rằng cấu hình gỡ lỗi là hệ quả của thực tế là bạn đang thực thi cục bộ, bạn luôn có thể sử dụng thuộc Request.IsLocaltính như một bản sửa lỗi như kiểm tra. Như vậy:

@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
Không cần thiết. Ví dụ, bạn có thể chạy trong chế độ Gỡ lỗi trên máy chủ thử nghiệm / phát triển trước khi biên dịch ở chế độ Phát hành trên Giai đoạn / Sản xuất.
jonnybot

Một phương thức mở rộng trình trợ giúp html để hiển thị thẻ liên kết sẽ giúp ích trong trường hợp này. Trong phương thức tiện ích mở rộng, bạn có thể sử dụng #if DEBUG hoặc biến cấu hình để quyết định môi trường.
sree

6

Giải pháp của tôi rất ngu ngốc, nhưng nó hoạt động. Xác định hằng số toàn cầu ở đâu đó trong tệp tĩnh:

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

Sau đó sử dụng nó với Dao cạo trong HTML:

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

imho, nó không ngu ngốc trong gỡ lỗi tôi muốn sử dụng es6-javascript (vì vậy tôi thấy các lỗi es6 trong khi phát triển) và trong bản phát hành tôi muốn sử dụng javascript không chuyển đổi tự động (cuz IE11 không biết es6). đây là một giải pháp tuyệt vời cho tôi
Matthias Burger

Cảm ơn bạn Matthias!
gấu bông

tốt đẹp - đơn giản trực tiếp, không mơ hồ
Serexx

5

Theo mặc định, chế độ xem MVC không được biên dịch để #IF DEBUG không thể hoạt động trong chế độ xem. Nếu bạn muốn biên dịch chế độ xem để truy cập cấu hình IF DEBUG, bạn cần phải:

  1. Nhấp chuột phải vào dự án của bạn trong Visual Studio
  2. Dỡ dự án
  3. Chỉnh sửa dự án

thay đổi thuộc tính sau từ false thành true

<MvcBuildViews>true</MvcBuildViews>

tải lại dự án của bạn và sau đó lượt xem sẽ được biên dịch.

Công việc khác chỉ có một hàm trong mã của bạn phía sau

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

và sau đó gọi nó từ chế độ xem:

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

3

Đối với tôi, mã dưới đây đã hoạt động rất tốt.

Khi ứng dụng đang gỡ lỗi, các nút của tôi xuất hiện, khi phát hành , chúng không hoạt động.

@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

Điều này làm việc cho tôi trong một dự án nhãn trắng .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

Trong .NET Core, bạn có thể thực hiện các thao tác sau thay vì kiểm tra các biến tiền xử lý:

<environment include="Development">
  <!--Debug code here-->
</environment>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.