Razor ไม่เข้าใจแท็ก html ที่ไม่ปิด


100

ด้วย RazorViewEngine ฉันสามารถทำได้:

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

แต่ดูเหมือนจะทำไม่ได้ (Razor สับสน):

if (somecondition) {
    <div>
}

if (someothercondition) {
    </div>
}

ฉันมีสถานการณ์ที่ฉันจำเป็นต้องใส่แท็ก html เปิดและปิดในบล็อกโค้ดต่างๆ - ฉันจะทำสิ่งนี้ใน Razor ได้อย่างไร?

คำตอบ:


162

ลองทำดังนี้

if (somecondition) {
    @:<div>
}

1
หรือ<text><div></text>- haacked.com/archive/2011/01/06/...
Simon_Weaver

17
<text><div></text>ใช้งานได้ แต่<text></div></text>ไม่ได้
พลิก

@Stuntman คุณต้องทำสิ่งนี้ทั้งแท็กเปิดและแท็กปิดเพื่อให้มันทำงานได้
B

และวิธีจัดการกับข้อความหลายบรรทัด?
Dmitri Tsoy

ฉันไม่สามารถทำแบบอินไลน์ได้ if (เงื่อนไข) {@: tag} ฉันต้องจัดรูปแบบเหมือนด้านบน
Mike

59

เพื่ออธิบายคำตอบของ Darin คือการขึ้นต้น HTML แบบนี้:

@:<html>

@: ใน Razor หมายถึง 'แสดงบางสิ่งเป็นข้อความธรรมดา'

หรือคุณสามารถใช้สิ่งนี้ซึ่งจะส่งออก HTML ตามที่คุณเขียนขึ้นมา (สามารถใช้เพื่อหลีกเลี่ยงการเข้ารหัส HTML อัตโนมัติที่ Razor ทำหากคุณพยายามที่จะส่งออก HTML):

@Html.Raw("<html>")

(อ้างอิง Html.Raw จาก MS - http://msdn.microsoft.com/en-us/library/gg568896(v=vs.111).aspx )


2
วิธีแก้ปัญหานั้นยอดเยี่ยม แต่คำอธิบายมีค่า ขอบคุณ!
jay

2
ฉันชอบโซลูชัน @ Html.Raw ("<html>") เนื่องจากอันแรกถูกแบ่งเป็นหลาย
บรรทัด

@MatteoSganzetta True เว้นแต่สิ่งที่คุณกำลังส่งออกจะมีตัวแปร Razor โรยลงไปเช่น:@:<a href="@link" class="@classNames">@text</a>
qJake

โปรดใช้ความระมัดระวัง@Html.Raw()- ดู SO post ที่เกี่ยวข้อง
SliverNinja - MSFT

4

คุณสามารถสร้างวิธี MVC Helper ที่กำหนดเองได้ สำหรับคุณสร้าง MyRenderHelpers คลาสแบบคงที่สาธารณะในเนมสเปซSystem.Web.Mvc.Htmlและเขียนเมธอด 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;
        }
    }
}

ตอนนี้คุณสามารถใช้วิธีการขยายนี้ในมุมมองมีดโกนของคุณ:

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

3

ความจริงที่คุณต้องทำมักจะบ่งชี้ว่ารหัสมุมมองของคุณไม่ได้รับการแยกปัจจัยอย่างถูกต้อง ลักษณะของ HTML คือการมีแท็กที่สมดุลหรือปิดล้อมในตัวเอง (อย่างน้อยใน HTML 4, HTML 5 ดูเหมือนจะเอนเอียงไปจากมัน) และ Razor ขึ้นอยู่กับสมมติฐานนั้น ถ้าคุณจะไปตามเงื่อนไข ouptut แล้วคุณยังจะอยู่ที่ไหนสักแห่งในภายหลังเอาท์พุท<div> </div>เพียงใส่คู่ whoel ในifคำสั่งของคุณ:

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

มิฉะนั้นคุณจะจบลงด้วยรหัสแปลก ๆ เหมือนที่นี่


6
สถานการณ์ของฉันคือฉันต้องการ
sydneyos

ใช่ประเด็นของฉันคือในกรณี 99% คุณอาจไม่ควร แต่คุณอาจพอดีกับ 1% ซึ่งในกรณีนี้มี@:หรือ<text></text>
marcind

7
เขาอาจมีการปิดกั้นในภายหลัง:if (somecondition) { @:</div> }
Simon_Weaver

ใช่เขาต้อง ประเด็นของฉันคือมุมมองดังกล่าวสามารถปรับโครงสร้างใหม่ได้เพื่อให้ไม่จำเป็นต้องมีเงื่อนไขคู่ดังกล่าว
marcind

1
@michielvoo ทำไมการใช้วิธีนี้จึงไม่ดีในการมี div wrapper เช่น นอกจากนี้ใน HTML5 คุณไม่ได้ปิด<link>แท็ก
Chris Haines
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.