Razor no entiende las etiquetas html no cerradas

99

Con RazorViewEngine, puedo hacer esto:

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

pero parece que no puedo hacer esto (Razor se confunde):

if (somecondition) {
    <div>
}

if (someothercondition) {
    </div>
}

Tengo una situación en la que necesito colocar mis etiquetas html de apertura y cierre en diferentes bloques de código. ¿Cómo puedo hacer esto en Razor?

Sydney
fuente

Respuestas:

161

Intente así:

if (somecondition) {
    @:<div>
}
Darin Dimitrov
fuente
1
o <text><div></text>- haacked.com/archive/2011/01/06/…
Simon_Weaver
17
<text><div></text>funciona, pero <text></div></text>no.
friggle
@Stuntman, debe hacer esto tanto para las etiquetas de apertura como para las de cierre para que funcione.
Departamento B
¿y cómo tratar el texto de varias líneas?
Dmitri Tsoy
No pude hacer esto en línea. if (condición) {@: tag}. Tuve que formatearlo como arriba.
Mike
59

Para explicar la respuesta de Darin, es decir, prefijando el HTML de esta manera:

@:<html>

@: en Razor significa 'renderizar algo como texto sin formato'

o puede usar esto, que genera el HTML como lo escribió originalmente (esto también se puede usar para evitar la codificación HTML automática que hace Razor si está tratando de generar HTML):

@Html.Raw("<html>")

(Referencia Html.Raw de MS - http://msdn.microsoft.com/en-us/library/gg568896(v=vs.111).aspx )

Chris Halcrow
fuente
2
las soluciones son geniales, pero las explicaciones son invaluables. ¡Gracias!
Jay
2
Prefiero la solución @ Html.Raw ("<html>"), porque la primera se dividió en
varias líneas
@MatteoSganzetta True a menos que lo que está generando tenga variables Razor, por ejemplo:@:<a href="@link" class="@classNames">@text</a>
qJake
Tenga cuidado al usar @Html.Raw()- vea la publicación de SO relacionada
SliverNinja - MSFT
4

Puede crear un método MVC Helper personalizado. Porque con usted crea una clase pública estática MyRenderHelpers en el espacio de nombres System.Web.Mvc.Htmly escribe un 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;
        }
    }
}

Ahora puede usar este método de extensión en su vista de afeitadora:

@Html.Html("<div>", somecondition)
Thomas Hauser
fuente
3

El hecho de que tenga que hacer esto generalmente indica que su código de vista no está factorizado correctamente. La naturaleza de HTML es tener etiquetas equilibradas o auto-adjuntas (al menos en HTML 4, HTML 5 parece estar alejándose de él) y Razor depende de esa suposición. Si va a salir condicionalmente <div>a, también lo hará en algún lugar posterior </div>. Simplemente ponga el par total en su ifdeclaración:

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

De lo contrario, terminará con un código extraño como este .

maridar
fuente
6
Mi situación es que quiero
sídneyos
Bien, mi punto es que en el 99% de los casos probablemente no debería hacerlo. Pero podría encajar en ese 1%, en cuyo caso hay @:o<text></text>
marque el
7
probablemente tenga un bloque de cierre más tarde:if (somecondition) { @:</div> }
Simon_Weaver
sí, tiene que hacerlo. mi punto es que tales puntos de vista se pueden refactorizar para que tales condicionales duales no sean necesarios.
marcind
1
@michielvoo ¿Por qué es malo usar este método para tener un contenedor div condicional, por ejemplo? También en HTML5 no cierras <link>etiquetas.
Chris Haines