У меня есть локализованное приложение, и мне интересно, можно ли DisplayName
установить свойство для определенной модели из ресурса.
Я хотел бы сделать что-то вроде этого:
public class MyModel {
[Required]
[DisplayName(Resources.Resources.labelForName)]
public string name{ get; set; }
}
Но я не могу этого сделать, поскольку компилятор говорит: «Аргументом атрибута должно быть константное выражение, выражение typeof или выражение создания массива типа параметра атрибута» :(
Есть ли обходные пути? Я выводю метки вручную, но они мне нужны для вывода валидатора!
c#
asp.net-mvc
localization
resources
resx
Palantir
источник
источник
Если вы используете MVC 3 и .NET 4, вы можете использовать новый
Display
атрибут вSystem.ComponentModel.DataAnnotations
пространстве имен. Этот атрибут заменяетDisplayName
атрибут и предоставляет гораздо больше функций, включая поддержку локализации.В вашем случае вы бы использовали это так:
Как примечание, этот атрибут не будет работать с ресурсами внутри
App_GlobalResources
илиApp_LocalResources
. Это связано с пользовательским инструментом (GlobalResourceProxyGenerator
), который используют эти ресурсы. Вместо этого убедитесь, что для вашего файла ресурсов установлено значение «Встроенный ресурс», и используйте специальный инструмент ResXFileCodeGenerator.(Как дополнительное примечание, вы не должны использовать
App_GlobalResources
илиApp_LocalResources
с MVC. Вы можете прочитать больше о том, почему это так, здесь )источник
Name = "labelForName"
вас также можно использоватьName = nameof(Resources.Resources.labelForName)
.Если вы откроете свой файл ресурсов и измените модификатор доступа на public или internal, он сгенерирует класс из вашего файла ресурсов, который позволит вам создавать строго типизированные ссылки на ресурсы.
Это означает, что вы можете сделать что-то вроде этого (используя C # 6.0). Тогда вам не нужно помнить, было ли имя в нижнем или верблюжьем корпусе. И вы можете увидеть, используют ли другие свойства то же значение ресурса, что и найти все ссылки.
источник
Обновить:
Я знаю, что уже слишком поздно, но я бы хотел добавить это обновление:
Я использую поставщика метаданных обычной модели, представленного Филом Хаакедом, он более мощный и простой в применении, посмотрите на него: ConventionalModelMetadataProvider
Старый ответ
Вот если вы хотите поддерживать много типов ресурсов:
Тогда используйте это так:
Полное руководство по локализации смотрите на этой странице .
источник
Я получил ответ Gunders, работая с моими App_GlobalResources, выбрав свойства ресурсов и переключив «Custom Tool» на «PublicResXFileCodeGenerator» и собрав действие «Embedded Resource». Пожалуйста, обратите внимание на комментарий Gunders ниже.
Работает как шарм :)
источник
Определите Имя атрибута, который используется для ключа ресурса, после C # 6.0 вы можете использовать
nameof
для строгой типизированной поддержки вместо жесткого кодирования ключа.Установите культуру текущего потока в контроллере.
Resource.Culture = CultureInfo.GetCultureInfo("zh-CN");
Установить общедоступность ресурса
Отображать метку в cshtml вот так
@Html.DisplayNameFor(model => model.Age)
источник