2010-11-28 89 views
14

如何將一段Html渲染成Razor中的變量? 火花我以前寫下面的代碼:剃刀 - 如何將內容渲染到變量中

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

兩個變量獲取傳遞到執行內容進入標籤紙的所有漂亮包裝的宏。

在剃刀上做同樣的事情最好的方法是什麼?

更新:我想我它..

在剃刀中,@<text>...</text>構建體可以是用戶產生lambda表達式,其可以稍後再利用,這是分配塊的HTML的擴展等效到一個變量。上面的例子可以通過以下方式實現:

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)) 

我只是無法弄清楚如何寫參數的lambda表達式(Func<object>)。上述兩個lambda中的int參數都是虛擬的。 Razor似乎需要一個參數(並且已經在表達式中創建了一個變量「item」來表示它)。

回答

5

也許你可以使用HtmlString?我不認爲我喜歡這麼多,但這裏是我想嘗試的你有什麼確切的翻譯...

@{ 
    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) 

所以...我不知道你的星火宏是什麼樣子,但它似乎是一個在剃刀中使用幫手的機會。你可能會碰到這樣的:

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

然後調用,從你的頁面,如下所示:

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

感謝,我想我真正需要的是一個內聯幫手語法。我不知道這在剃刀中是否可用。解決方案將是聲明一個顯式的幫助器,可以調用該幫助器,並將結果分配給一個變量。 – Andy 2010-12-29 18:04:13

+0

我在上面的評論中錯了。語法可用,不需要顯式幫助器。可以使用Lambda表達式來代替。看到我更新的問題。 – Andy 2010-12-30 15:31:41

5

萬一別人發現這個職位(像我一樣),安迪的更新幾乎是有。除了給出的例子之外,在給出的例子中,你所要做的只是訪問'int',它是參考文獻@item。在@<text></text>塊中,變量item包含它被調用的模型。

下面是它如何被使用的例子:

@model PageData 

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

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

在大多數情況下,你應該使用的,而不是像這樣的功能的局部視圖。但在罕見的情況下,部分視圖是不可能的(例如使用RazorEngine庫時),這是有效的。

7

基本上OP已經回答了,你可以做類似的問題:

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

如果文本是單行只有你甚至可以用「@:」操作符,只是remmebr有分號(或者如果它需要任何結束括號或括號)下一行,如下面的例子:

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

但是你可以直接捕捉到它作爲一個字符串,如果你想

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

你甚至可以將其封裝在一個函數:

@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

如果您在Razor視圖有IHtmlContentBuilder,您可以使用這些擴展。

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

使用

​​