O Razor não entende tags html não fechadas


99

Com RazorViewEngine, posso fazer isso:

if (somecondition) {
     <div> some stuff </div>
}

mas não consigo fazer isso (Razor fica confuso):

if (somecondition) {
    <div>
}

if (someothercondition) {
    </div>
}

Eu tenho uma situação em que preciso colocar minhas tags html de abertura e fechamento em blocos de código diferentes - como posso fazer isso no Razor?

Respostas:



59

Para explicar a resposta de Darin, ou seja, prefixando o HTML assim:

@:<html>

@: em Razor significa 'renderizar algo como texto simples'

ou você pode usar isto, que produz o HTML como você o escreveu originalmente (isso também pode ser usado para evitar a codificação HTML automática que o Razor faz se você está tentando produzir HTML):

@Html.Raw("<html>")

(Referência Html.Raw da MS - http://msdn.microsoft.com/en-us/library/gg568896(v=vs.111).aspx )


2
as soluções são ótimas, mas as explicações são inestimáveis. obrigado!
Jay

2
Eu prefiro a solução @ Html.Raw ("<html>"), porque a primeira foi dividida em multilinhas ao usar a formatação automática (ctrl + K ctrl + D)
Matteo Sganzetta

@MatteoSganzetta Verdadeiro, a menos que o que você está produzindo tenha variáveis ​​Razor espalhadas nele, por exemplo:@:<a href="@link" class="@classNames">@text</a>
qJake

Cuidado ao usar @Html.Raw()- veja o SO relacionado pós
SliverNinja - MSFT

4

Você pode criar um método MVC Helper personalizado. Pois com você cria uma classe pública estática MyRenderHelpers no namespace System.Web.Mvc.Htmle escreve um método Html.

namespace System.Web.Mvc.Html
{
    public static class MyRenderHelpers
    {
        public static MvcHtmlString Html(this HtmlHelper helper, string html, bool condition)
        {
            if (condition)
                return MvcHtmlString.Create(html);
            else
                return MvcHtmlString.Empty;
        }
    }
}

Agora você pode usar este método de extensão em sua visualização de navalha:

@Html.Html("<div>", somecondition)

3

O fato de você ter que fazer isso geralmente indica que seu código de visualização não está fatorado corretamente. A natureza do HTML é ter tags balanceadas ou auto-fechadas (pelo menos no HTML 4, o HTML 5 parece estar se afastando dele) e o Razor depende dessa suposição. Se você for retirar condicionalmente um, <div>então também produzirá em algum lugar mais tarde </div>. Basta colocar o par whoel em seu ifextrato:

@if(something) {
    <div>
        Other stuff
    </div>
}

Caso contrário, você acabará com um código estranho como este .


6
Minha situação é que eu quero
sydneyos

Certo, meu ponto é que em 99% dos casos você provavelmente não deveria. Mas você pode se encaixar naquele 1%, caso em que há @:ou<text></text>
marcind

7
ele provavelmente tem um bloco de fechamento mais tarde:if (somecondition) { @:</div> }
Simon_Weaver

sim, ele precisa. meu ponto é que tais visões podem ser refatoradas de forma que tais condicionais duais não sejam necessárias.
marcind

1
@michielvoo Por que é ruim usar esse método para ter um envoltório div condicional, por exemplo? Também no HTML5 você não fecha as <link>tags.
Chris Haines de
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.