Razor versteht nicht geschlossene HTML-Tags nicht

99

Mit RazorViewEngine kann ich Folgendes tun:

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

aber ich kann das scheinbar nicht tun (Razor wird verwirrt):

if (somecondition) {
    <div>
}

if (someothercondition) {
    </div>
}

Ich habe eine Situation, in der ich meine öffnenden und schließenden HTML-Tags in verschiedenen Codeblöcken ablegen muss - wie kann ich das in Razor tun?

Sydney
quelle

Antworten:

161

Versuchen Sie es so:

if (somecondition) {
    @:<div>
}
Darin Dimitrov
quelle
1
oder <text><div></text>- haacked.com/archive/2011/01/06/…
Simon_Weaver
17
<text><div></text>funktioniert, funktioniert aber <text></div></text>nicht.
Friggle
@Stuntman Sie müssen dies sowohl für das öffnende als auch für das schließende Tag tun, damit es funktioniert.
Departamento B
und wie geht man mit mehrzeiligem Text um?
Dmitri Tsoy
Ich konnte das nicht inline machen. if (Bedingung) {@: tag}. Ich musste es wie oben formatieren.
Mike
59

Um Darins Antwort zu erklären, dh das HTML wie folgt voranzustellen:

@:<html>

@: in Razor bedeutet "etwas als einfachen Text rendern"

oder Sie können dies verwenden, wodurch der HTML-Code so ausgegeben wird, wie Sie ihn ursprünglich geschrieben haben (dies kann auch verwendet werden, um die automatische HTML-Codierung zu vermeiden, die Razor ausführt, wenn Sie versuchen, HTML auszugeben):

@Html.Raw("<html>")

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

Chris Halcrow
quelle
2
Lösungen sind großartig, aber Erklärungen sind von unschätzbarem Wert. Vielen Dank!
Jay
2
Ich bevorzuge die @ Html.Raw ("<html>") Lösung, da die erste bei Verwendung der automatischen Formatierung (Strg + K Strg + D)
mehrzeilig aufgeteilt wurde
@MatteoSganzetta True, es sei denn, was Sie ausgeben, enthält Razor-Variablen, zum Beispiel:@:<a href="@link" class="@classNames">@text</a>
qJake
Seien Sie vorsichtig mit @Html.Raw()- siehe verwandte SO Post
SliverNinja - MSFT
4

Sie können eine benutzerdefinierte MVC-Hilfsmethode erstellen. Denn mit erstellen Sie eine öffentliche statische Klasse MyRenderHelpers im Namespace System.Web.Mvc.Htmlund schreiben eine Methode 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;
        }
    }
}

Jetzt können Sie diese Erweiterungsmethode in Ihrer Rasiereransicht verwenden:

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

Die Tatsache, dass Sie dies tun müssen, zeigt normalerweise an, dass Ihr Ansichtscode nicht korrekt berücksichtigt wird. Die Natur von HTML besteht darin, ausgewogene oder in sich geschlossene Tags zu haben (zumindest in HTML 4 scheint sich HTML 5 davon abzulehnen), und Razor hängt von dieser Annahme ab. Wenn Sie a bedingt ausbrechen, werden <div>Sie auch irgendwo später ausgeben </div>. Fügen Sie einfach das Whel-Paar in Ihre ifErklärung ein:

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

Andernfalls erhalten Sie seltsamen Code wie hier .

Marcind
quelle
6
Meine Situation ist, dass ich
Sydney
Richtig, mein Punkt ist, dass Sie in 99% der Fälle wahrscheinlich nicht sollten. Aber Sie könnten in diese 1% passen, in diesem Fall gibt es @:oder<text></text>
Marcind
7
er hat wahrscheinlich einen schließenden Block später:if (somecondition) { @:</div> }
Simon_Weaver
Ja, er muss. Mein Punkt ist, dass solche Ansichten überarbeitet werden können, so dass solche doppelten Bedingungen nicht notwendig sind.
Marcind
1
@michielvoo Warum ist es schlecht, diese Methode zu verwenden, um beispielsweise einen bedingten Div-Wrapper zu haben? Auch in HTML5 schließen Sie keine <link>Tags.
Chris Haines