2010-11-28 44 views
14

Làm cách nào để hiển thị một mẩu Html thành biến trong Razor? Trong Spark tôi sử dụng để viết các đoạn mã sau:Dao cạo - cách hiển thị nội dung thành biến số

<content var="t"> 
    <a class="tab" href="">Tab name</a> 
</content> 

<content var="tc"> 
    <div class="tabcontent"> 
     <p>Here goes tab content</p> 
    </div> 
</content> 

!{tabs(t, tc)} 

hai biến được truyền cho một macro mà làm tất cả các gói đẹp của nội dung vào tab sheet.

Cách tốt nhất để thực hiện tương tự trong Razor là gì?

Cập nhật: Tôi nghĩ rằng tôi đã nhận nó ..

Trong Razor, các @<text>...</text> xây dựng có thể được sử dụng để sản xuất các biểu thức lambda, có thể được tái sử dụng sau này, đó là một tương đương dài gán một đoạn mã HTML vào một biến. Ví dụ trên có thể được triển khai theo cách sau:

Func<int, object> t = 
    @<text> 
     <a class="tab" href="">Tab name</a> 
    </text>; 

Func<int, object> tc = 
    @<text> 
     <div class="tabcontent"> 
      <p>Here goes tab content</p> 
     </div> 
    </text>; 


@tabs(t(0), tc(0)) 

Tôi không thể tìm ra cách viết lambdas không tham số (Func<object>). tham số int trong cả hai lambdas ở trên là giả. Dao cạo dường như yêu cầu một tham số (và đã tạo ra một biến "item" để biểu thị nó trong biểu thức).

Trả lời

5

Có lẽ bạn có thể sử dụng HtmlString? Tôi không nghĩ rằng tôi thích điều này nhiều, nhưng đây là những gì tôi muốn thử như một bản dịch chính xác của những gì bạn có ...

@{ 
    var t = new HtmlString("<a class='tab' href=''>Tab name</a>"); 
    var tc = new HtmlString("<div class='tabcontent'><p>Here goes tab content</p></div>"); 
} 
@tabs(t, tc) 

Vì vậy ... Tôi không biết những gì vĩ mô Spark của bạn trông giống như , nhưng nó có vẻ như một cơ hội để sử dụng một helper trong Razor. Bạn có thể có một cái gì đó như:

@helper Tabs(string tabName, string tabContent) 
{ 
    <!-- some wrapper code --> 
    <a class="tab" href="">@(tabName)</a> 
    <!-- some more wrapper code --> 
    <div class="tabcontent"> 
     <p>@(tabContent)</p> 
    </div> 
    <!-- still more wrapper code --> 
} 

Sau đó, bạn gọi đó là từ trong trang của bạn như sau:

@Tabs("Tab Name", "Here goes tab content") 
+0

cảm ơn, tôi nghĩ rằng những gì tôi thực sự cần là một cú pháp inline helper. Tôi không điều này có sẵn trong Razor được nêu ra. giải pháp sẽ là khai báo một trình trợ giúp rõ ràng, có thể được gọi và kết quả có thể được gán vào một biến. – Andy

+0

Tôi đã sai trong nhận xét ở trên. Cú pháp có sẵn, không yêu cầu người trợ giúp rõ ràng. Biểu thức lambda có thể được sử dụng thay thế. Xem câu hỏi được cập nhật của tôi. – Andy

5

Chỉ trong trường hợp bất cứ ai khác tìm thấy bài đăng này (như tôi đã làm), Update Andy là gần như có . Ngoài ví dụ được đưa ra, tất cả những gì bạn phải làm để truy cập 'int' trong ví dụ được đưa ra là tham chiếu @item. Trong các khối @<text></text>, biến số item chứa mô hình mà nó được gọi.

Dưới đây là một ví dụ về cách nó có thể được sử dụng:

@model PageData 

@{ 
    Func<Customer, object> sayHi = 
     @<text> 
      <li>Hello @(item.FirstName)!</li> 
     </text>; 
} 

<ul> 
    @foreach(var customer in Model.Customers) 
    { 
     sayHi(customer); 
    } 
</ul> 

Trong hầu hết các trường hợp có lẽ bạn nên sử dụng một cái nhìn cục bộ thay vì một chức năng như thế này. Nhưng trong một số trường hợp hiếm hoi, không thể xem một phần (chẳng hạn như khi sử dụng thư viện RazorEngine), công trình này sẽ hoạt động.

+0

Bạn đã chỉ ra sự thật là không nổi tiếng, cảm ơn! – Sel

7

Về cơ bản OP đã trả lời các vấn đề ở chỗ bạn có thể làm một cái gì đó như:

@{ 
    Func<dynamic, object> a = @<text> 
     Some Text   
    </text>; 
    @a(new object()) 
}  

Nếu văn bản là cho một dòng duy nhất bạn có thể thậm chí sử dụng "@:" nhà điều hành, chỉ remmebr có một dấu chấm phẩy (hoặc nếu nó cần bất kỳ dấu ngoặc đóng cửa hoặc ngoặc đơn) trên dòng tiếp theo, như trong ví dụ sau:

@{ 
    Func<dynamic, object> a = @: Some Text 
    ;  
    @a(new object()) 
} 

Tuy nhiên bạn có thể chụp trực tiếp như là một chuỗi nếu bạn muốn

@{ 
    string a = ((Func<dynamic, object>)(@<text> 
        Some Text 
       </text>))("").ToString(); 
    @a //Output directly as a string   
} 

Bạn thậm chí có thể rút gọn trong một hàm:

@functions{ 
    public string ToString(Func<dynamic, object> input) 
    { 
      return input("").ToString(); 
    } 
} 

@{ 
    string a = ToString(@<text> 
        Some Text 
       </text>); 
    @a //Output directly as a string   
} 
0

Nếu bạn có một IHtmlContentBuilder theo quan điểm của Razor, bạn có thể sử dụng các phần mở rộng.

public static IHtmlContentBuilder AppendRazor(this IHtmlContentBuilder htmlContentBuilder, Func<IHtmlContent, dynamic> lamda) 
    { 
     var html = lamda(null); 
     return htmlContentBuilder.AppendHtml(html); 
    } 

    public static IHtmlContentBuilder AppendRazor<T>(this IHtmlContentBuilder htmlContentBuilder, Func<T, IHtmlContent> lamda, T model) 
    { 
     var html = lamda(model); 
     return htmlContentBuilder.AppendHtml(html); 
    } 

Cách sử dụng

@{ 
    HtmlContentBuilder contentBuilder = new HtmlContentBuilder(); 
    contentBuilder.AppendRazor(@<text><p>Hello @Model.Name<p></text>); 
    contentBuilder.AppendRazor(@<text><p>Hello @item.CustomerName<p></text>, customer); 
} 
<div> 
    @contentBuilder 
</div> 
Các vấn đề liên quan