2010-06-01 35 views
44

Tôi có biểu tượng biên dịch có điều kiện mà tôi đang sử dụng được gọi là "RELEASE", mà tôi đã chỉ ra trong thuộc tính của dự án trong Visual Studio. Tôi muốn một số CSS cụ thể được áp dụng cho các phần tử khi biểu tượng RELEASE được định nghĩa, và tôi đã cố gắng thực hiện điều đó từ khung nhìn, nhưng nó dường như không hoạt động.C# và ASP.NET MVC: Sử dụng chỉ thị #if trong chế độ xem

xem mã của tôi trông như thế này (rút ngắn một chút cho các mục đích demo):

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

Với mã này, và với bộ biểu tượng phát hành, mã 'khác' đang chạy và tôi nhận được một div với lớp debugBanner. Vì vậy, nó dường như không nghĩ rằng RELEASE được xác định. Cần lưu ý rằng mã C# thực sự của tôi trong các tệp .cs nhận dạng RELEASE và chạy đúng mã. Đó chỉ là quan điểm cho tôi vấn đề.

Có ai có thông tin chi tiết về vấn đề này không? Bất kỳ trợ giúp sẽ được đánh giá cao. Cảm ơn.

Làm rõ: Tôi nên đề cập rằng chế độ xem này đã là một phần xem và tôi sẽ chỉ hiển thị ở những trang tôi cần. Đó là bởi vì các biểu ngữ này sẽ nằm trên các trang nhất định chứ không phải các trang khác. Vì vậy, ngay cả khi render nó như là một cái nhìn cục bộ qua:

Html.RenderPartial("BannerView");

nó không làm việc.

+3

Tại sao bạn không tạo phương thức trợ giúp html và đặt mã trong đó? Sau đó, bạn có thể thực hiện nếu và thực hiện một phần hiển thị để giữ HTML – Rippo

+0

Không quá quen thuộc với các phương thức trợ giúp html. Tôi đã làm rõ câu hỏi của mình để chỉ ra rằng đây là một phần xem tôi đang làm việc với. Bạn có thể xây dựng một chút về đề xuất của bạn? –

+1

chỉ thị tiền xử lý chỉ làm việc @ biên dịch-thời gian ... @DeveloperArt có một giải pháp thanh lịch ... – xandercoded

Trả lời

17

Trong mô hình của bạn:

bool isRelease = false; 

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

Theo quan điểm của bạn:

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

Tôi thu thập từ câu trả lời này là không thể kiểm tra các biểu tượng biên dịch từ một khung nhìn, và điều đó phải được thực hiện từ một tệp .cs. Điều này có đúng không? –

+0

Giải pháp tốt, nhưng về cách đặt logic này trong bộ điều khiển cơ sở mà tất cả các bộ điều khiển kế thừa. Sau đó, bạn có thể có quyền truy cập của tài sản này thông qua tất cả các bộ điều khiển ... – xandercoded

+1

tốt, không chắc chắn rằng sẽ hoàn toàn làm việc xander. Để có quyền truy cập vào nó từ khung nhìn, chúng ta sẽ cần một Mô hình với thuộc tính đó, không phải một Bộ điều khiển với thuộc tính đó. Vì vậy, tôi thực sự phải vượt qua cùng một mô hình đó từ nhiều bộ điều khiển và hiển thị chế độ xem đó, đây sẽ là một cơn đau. –

104

tôi gần đây phát hiện ra rằng bạn có thể chỉ đơn giản là kiểm tra:

HttpContext.Current.IsDebuggingEnabled 

trong xem, mà giúp bạn tiết kiệm kiểm tra các ký hiệu trong các phần khác của ứng dụng của bạn.

+1

Đây là cách tiếp cận tốt nhất, IMO. –

+2

Thay vào đó, bạn không nên sử dụng 'this.Context.IsDebuggingEnabled'? Thực sự chỉ áp dụng nếu bạn đã chế nhạo bối cảnh hoặc bằng cách nào đó [sử dụng chế độ xem dao cạo bên ngoài webapp] (http://stackoverflow.com/questions/3628895/is-it-possible-to-use-razor-view-engine- bên ngoài-asp-net) – drzaus

-7

Dưới đây là cú pháp Dao cạo cho các chỉ thị trình biên dịch có điều kiện. Nó tải phiên bản phát triển của jquery khi biến DEBUG được đặt trong cấu hình VS hoặc web.config. Nếu không, phiên bản min sẽ được tải.

@{#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

không nghĩ rằng điều này sẽ làm việc kể từ khi xem không được biên dịch và nếu (DEBUG) là một chỉ thị trình biên dịch? – Tom

+1

Điều đó không hoạt động trong Razor. Đó chính xác là câu hỏi ban đầu. – trailmax

57

Một tốt hơn, giải pháp chung chung hơn là sử dụng một phương pháp mở rộng, vì vậy tất cả quan điểm có thể truy cập nó:

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

Sau đó bạn có thể sử dụng nó như sau trong bất kỳ view (cú pháp dao cạo):

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

Đó là phương pháp tuyệt vời! cám ơn vì đã chia sẻ! – trailmax

+1

Tất nhiên, báo trước là nó phụ thuộc vào phương thức này - nếu nó nằm trong thư viện được biên dịch trong chế độ phát hành, nó sẽ trả về 'false' khi đưa vào một dự án được biên dịch trong chế độ gỡ lỗi. – drzaus

+0

Vui lòng kiểm tra câu hỏi này 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

Bạn có thể sử dụng ViewBag thay vì viewmodel (nhưng cách tiếp cận viewmodel như là tốt hơn):

0.123.

Bộ điều khiển:

controller code

Xem:

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

Cách sử dụng:

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

Ngoài ra, hãy chắc chắn rằng NIKITA_DEBUG biến tồn tại trong xây dựng tab của dự án của bạn:

build tab

1

Đối với tôi, mã bên dưới đã 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 nào là Bản phát hành, thì khô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> 
} 
Các vấn đề liên quan