Razor non riconosce i tag html non chiusi


99

Con RazorViewEngine, posso fare questo:

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

ma non riesco a farlo (Razor si confonde):

if (somecondition) {
    <div>
}

if (someothercondition) {
    </div>
}

Ho una situazione in cui devo inserire i miei tag html di apertura e chiusura in diversi blocchi di codice: come posso farlo in Razor?

Risposte:


161

Prova in questo modo:

if (somecondition) {
    @:<div>
}

1
oppure <text><div></text>- haacked.com/archive/2011/01/06/…
Simon_Weaver

17
<text><div></text>funziona, ma <text></div></text>non lo fa.
friggle

@Stuntman devi farlo sia per il tag di apertura che per quello di chiusura per farlo funzionare.
Departamento B

e come trattare il testo multilinea?
Dmitri Tsoy

Non ho potuto farlo in linea. if (condizione) {@: tag}. Ho dovuto formattarlo come sopra.
Mike

59

Per spiegare la risposta di Darin, cioè anteporre l'HTML in questo modo:

@:<html>

@: in Razor significa 'rendere qualcosa come testo normale'

oppure puoi usarlo, che restituisce l'HTML come l'hai scritto originariamente (questo può anche essere usato per evitare la codifica HTML automatica che Razor fa se stai cercando di produrre HTML):

@Html.Raw("<html>")

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


2
le soluzioni sono ottime, ma le spiegazioni sono inestimabili. Grazie!
jay

2
Preferisco la soluzione @ Html.Raw ("<html>"), perché la prima è stata divisa su multiline quando si utilizzava la formattazione automatica (ctrl + K ctrl + D)
Matteo Sganzetta

@MatteoSganzetta True a meno che ciò che stai trasmettendo non abbia variabili Razor cosparse, ad esempio:@:<a href="@link" class="@classNames">@text</a>
qJake

Fai attenzione quando usi @Html.Raw()- vedi il relativo post SO
SliverNinja - MSFT

4

È possibile creare un metodo Helper MVC personalizzato. Per creare con te una classe statica pubblica MyRenderHelpers nello spazio dei nomi System.Web.Mvc.Htmle scrivere un metodo 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;
        }
    }
}

Ora puoi usare questo metodo di estensione nella tua vista razor:

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

3

Il fatto che tu debba farlo di solito indica che il tuo codice di visualizzazione non è preso in considerazione correttamente. La natura dell'HTML è di avere tag bilanciati o autoinclusi (almeno in HTML 4, HTML 5 sembra essersi allontanato da esso) e Razor dipende da questo presupposto. Se stai per <div>emettere in modo condizionale un, lo farai anche da qualche parte in seguito </div>. Metti semplicemente la coppia whoel nella tua ifdichiarazione:

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

Altrimenti ti ritroverai con un codice strano come qui .


6
La mia situazione è che voglio
Sydneyos

Giusto, il mio punto è che nel 99% dei casi probabilmente non dovresti. Ma potresti rientrare in @:<text></text>
quell'1

7
probabilmente ha un blocco di chiusura più tardi:if (somecondition) { @:</div> }
Simon_Weaver

sì, deve. il punto è che tali punti di vista possono essere riformulati in modo che tali doppi condizionali non siano necessari.
marcind

1
@michielvoo Perché è sbagliato usare questo metodo per avere un div wrapper condizionale, ad esempio? Anche in HTML5 non chiudi i <link>tag.
Chris Haines
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.