Почему я не могу использовать ресурсы как ErrorMessage с DataAnnotations?
Почему я не могу это сделать?
[Required(ErrorMessage = "*")]
[RegularExpression("^[a-zA-Z0-9_]*$", ErrorMessage = Resources.RegistrationModel.UsernameError)]
public string Username { get; set; }
Каково сообщение об ошибке, сообщающее мне?
Аргумент атрибута должен быть постоянное выражение, typeof выражение или создание массива выражение параметра атрибута тип.
Ответы
Ответ 1
Когда вы используете свойство ErrorMessage
могут быть назначены только константные строки или строковый литерал.
ErrorMessageResourceName
этого используйте ErrorMessageResourceType
и ErrorMessageResourceName
чтобы конкретизировать ваши ресурсы.
[RegularExpression(
"^[a-zA-Z0-9_]*$",
ErrorMessageResourceType=typeof(Resources.RegistrationModel),
ErrorMessageResourceName= "UsernameError"
)]
Обратите внимание, что ресурсы должны быть общедоступными (их можно установить в редакторе ресурсов).
![Setting resource access to public]()
Ответ 2
Пожалуйста, просмотрите эту ссылку: http://code.msdn.microsoft.com/Getting-Started-WCF-RIA-1469cbe2/sourcecode?fileId=19242&pathId=774666288 (ссылка сломана, но оставлена для целей присвоения)
public sealed partial class RegistrationData
{
[Key]
[Required(ErrorMessageResourceName = "ValidationErrorRequiredField", ErrorMessageResourceType = typeof(ErrorResources))]
[Display(Order = 0, Name = "UserNameLabel", ResourceType = typeof(RegistrationDataResources))]
[RegularExpression("^[a-zA-Z0-9_]*$", ErrorMessageResourceName = "ValidationErrorInvalidUserName", ErrorMessageResourceType = typeof(ErrorResources))]
[StringLength(255, MinimumLength = 4, ErrorMessageResourceName = "ValidationErrorBadUserNameLength", ErrorMessageResourceType = typeof(ErrorResources))]
public string UserName { get; set; }
Ответ 3
Попробуйте FluentModelMetaDataProvider.
Удалось использовать ресурсы для сообщений об ошибках строго типизированным способом.
Похож:
using System.Web.Mvc.Extensibility;
namespace UI.Model
{
public class StoreInputMetadata : ModelMetadataConfigurationBase<StoreInput>
{
public StoreInputMetadata()
{
Configure(m => m.Id)
.Hide();
Configure(model => model.Name)
.Required(Resources.Whatever.StoreIsRequired)
.MaximumLength(64, Resources.Whatever.StoreNameLengthSomething);
}
}
}
Каково сообщение об ошибке, сообщающее мне?
Аргумент атрибута должен быть константным выражением, выражением typeof или выражением создания массива типа параметра атрибута.
Это уже понятно. С# не является динамическим языком, как Ruby, где вы можете писать классы, которые наследуют случайный базовый класс во время выполнения.:)
Вот, что говорит Скит об этом.
Ответ 4
Это означает, что вы не можете определить значение аргумента, которое вы передаете в атрибуте в runtime
, оно должно быть в compile time
, поэтому значение вставляется в сборку.
Значение сообщения об ошибке должно быть постоянным выражением.
Для информации атрибуты атрибутов могут иметь только типы bool, byte, char, short, int, long, float, double, string, System.Type и перечисления.
Ответ 5
Вместо этого вы должны искать свойства ErrorMessageResourceName
и ErrorMessageResourceType
этого атрибута. Они позволяют вывести сообщение об ошибке из ресурса.