Почему я не могу использовать ресурсы в качестве ErrorMessage с DataAnnotations?

Почему я не могу сделать как это?

[Required(ErrorMessage = "*")]
[RegularExpression("^[a-zA-Z0-9_]*$", ErrorMessage = Resources.RegistrationModel.UsernameError)]
public string Username { get; set; }

Что сообщение об ошибке говорит мне?

Аргументом атрибута должно быть константное выражение, typeof выражение или выражение создания массива типа параметра атрибута.

17
задан DaveRandom 25 February 2013 в 22:21
поделиться

4 ответа

При использовании свойства ErrorMessage ему могут быть присвоены только постоянные строки или строковый литерал.

Используйте ErrorMessageResourceType и ErrorMessageResourceName вместо того, чтобы указать свои ресурсы.

[RegularExpression(
    "^[a-zA-Z0-9_]*$", 
    ErrorMessageResourceType=typeof(Resources.RegistrationModel),
    ErrorMessageResourceName= "UsernameError"
)]

Обратите внимание, что ресурсы должны быть общедоступными (можно установить в редакторе ресурсов).

Setting resource access to public

43
ответ дан 30 November 2019 в 10:53
поделиться

Это означает, что вы не можете определить значение аргумента, передаваемого в атрибут, во время выполнения , оно должно быть во время компиляции ], чтобы значение было встроено в сборку.

Значение сообщения об ошибке должно быть постоянным выражением.

Для информации, аргументы атрибута могут быть только типов bool, byte, char, short, int, long, float, double, string, System.Type и enums.

0
ответ дан 30 November 2019 в 10:53
поделиться

Вместо этого следует посмотреть свойства ErrorMessageResourceName и ErrorMessageResourceType этого атрибута. Они позволяют получить сообщение об ошибке из ресурса.

0
ответ дан 30 November 2019 в 10:53
поделиться

Попробуйте 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, где вы можете писать классы, наследующие случайный базовый класс во время выполнения. :)

Вот , что говорит об этом Скит.

1
ответ дан 30 November 2019 в 10:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: