Razor kapatılmamış html etiketlerini anlamıyor


100

RazorViewEngine ile şunu yapabilirim:

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

ama bunu yapamıyorum (Razor'un kafası karışıyor):

if (somecondition) {
    <div>
}

if (someothercondition) {
    </div>
}

Açılış ve kapanış html etiketlerimi farklı kod bloklarına koymam gereken bir durum var - bunu Razor'da nasıl yapabilirim?

Yanıtlar:


162

Şöyle dene:

if (somecondition) {
    @:<div>
}

1

17
<text><div></text>çalışır, ancak <text></div></text>çalışmaz.
2013 saat

@Stuntman, çalışmasını sağlamak için bunu hem açılış hem de kapanış etiketleri için yapmanız gerekir.
Departamento B

ve çok satırlı metinle nasıl başa çıkılır?
Dmitri Tsoy

Bunu satır içi yapamadım. if (koşul) {@: tag}. Yukarıdaki gibi biçimlendirmem gerekiyordu.
Mike

59

Darin'in cevabını açıklamak için, yani HTML'nin önüne şu şekilde eklemek:

@:<html>

@: Razor'da 'bir şeyi düz metin olarak işle' anlamına gelir

veya bunu kullanabilirsiniz, bu da HTML'yi normal olarak yazdığınız gibi çıkarır (bu, HTML çıktısını almaya çalışıyorsanız Razor'un yaptığı otomatik HTML kodlamasını önlemek için de kullanılabilir):

@Html.Raw("<html>")

(MS'den Html.Raw referansı - http://msdn.microsoft.com/en-us/library/gg568896(v=vs.111).aspx )


2
çözümler harika, ancak açıklamalar paha biçilemez. Teşekkürler!
jay

2
@ Html.Raw ("<html>") çözümünü tercih ediyorum, çünkü ilki otomatik biçimlendirme (ctrl + K ctrl + D) kullanılırken
çoklu satırda bölünmüştü

@MatteoSganzetta Çıktısını aldığınız şeyin içine Razor değişkenleri serpilmediği sürece doğrudur, örneğin:@:<a href="@link" class="@classNames">@text</a>
qJake


4

Özel bir MVC Yardımcısı yöntemi oluşturabilirsiniz. Sizin için ad alanında bir genel statik sınıf MyRenderHelpers oluşturun System.Web.Mvc.Htmlve bir Html yöntemi yazın.

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;
        }
    }
}

Artık bu uzantı yöntemini jilet görünümünüzde kullanabilirsiniz:

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

3

Bunu yapmanız gerektiği gerçeği genellikle görünüm kodunuzun doğru çarpanlara ayrılmadığını gösterir. HTML'nin doğası dengeli veya kendi içine alınmış etiketlere sahip olmaktır (en azından HTML 4'te, HTML 5 bundan uzaklaşıyor gibi görünüyor) ve Razor bu varsayıma bağlı. Eğer şartlı olarak a çıkacaksanız, <div>o zaman daha sonra bir yerde de çıktı alacaksınız </div>. Whel çiftini ifadenize koyun if:

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

Aksi takdirde, buradaki gibi garip bir kodla sonuçlanırsınız .


6
Benim durumum şunu yapmak istiyorum
sydneyos

Doğru, benim açımdan,% 99 vakada muhtemelen yapmamalısın. Ama bu% 1'e uyabilirsiniz, bu durumda @:veya<text></text>
marcind

7
muhtemelen daha sonra bir kapanış bloğu vardır:if (somecondition) { @:</div> }
Simon_Weaver

evet, mecbur. Benim açımdan, bu tür görüşlerin yeniden düzenlenebilmesidir, böylece bu tür ikili koşullara gerek kalmaz.
marcind

1
@michielvoo Örneğin, koşullu bir div sarmalayıcıya sahip olmak için bu yöntemi kullanmak neden kötü? Ayrıca HTML5'te <link>etiketleri kapatmazsınız .
Chris Haines
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.