Вы можете написать собственный помощник:
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).
я не уверен, есть ли способ сделать это, что чистая, что не включает в себя хранение HTML в ресурсах и не используя 'String.Format'. Если вы просто делаете '@ Html.Raw (String.Format (...)), значение не будет выведено движком просмотра. –
Вместо того, чтобы помещать HTML в ресурс, вы можете передать его в вызове формата, например 'String.Format (« Вам нужно написать {0} "," "+ ViewBag.CharacterAmount +" ")' –