2013-11-01 26 views
0

雖然@ Html.Actionlink()助手非常方便在.cshtml文件中構建<a>元素,但是可以在C#字符串中構造它們,以便隨後在HTML輸出中正確渲染它們?如何在C#文本字符串中包含@Html.Actionlink?

例如,如果我給你一個字符串變量類似於以下值:

Book.ReadMore = "Click @Html.ActionLink(\"this link\", \"About\", \"Home\") to read more."; 

然後我試圖通過我的.cshtml頁面來顯示它(字面文字加鏈接),使用代碼類似於:

<p>@Model.ReadMore</p> 

所有我在瀏覽器中得到的是整個字符串完全按照我鍵入它,包括@Html ...等:

Click @Html.ActionLink("this link", "About", "Home") to read more. 

現在,對於正確的SoC,我知道在C#代碼中包含HTML東西並不是最好的做法,但是在這種情況下是否有可能獲得適當的鏈接,而不是字符串本身?

編輯:更多信息 - 該字符串只是約20-30個字符串集合中的一個項目(在視圖中使用for loop顯示)。只有少數這些項目需要鏈接(在每種情況下都不相同)。因爲,如上所述,我同意在模型代碼中使用Razor/HTML顯然不是一個好習慣,我試圖獲得一個簡單的方法(如果可能的話),這將使我可以靈活地在右側的某處建立鏈接放置,同時仍然產生MVC SoC的可維護性。

必須有一個「正確」的方式來做到這一點,這是簡單但可維護的。

+0

[如何使用MVC 3 @ Html.ActionLink裏面的C#代碼](http:// stackoverflow。com/questions/8331041/how-to-use-mvc-3-html-actionlink-inside -c-sharp-code) –

+0

上面的最高票數(不被接受)答案似乎有你在找什麼 –

回答

0

我不這麼認爲。 Razor視圖引擎將在運行時解釋ActionLink代碼,而將它作爲C#字符串的一部分填充將在編譯期間被解釋。

1

您的模型不應該包含HTML,這是一個視圖問題,屬於視圖代碼。可能你應該使用剃刀幫手。

在你的App_Code文件夾(創建一個,如果你沒有一個),添加一個文件,ReadMoreHelpers.cshtml:

@helper ReadMore() { 
    <text>Click @Html.ActionLink("this link", "About", "Home") to read more.</text> 
} 
在任意視圖

然後:

@ReadMoreHelpers.ReadMore() 

,這將輸出你想要的。如果您上把該財產在你看來堅持,你可以這樣做:

Book.ReadMore = "Click " + @Html.ActionLink("this link", "About", "Home").ToHtmlString() + " to read more."; 

然後在您的視圖,請確保您使用Raw

@Html.Raw(Book.ReadMore) 

但是,我不能推薦更多強烈的是你不把HTML放在你的模型屬性中。

+0

我當然同意100%關於在模型中沒有HTML。通過編輯原始文章中列出的更詳細的情況,我正在尋找如何避免它。我想知道是否有可能(並遵循最佳實踐)通過以下步驟實現乾淨的分離:(a)在模型中,聲明各種令牌的枚舉,然後(b)在模型中,將這些令牌包含在字符串項中(c)構建一個Razor Helper,將enum'd標記轉換爲ActionLink。 –

相關問題