2012-02-26 29 views
1

考慮下面的字符串,如果我需要本地化它:包含動態變量的ASP .NET MVC本地化?

You need to write <b>@ViewBag.CharacterAmount</b> characters to be able to 
hand-in this homework. You're still missing <b id="charactersRemaining"> 
@ViewBag.CharacterAmount</b> characters to reach this limit. 

什麼是最好的辦法?使用string.Format有點複雜,因爲ASP .NET MVC轉義HTML代碼,此外,我寧願在我的資源文件中免費使用HTML代碼。但是,我仍然需要能夠引用來自JavaScript的b標記中的這些值。

任何想法?當您進行本地化時,您對此有何看法?

+0

我不知道有什麼辦法做到這一點這是乾淨的,不涉及存儲HTML中的資源並沒有使用'String.Format'。如果您只是執行'@ Html.Raw(String.Format(...))',那麼視圖引擎不會轉義該值。 – 2012-02-26 17:48:33

+0

而不是將HTML放入資源中,您可以通過格式調用傳遞它,如'String.Format(「您需要編寫{0}」,「」+ ViewBag.CharacterAmount +「」)' – 2012-02-26 17:50:47

回答

1

你可以寫一個自定義的助手:

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). 
+0

但是如果我的邏輯基於一位教師,但實際上,這個小部分與學生有關?我的強大模型會是什麼?這就是我使用ViewBag的原因。 – 2012-02-26 18:24:27

+2

@MathiasLykkegaardLorenzen,我不明白你的邏輯。視圖模型是您設計的專門用於滿足視圖要求的類。你把這個視圖所需的屬性。 – 2012-02-26 18:26:14

+0

但是,如果我的視圖需要同時顯示從會話中檢索到的類的數據以及從會話中檢索到的教師,該怎麼辦? – 2012-02-26 18:36:56