Razor nie rozumie niezamkniętych tagów HTML


99

Dzięki RazorViewEngine mogę to zrobić:

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

ale wydaje mi się, że nie mogę tego zrobić (Razor jest zdezorientowany):

if (somecondition) {
    <div>
}

if (someothercondition) {
    </div>
}

Mam sytuację, w której muszę umieścić otwierające i zamykające tagi html w różnych blokach kodu - jak mogę to zrobić w Razor?

Odpowiedzi:


161

Spróbuj tak:

if (somecondition) {
    @:<div>
}


17
<text><div></text>działa, ale <text></div></text>nie działa.
friggle

@Stuntman, musisz to zrobić zarówno dla otwierającego, jak i zamykającego znacznika, aby działało.
Departamento B

i jak radzić sobie z tekstem wielowierszowym?
Dmitri Tsoy

Nie mogłem tego zrobić w tekście. if (warunek) {@: tag}. Musiałem to sformatować jak powyżej.
Mike

59

Aby wyjaśnić odpowiedź Darina, tj. Przedrostek kodu HTML w następujący sposób:

@:<html>

@: w Razor oznacza „renderuj coś jako zwykły tekst”

lub możesz użyć tego, co wyprowadza kod HTML tak, jak go pierwotnie napisałeś (można to również użyć, aby uniknąć automatycznego kodowania HTML, które robi Razor, jeśli próbujesz wyprowadzić HTML):

@Html.Raw("<html>")

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


2
rozwiązania są świetne, ale wyjaśnienia są nieocenione. dzięki!
jay

2
Wolę rozwiązanie @ Html.Raw ("<html>"), ponieważ pierwsze z nich zostało podzielone na multilinię przy użyciu automatycznego formatowania (ctrl + K ctrl + D)
Matteo Sganzetta

@MatteoSganzetta True, chyba że to, co wyprowadzasz, zawiera zmienne Razor, na przykład:@:<a href="@link" class="@classNames">@text</a>
qJake

Uważaj, używając @Html.Raw()- zobacz powiązany post SO
SliverNinja - MSFT

4

Możesz utworzyć niestandardową metodę pomocnika MVC. Z utworzeniem publicznej klasy statycznej MyRenderHelpers w przestrzeni nazw System.Web.Mvc.Htmli napisz metodę 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;
        }
    }
}

Teraz możesz użyć tej metody rozszerzenia w widoku brzytwy:

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

3

Fakt, że musisz to zrobić, zwykle wskazuje, że kod widoku nie jest poprawnie rozłożony na czynniki. Istotą HTML jest posiadanie zrównoważonych lub samozamykających się tagów (przynajmniej w HTML 4 wydaje się, że HTML 5 odchyla się od niego) i Razor opiera się na tym założeniu. Jeśli zamierzasz warunkowo usunąć a, <div>wtedy też gdzieś później wyjdziesz </div>. Po prostu umieść parę whoel w swoim ifwyciągu:

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

W przeciwnym razie otrzymasz dziwny kod, taki jak tutaj .


6
Moja sytuacja jest taka, że ​​chcę
sydneyos

Racja, chodzi mi o to, że w 99% przypadków prawdopodobnie nie powinieneś. Ale możesz zmieścić się w tym 1%, w którym to przypadku jest @:lub<text></text>
marcind

7
prawdopodobnie ma później blokadę zamykającą:if (somecondition) { @:</div> }
Simon_Weaver

tak, musi. Chodzi mi o to, że takie poglądy można przeformułować, aby takie podwójne uwarunkowania nie były konieczne.
marcind

1
@michielvoo Dlaczego używanie tej metody jest złe, na przykład w przypadku warunkowego opakowania elementu div? Również w HTML5 nie zamykasz <link>tagów.
Chris Haines
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.