2012-02-26 4 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タグ内のそれらの値を参照できる必要があります。

アイデア?ローカリゼーションを行うときにこれにあなたのアプローチは何ですか?あなたがHTMLヘルパーは値のみを符号化し見ることができるように

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

+0

私は保存伴わないクリーンなのですそれを行うにはどのような方法があるかわかりませんリソース内のHTMLで、 'String.Format'を使用していません。 '@ H​​tml.Raw(String.Format(...))'だけを実行すると、値はビューエンジンによってエスケープされません。 –

+0

リソースにHTMLを入れるのではなく、 'String.Format(" {0} "、" "+ ViewBag.CharacterAmount +" "と書いてください)のような形式で渡すことができます。 –

答えて

1

はカスタムヘルパーを書くことができます。メッセージの残りの部分はリソースファイルに入っているので、私たちはそれを完全に制御しています。これは有効な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を使用しています。 –

+2

@MathiasLykkegaardLorenzen、私はあなたのロジックについて理解していません。ビューモデルは、ビューの要件を具体的に満たすように設計したクラスです。このビューに必要なプロパティを設定します。 –

+0

しかし、セッションから取得したクラスのデータとセッションから取得した教師の両方のデータを表示する必要がある場合はどうすればよいですか? –

関連する問題