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?

Respuestas:


161

Intente así:

if (somecondition) {
    @:<div>
}


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 )


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)

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 .


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.