Почему я не могу сделать как это?
[Required(ErrorMessage = "*")]
[RegularExpression("^[a-zA-Z0-9_]*$", ErrorMessage = Resources.RegistrationModel.UsernameError)]
public string Username { get; set; }
Что сообщение об ошибке говорит мне?
Аргументом атрибута должно быть константное выражение, typeof выражение или выражение создания массива типа параметра атрибута.
При использовании свойства ErrorMessage
ему могут быть присвоены только постоянные строки или строковый литерал.
Используйте ErrorMessageResourceType
и ErrorMessageResourceName
вместо того, чтобы указать свои ресурсы.
[RegularExpression(
"^[a-zA-Z0-9_]*$",
ErrorMessageResourceType=typeof(Resources.RegistrationModel),
ErrorMessageResourceName= "UsernameError"
)]
Обратите внимание, что ресурсы должны быть общедоступными (можно установить в редакторе ресурсов).
Это означает, что вы не можете определить значение аргумента, передаваемого в атрибут, во время выполнения
, оно должно быть во время компиляции
], чтобы значение было встроено в сборку.
Значение сообщения об ошибке должно быть постоянным выражением.
Для информации, аргументы атрибута могут быть только типов bool, byte, char, short, int, long, float, double, string, System.Type и enums.
Вместо этого следует посмотреть свойства ErrorMessageResourceName
и ErrorMessageResourceType
этого атрибута. Они позволяют получить сообщение об ошибке из ресурса.
Попробуйте 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 или выражением создания массива с типом параметра атрибута.
Это уже говорит само за себя. C # не является динамическим языком, как Ruby, где вы можете писать классы, наследующие случайный базовый класс во время выполнения. :)
Вот , что говорит об этом Скит.