2013-04-02 111 views
2

我簡化了這個問題,它是最簡單的形式。爲什麼這不會在我的頁面上輸出任何內容?Mvc raw沒有輸出

@if(true){Html.Raw("<a>test</a>");} 

編輯

這確實然而工作:

@if (true) { <span>@Html.Raw("<a>test</a>")</span>} 
+0

嘗試使用MvcHtmlString.Create()代替...雖然我也對此持懷疑態度。通常我在@If分支中使用圍繞呈現代碼的標籤。我無法給你一個堅實的理由,但這是標準行爲。 –

回答

3

我相信這是因爲剃刀引擎發生了混亂「是否需要」或「如何應對」與第一您編寫的代碼類型。在Html語法的開始

@if(true){@Html.Raw("<a>test</a>");} 

注意的@:如果你這樣做,將工作。關於這個,有an explanation here by Scott Guthrie。它總結是這樣的:

並非所有內容的容器塊用標籤元素標籤開始,雖然 並有場景中的剃刀解析器不能隱式檢測 內容塊。

Razor通過使您能夠通過在代碼塊中使用@:字符序列 明確指示內容行的開頭 來解決此問題。 @:序列表示後面的 內容行應被視爲內容塊。

現在我認爲這適用於您的具體問題。

+0

謝謝你解釋它。 – John

+0

歡迎您 –

1
@if(true){Html.Raw("<a>test</a>");} 

上面的行不會給你html輸出,因爲剃刀解析器通過讀取開始和結束字符或HTML元素推斷代碼結束。 因爲您的代碼在if條件中不包含任何html元素,所以解析器會將它作爲表達式,就像我們在控制器中所做的那樣。

@if (true) { <span>@Html.Raw("<a>test</a>")</span>} 

這是可行的,因爲@Html.Raw被包裹在span元素下。

+0

謝謝我懷疑爲什麼會發生這種情況,von訴上面有一個很好的解釋。 – John