2012-02-26 2 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-кода в своих файлах ресурсов. Тем не менее, мне все равно нужно иметь возможность ссылаться на эти значения внутри тегов b из JavaScript.

Любые идеи? Каков ваш подход к этому при локализации?

+0

я не уверен, есть ли способ сделать это, что чистая, что не включает в себя хранение HTML в ресурсах и не используя 'String.Format'. Если вы просто делаете '@ Html.Raw (String.Format (...)), значение не будет выведено движком просмотра. –

+0

Вместо того, чтобы помещать HTML в ресурс, вы можете передать его в вызове формата, например 'String.Format (« Вам нужно написать {0} "," "+ ViewBag.CharacterAmount +" ")' –

ответ

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. 

, а затем не забудьте пометить этот файл ресурсов с PublicResXFileCodeGenerator пользовательского инструмента, так что Visual Studio генерирует открытый класс, который позволит вам получить доступ к свойствам в представлении.

и, наконец, в виде:

@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

Но что, если мое представление должно отображать как данные класса, извлеченного из сеанса, так и Учителя, извлеченного из сеанса? –

Смежные вопросы