2010-11-16 25 views
13

Công trình này:Cách sạch nhất để có các khối mã nội tuyến bằng cách sử dụng công cụ xem ASP.NET Razor?

<li @{if (Model.Mode == "map") {<text> class="bselected"</text>}}>@Html.ActionLink("Map & Directions", MVC.Biz.Show(Model.SingleBiz.BizName, "map", string.Empty))</li> 

Nhưng thật xấu xí ... Có cách nào tốt hơn, sạch hơn để làm việc này không? trong mã này, tôi đang kiểm tra xem một số dữ liệu chế độ xem có rỗng hay không, nếu có thì hãy thêm một lớp.

Hoặc có một kỹ thuật khác để thực hiện điều này tốt hơn không?

Trả lời

15

tôi đăng một số phương pháp Html mở rộng ngày hôm qua có thể xử lý loại điều:

How to concisely create optional HTML attributes with razor view engine?

Sử dụng phương pháp này sẽ cung cấp cho bạn cú pháp Dao cạo sau:

<li @Html.Css("selected", Model.Mode == "map")>STUFF</li> 

LƯU Ý: bạn có thể chuỗi các thuộc tính với nhau để tạo các giá trị thuộc tính dựa trên nhiều điều kiện. Ví dụ:

<li @Html.Css("selected", true).Add("winner", false).Add("last", true)>STUFF</li> 

sẽ ra:

<li class="selected last">STUFF</li> 

Ngoài ra, nếu giá trị thuộc tính kết quả là trống thuộc tính sẽ sụp đổ để giữ html của bạn gọn gàng.

+0

Điều đó rất hay, tôi thích cách tiếp cận đó - rất thích jQuery. : D Tôi chắc chắn sẽ kiểm tra chúng. – Chaddeus

0

tôi có lẽ sẽ nói rằng bạn chỉ có thể thêm lớp để mô hình của bạn

<li class="@Model.Selected">@Html.ActionLink("Map & Directions", MVC.Biz.Show(Model.SingleBiz.BizName, "map", string.Empty))</li> 

Điều đó sẽ làm sạch nó lên ...

Removed ví dụ thứ hai khi tôi nhận ra nó sẽ không làm việc

+0

Tôi thích nơi bạn đang đi với điều này, nhưng tôi muốn tránh có lớp trống = "" trong đầu ra của tôi trong trường hợp nó không phải là mục đã chọn. – Chaddeus

+0

Bạn có thể sử dụng một trong hai ví dụ được cung cấp bởi Simon hoặc bản thân mình để làm ... Bạn chỉ cần cung cấp Mô hình với định nghĩa đầy đủ của bạn sau đó hoặc bạn làm những gì Simon đã làm với định nghĩa đầy đủ lớp – Buildstarted

+0

Đó là sự thật ... cảm ơn! – Chaddeus

12

Hoặc bạn có thể làm một cái gì đó như thế này:

@{ 
    var cssClass = (Model.Mode == "map") ? "selected" : ""; 
} 

<li class="@cssClass">@Html.ActionLink("Map & Directions", MVC.Biz.Show(Model.SingleBiz.BizName, "map", string.Empty))</li> 
+1

heh, bạn có thể phải thay đổi điều đó thành 'var @class = ...' vì lớp là từ khóa. và li của bạn sẽ phải là '@ (@ class)' – Buildstarted

+0

Ah, ofcourse - Tôi nên đã nhìn thấy điều đó! Cảm ơn bạn đã chỉ ra điều đó! Thay vào đó, tôi đổi tên nó thành cssClass để giữ cho mọi thứ trông đẹp mắt :) –

+0

Vâng, tốt hơn nhiều so với '@ (@' :) – Buildstarted

2

Làm thế nào về việc sử dụng một toán hạng ba hoặc để evalate một biểu thức như sau:

<li @(Model.Mode == "map" ? "class='bselected' : "")>@Html.ActionLink("Map & Directions", MVC.Biz.Show(Model.SingleBiz.BizName, "map", string.Empty))</li> 
2

Sử dụng một phương pháp trong @functions phần:

@functions{ 
    public HtmlString Li(bool selected, IHtmlString template) { 
     var result = string.Format("<li{0}>{1}</li>", 
     selected ? " class='selected'" : "")), 
     template); 
     return new HtmlString(result); 
    } 
} 

@* ... *@ 

@Li(Model.Mode == "map", Html.ActionLink("Map & Directions", MVC.Biz.Show(Model.SingleBiz.BizName, "map", string.Empty))) 
Các vấn đề liên quan