Mecanismo de exibição do Razor, como entrar no pré-processador (#if debug)

234

Estou escrevendo minha primeira página de barbear hoje, não consigo descobrir como entrar #if debug #else #endif

Como posso inserir o pré-processador no razor?

mamu
fonte
possível duplicação de stackoverflow.com/questions/378982/…
Handcraftsman
10
O que quero dizer é que você quer #if debugbarbear, mas sempre será verdade. Portanto, a resposta para sua pergunta é que não faz sentido, pois o Razor sempre compila no modo de depuração.
Buildstarted
4
@mamu, você pode aceitar essa resposta e aceitar a de Shawn?
user247702

Respostas:

370

Acabei de criar um método de extensão:

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

Em seguida, usei-o em meus pontos de vista da seguinte forma:

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

Como o auxiliar é compilado com o símbolo DEBUG / RELEASE, ele funciona.

Shawn Wildermuth
fonte
32
É claro que este método de extensão tem de ir para o projeto MVC, não em uma biblioteca separada que pode ser compilado com diferentes opções ...
Eric J.
2
Isso não funcionou para mim: produziu "True", independentemente do modo de compilação. A resposta de Jordan Gray funcionou perfeitamente.
Timothy Kanski
Se for o modo DEBUG, o pré-processador lerá essencialmente public static bool IsDebug(...){ return true; }e vice-versa para o modo não DEBUG.
facepalm42
300

Isso é construído paraHttpContext :

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

Na IMO, isso faz mais sentido do que a compilação condicional para visualizações e é útil para alguns cenários de teste. (Veja o comentário de Tony Wall abaixo.)


Nota lateral: NullReferenceExceptionparaHttpContext.Current

Alex Angas mencionou que eles se deram bem NullReferenceExceptioncom esta solução, e algumas pessoas votaram positivamente, indicando que esse pode não ser um evento isolado.

Meu melhor palpite: HttpContext.Currenté armazenado CallContext, o que significa que só é acessível pelo encadeamento que lida com a solicitação HTTP recebida. Se suas visualizações estiverem sendo renderizadas em um thread diferente (talvez algumas soluções para visualizações pré-compiladas?), Você obteria um nullvalor HttpContext.Current.

Se você receber esse erro, informe-me nos comentários e mencione se está usando visualizações pré-compiladas ou qualquer configuração especial que possa resultar em suas visualizações serem parcialmente renderizadas / executadas em outro thread!

Jordan Grey
fonte
2
Tem a vantagem de poder ativá-lo em ambientes de teste de integração para diagnosticar problemas de implantação que geralmente não são vistos até serem instalados em PCs não desenvolvedores.
Tony Muro
2
Eu recebo uma exceção de referência nula usando isso, provavelmente porque no modo Release, o atributo debug é removido totalmente do web.config.
Alex Angas
1
@AlexAngas Não é possível reproduzir. :( Criei um projeto no .NET 4.5.1 (ASP.NET MVC 5, System.Webversão 4.0.0.0) e, mesmo com o debugatributo (ou, de fato, todo o compilationelemento) removido, não recebo uma exceção. As melhores hipóteses são que esse é um bug corrigido nas versões posteriores do System.Webassembly ou que existe algo diferente em sua situação específica que eu não conheço.Você poderia criar um projeto de teste mínimo e enviá-lo para algum lugar?
Jordan Gray
4
@JordanGray Obrigado por dar uma olhada - eu também tentei um novo projeto e também não posso me reproduzir! Sua solução está funcionando. Infelizmente, não tenho tempo para procurar mais, mas se eu me deparar com o motivo, atualizarei este post.
Alex Angas
5
Companheiro brilhante sangrenta; essa deve ser a resposta do OP.
Nocarrier 26/09/14
23

C # e ASP.NET MVC: usando a diretiva #if em uma exibição

Na verdade, essa resposta tem a resposta certa. Você terá que passar se está ou não no modo de depuração através do modelo. (ou ViewBag), pois todas as visualizações são compiladas no modo de depuração.

Buildstarted
fonte
27
Observe que, como as visualizações do Razor são sempre compiladas no modo Debug, definir uma diretiva de pré-processador dessa maneira não terá nenhum efeito. Você sempre vai executar// your debug stuff
marcind
1
Heh, sim, eu acabei de perceber isso quando escrevi.
Buildstarted
14

Sei que essa não é uma resposta direta à pergunta, mas como tenho certeza de que a configuração de depuração é um corolário do fato de você estar realmente executando localmente, sempre é possível usar a Request.IsLocalpropriedade como um teste de depuração. Portanto :

@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
fonte
1
Não necessariamente. Você pode executar no modo Debug em um servidor de teste / desenvolvimento, por exemplo, antes de compilar no modo Release no armazenamento temporário / produção.
precisa saber é o seguinte
Um método de extensão auxiliar html para renderizar a tag do link ajudará nesse caso. Dentro do método de extensão, você pode usar #if DEBUG ou uma variável de configuração para decidir o ambiente.
sree
6

Minha solução é muito estúpida, mas funciona. Defina uma constante global em algum lugar de um arquivo estático:

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

Em seguida, use-o com o Razor em HTML:

@if (AppConstants.IS_DEBUG)
{
    <h3>Debug mode</h3>
}
else
{
    <h3>Release mode</h3>
}
tedebus
fonte
imho, não é tão estúpido. na depuração, quero usar o es6-javascript (para que eu veja os erros do es6 durante o desenvolvimento) e no lançamento quero usar o não-es6-javascript convertido automaticamente (porque o IE11 não conhece o es6). Esta é uma ótima solução para mim.
Matthias Burger
Obrigado Matthias!
tedebus 13/09/19
bom - simples direto, sem ambiguidade
Serexx 10/01
5

Por padrão, as visualizações do MVC não são compiladas para que o #IF DEBUG não possa funcionar em uma visualização. Se você deseja compilar a visualização para acessar a configuração IF DEBUG, é necessário:

  1. Clique com o botão direito do mouse no seu projeto no Visual Studio
  2. Descarregar projeto
  3. Editar projeto

altere o seguinte atributo de falso para verdadeiro

<MvcBuildViews>true</MvcBuildViews>

recarregue seu projeto e, em seguida, as visualizações serão compiladas.

A única outra solução alternativa seria ter uma função no seu código por trás

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

e depois chame-o de vista:

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

Para mim, o código abaixo funcionou muito bem.

Quando o aplicativo está Depurando, meus botões aparecem, quando é Liberado , eles não aparecem .

@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
fonte
3

Isso funciona para mim em um projeto de marca branca .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
fonte
2

No .NET Core, você pode fazer o seguinte em vez de verificar as variáveis ​​do pré-processador:

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