Razor không hiểu các thẻ html chưa được đóng


99

Với RazorViewEngine, tôi có thể làm điều này:

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

nhưng tôi dường như không thể làm điều này (Razor bối rối):

if (somecondition) {
    <div>
}

if (someothercondition) {
    </div>
}

Tôi gặp tình huống cần đặt các thẻ html mở và đóng của mình trong các khối mã khác nhau - làm cách nào để thực hiện việc này trong Razor?

Câu trả lời:


161

Hãy thử như thế này:

if (somecondition) {
    @:<div>
}

1
hoặc <text><div></text>- haacked.com/archive/2011/01/06/...
Simon_Weaver

17
<text><div></text>hoạt động, nhưng <text></div></text>không.
rùng mình

@Stuntman bạn cần làm điều này cho cả thẻ mở và thẻ đóng để làm cho nó hoạt động.
Khởi hành từ

và làm thế nào để đối phó với văn bản nhiều dòng?
Dmitri Tsoy

Tôi không thể làm điều này nội tuyến. if (điều kiện) {@: tag}. Tôi đã phải định dạng nó như trên.
Mike

59

Để giải thích câu trả lời của Darin, tức là thêm tiền tố vào HTML như sau:

@:<html>

@: trong Razor có nghĩa là 'hiển thị thứ gì đó dưới dạng văn bản thuần túy'

hoặc bạn có thể sử dụng công cụ này để xuất ra HTML như bạn đã viết ban đầu (điều này cũng có thể được sử dụng để tránh mã hóa HTML tự động mà Razor thực hiện nếu bạn đang cố gắng xuất ra HTML):

@Html.Raw("<html>")

(Tham khảo Html.Raw từ MS - http://msdn.microsoft.com/en-us/library/gg568896(v=vs.111).aspx )


2
giải pháp là tuyệt vời, nhưng lời giải thích là vô giá. cảm ơn!
jay

2
Tôi thích @ Html.Raw ( "<html>") giải pháp, bởi vì một trong những đầu tiên là phân chia trên nhiều dòng khi sử dụng auto định dạng (Ctrl + K Ctrl + D)
Matteo Sganzetta

@MatteoSganzetta Đúng trừ khi những gì bạn đang xuất ra có các biến Razor được rắc vào đó, ví dụ:@:<a href="@link" class="@classNames">@text</a>
qJake

Hãy cẩn thận bằng cách sử dụng @Html.Raw()- xem bài đăng SO liên quan
SliverNinja - MSFT

4

Bạn có thể tạo phương thức Trình trợ giúp MVC tùy chỉnh. Đối với việc bạn tạo một lớp tĩnh công khai MyRenderHelpers trong không gian tên System.Web.Mvc.Htmlvà viết một phương thức 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;
        }
    }
}

Bây giờ bạn có thể sử dụng phương pháp mở rộng này trong chế độ xem dao cạo của mình:

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

3

Thực tế là bạn phải làm điều này thường chỉ ra rằng mã chế độ xem của bạn không được tính đúng yếu tố. Bản chất của HTML là có các thẻ cân bằng hoặc tự đóng (ít nhất là trong HTML 4, HTML 5 dường như nghiêng về phía nó) và Razor phụ thuộc vào giả định đó. Nếu bạn sẽ xuất hiện có điều kiện a <div>thì bạn cũng sẽ xuất hiện ở đâu đó sau đó </div>. Chỉ cần đặt cặp điếm trong iftuyên bố của bạn :

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

Nếu không, bạn sẽ có mã kỳ lạ như ở đây .


6
Tình hình của tôi là tôi muốn
sydneyos

Đúng vậy, quan điểm của tôi là trong 99% trường hợp, bạn có thể không nên. Nhưng bạn có thể phù hợp với rằng 1% trong trường hợp này có @:hay<text></text>
marcind

7
ông có thể có một khối bế mạc sau:if (somecondition) { @:</div> }
Simon_Weaver

phải, anh ấy phải làm vậy. quan điểm của tôi là các khung nhìn như vậy có thể được cấu trúc lại để các điều kiện kép như vậy không cần thiết.
marcind

1
@michielvoo Tại sao lại sử dụng phương pháp này để có một trình bao bọc div có điều kiện chẳng hạn? Ngoài ra trong HTML5, bạn không đóng <link>thẻ.
Chris Haines
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.