Mesin tampilan silet, cara memasukkan preprosesor (debug #jika)

234

Saya menulis halaman pisau cukur pertama saya hari ini, tidak tahu bagaimana cara masuk #if debug #else #endif

Bagaimana saya bisa memasukkan preprocessor di pisau cukur?

mamu
sumber
kemungkinan duplikat stackoverflow.com/questions/378982/…
Handcraftsman
10
Maksud saya adalah bahwa Anda ingin #if debugdengan pisau cukur tetapi itu akan selalu benar. Jadi jawaban untuk pertanyaan Anda adalah bahwa tidak ada gunanya melakukannya karena Razor akan selalu dikompilasi dalam mode debug.
Dibangun
4
@mamu, bisakah kamu menerima jawaban itu dan menerima yang dari Shawn?
user247702

Jawaban:

370

Saya baru saja membuat metode ekstensi:

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

Kemudian menggunakannya dalam pandangan saya seperti:

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

Karena helper dikompilasi dengan simbol DEBUG / RELEASE, helper bekerja.

Shawn Wildermuth
sumber
32
Tentu saja metode ekstensi ini harus masuk ke proyek MVC, bukan ke perpustakaan terpisah yang mungkin dikompilasi dengan opsi yang berbeda ...
Eric J.
2
Ini sama sekali tidak berhasil bagi saya - ini menghasilkan "Benar" terlepas dari mode kompilasi. Jawaban Jordan Gray bekerja dengan sempurna.
Timothy Kanski
Jika itu adalah mode DEBUG, pra-prosesor pada dasarnya akan membaca public static bool IsDebug(...){ return true; }, dan sebaliknya untuk mode non DEBUG.
facepalm42
300

Ini dibangun untukHttpContext :

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

IMO, ini lebih masuk akal daripada kompilasi bersyarat untuk tampilan dan berguna untuk beberapa skenario pengujian. (Lihat komentar Tony Wall di bawah ini.)


Catatan: NullReferenceExceptionuntukHttpContext.Current

Alex Angas menyebutkan bahwa mereka mendapatkan NullReferenceExceptionsolusi ini, dan beberapa orang telah menunjukkan bahwa ini mungkin bukan acara yang terisolasi.

Tebakan terbaik saya: HttpContext.Currentdisimpan CallContext, artinya hanya dapat diakses oleh utas yang menangani permintaan HTTP yang masuk. Jika pandangan Anda diberikan pada utas yang berbeda (mungkin beberapa solusi untuk tampilan yang dikompilasi?) Anda akan mendapatkan nullnilai HttpContext.Current.

Jika Anda mendapatkan kesalahan ini, beri tahu saya di komentar dan sebutkan jika Anda menggunakan tampilan yang dikompilasi atau pengaturan khusus apa pun yang dapat mengakibatkan tampilan Anda sebagian / dibuat pada utas lainnya!

Jordan Gray
sumber
2
Memiliki keunggulan yang dapat Anda aktifkan di lingkungan uji integrasi untuk mendiagnosis masalah penerapan yang sering tidak terlihat hingga diinstal pada PC yang bukan pengembang.
Tony Wall
2
Saya mendapatkan pengecualian referensi nol menggunakan ini, mungkin karena dalam mode Rilis atribut debug dihapus dari web.config sepenuhnya.
Alex Angas
1
@AlexAngas Tidak Dapat Repro. :( Saya membuat proyek di .NET 4.5.1 (ASP.NET MVC 5, System.Webversi 4.0.0.0), dan bahkan dengan debugatribut (atau, seluruh compilationelemen) dihapus, saya tidak mendapatkan pengecualian. Berikutnya saya hipotesis terbaik adalah bahwa ini adalah bug yang diperbaiki di versi System.Webperakitan yang lebih baru atau ada sesuatu yang berbeda tentang situasi spesifik Anda yang tidak saya sadari. Bisakah Anda membuat proyek uji minimal dan mengunggahnya di suatu tempat?
Jordan Gray
4
@JordanGray Terima kasih telah melihatnya - Saya baru saja mencoba proyek baru dan juga tidak dapat menegur! Solusi Anda berhasil. Sayangnya tidak ada waktu untuk melihat lebih jauh saat ini tetapi jika saya menemukan alasannya saya akan memperbarui posting ini.
Alex Angas
5
Teman cemerlang yang berdarah; ini harus menjadi jawaban OP.
nocarrier
23

C # dan ASP.NET MVC: Menggunakan arahan #jika dalam suatu tampilan

Sebenarnya jawaban itu memiliki jawaban yang benar. Anda harus lulus apakah Anda dalam mode debug melalui Model. (atau ViewBag) karena semua tampilan dikompilasi dalam mode debug.

Dibangun kembali
sumber
27
Perhatikan bahwa karena tampilan Razor selalu dikompilasi dalam mode Debug mengatur arahan preprosesor dengan cara ini sebenarnya tidak akan berpengaruh. Anda akan selalu mengeksekusi// your debug stuff
marcind
1
Heh, ya, saya baru sadar ketika saya menulisnya.
Dibangun
14

Saya tahu ini bukan jawaban langsung untuk pertanyaan itu, tetapi karena saya cukup yakin konfigurasi debug adalah wajar dengan kenyataan bahwa Anda benar-benar mengeksekusi secara lokal, Anda selalu dapat menggunakan Request.IsLocalproperti sebagai tes seperti debug. Jadi :

@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">
}
Sbu
sumber
1
Belum tentu. Anda dapat menjalankan dalam mode Debug pada server pengujian / pengembangan, misalnya, sebelum mengkompilasi dalam mode Rilis pada Staging / Produksi.
jonnybot
Metode ekstensi pembantu html untuk membuat tag tautan akan membantu dalam kasus ini. Di dalam metode ekstensi Anda dapat menggunakan # jika DEBUG atau variabel konfigurasi untuk memutuskan lingkungan.
sree
6

Solusi saya sangat bodoh, tetapi berhasil. Tentukan konstanta global di suatu tempat di file statis:

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

Kemudian gunakan dengan Razor di HTML:

@if (AppConstants.IS_DEBUG)
{
    <h3>Debug mode</h3>
}
else
{
    <h3>Release mode</h3>
}
tedebus
sumber
ya, itu tidak sebodoh itu. dalam debug saya ingin menggunakan es6-javascript (jadi saya melihat es6-kesalahan saat berkembang) dan dalam rilis saya ingin menggunakan javascript non-es6 yang dikonversi secara otomatis (karena IE11 tidak tahu es6). ini solusi hebat buat saya.
Matthias Burger
Matthias terima kasih!
tedebus
nice one - simple direct, unambiguous
Serexx
5

Secara default, tampilan MVC tidak dikompilasi sehingga #Jika DEBUG tidak dapat berfungsi dalam tampilan. Jika Anda ingin mengkompilasi tampilan untuk mengakses IF DEBUG config, Anda perlu:

  1. Klik kanan pada proyek Anda di Visual Studio
  2. Bongkar proyek
  3. Edit proyek

ubah atribut berikut dari false ke true

<MvcBuildViews>true</MvcBuildViews>

muat ulang proyek Anda dan kemudian pandangan akan dikompilasi.

Satu-satunya pekerjaan lain di sekitar akan memiliki fungsi dalam kode Anda di belakang

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

lalu panggil dari tampilan:

if(DEBUG())
{
  //debug code here
}
else
{
  //release code here
}
Yannick Richard
sumber
3

Bagi saya, kode di bawah ini telah bekerja dengan sangat baik.

Ketika aplikasi sedang Men - debug tombol saya muncul, ketika Rilis , mereka tidak.

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

Ini berfungsi untuk saya dalam proyek label putih .net core 3.0

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

Di .NET Core, Anda dapat melakukan hal berikut alih-alih memeriksa variabel preprosesor:

<environment include="Development">
  <!--Debug code here-->
</environment>
beleester
sumber