你可以寫一個自定義的助手:
public static class ResourcesExtensions
{
public static IHtmlString Resource(this HtmlHelper htmlHelper, string message, params object[] args)
{
var parameters = args.Select(x => htmlHelper.Encode(x)).ToArray();
return new HtmlString(string.Format(message, parameters));
}
}
正如你所看到的HTML輔助唯一編碼值。我們完全控制了其餘的消息,因爲它在資源文件中,我們假設它是有效的HTML,所以XSS沒有問題。
,然後有一個資源文件到您的項目,該項目將包含例如以下項:
MyMessage = You need to write <b>{0}</b> characters to be able to hand-in this homework. You're still missing <b id="charactersRemaining">{1}</b> characters to reach this limit.
,然後不要忘記,這樣,Visual Studio生成,以紀念這個資源與PublicResXFileCodeGenerator
自定義工具文件一個公共類,它允許你訪問視圖中的屬性。
終於在視圖:
@Html.Resource(Resources.MyMessage, (int)ViewBag.CharacterAmount, (int)ViewBag.CharacterAmount)
你需要轉換的原因是因爲擴展方法無法調度的動態參數。但顯然,這不是一個問題,因爲在所有你不應該使用ViewBag/ViewData的,但你應該使用的視圖模型和強類型的視圖模型,以便在你真正的代碼,你將有:
@Html.Resource(Resources.MyMessage, Model.CharacterAmount, Model.CharacterAmount)
一個與此缺點方法是我們已經在資源文件中移動了一些標記,不幸的是這些標記可能會使得視圖不太容易理解,並且當我們需要修改它時,我們應該在所有本地化版本中執行此操作。
當然,另一種方法包括到你的資源文件中把這個標記的每一個不同的部分,然後:
@Resources.YouNeedToWrite <b>ViewBag.CharacterAmount</b> @Resources.StillMissing
<b id="charactersRemaining">ViewBag.CharacterAmount</b> @(Resources.ToReachLimit).
我不知道有什麼辦法做到這一點這是乾淨的,不涉及存儲HTML中的資源並沒有使用'String.Format'。如果您只是執行'@ Html.Raw(String.Format(...))',那麼視圖引擎不會轉義該值。 – 2012-02-26 17:48:33
而不是將HTML放入資源中,您可以通過格式調用傳遞它,如'String.Format(「您需要編寫{0}」,「」+ ViewBag.CharacterAmount +「」)' – 2012-02-26 17:50:47