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?

sydneyos
źródło

Odpowiedzi:

161

Spróbuj tak:

if (somecondition) {
    @:<div>
}
Darin Dimitrov
źródło
1
lub <text><div></text>- haacked.com/archive/2011/01/06/…
Simon_Weaver
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 )

Chris Halcrow
źródło
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)
Thomas Hauser
źródło
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 .

marcind
źródło
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