Подтвердить что ты не робот

MVC 4 игнорирует DefaultModelBinder.ResourceClassKey

Добавление файла ресурса в App_GlobalResources с помощью клавиши PropertyValueRequired и изменение DefaultModelBinder.ResourceClassKey к имени файла не влияет на MVC 4. Строка The {0} field is required никогда не изменяется. Я не хочу устанавливать тип и ключ класса ресурсов для каждого обязательного поля. Я что-то пропустил?

Edit:

Я сделал небольшую модификацию кода Дарина Димитрова, чтобы сохранить требуемые настройки:

public class MyRequiredAttributeAdapter : RequiredAttributeAdapter
{
    public MyRequiredAttributeAdapter(
        ModelMetadata metadata,
        ControllerContext context,
        RequiredAttribute attribute
    )
        : base(metadata, context, attribute)
    {
        if (attribute.ErrorMessageResourceType == null)
        {
            attribute.ErrorMessageResourceType = typeof(Messages);
        }
        if (attribute.ErrorMessageResourceName == null)
        {
            attribute.ErrorMessageResourceName = "PropertyValueRequired";
        }
    }
}
4b9b3361

Ответ 1

Это не относится к ASP.NET MVC 4. Это было то же самое в ASP.NET MVC 3. Вы не можете установить требуемое сообщение, используя DefaultModelBinder.ResourceClassKey, только PropertyValueInvalid.

Одним из способов достижения того, что вы ищете, является определение пользовательского RequiredAttributeAdapter:

public class MyRequiredAttributeAdapter : RequiredAttributeAdapter
{
    public MyRequiredAttributeAdapter(
        ModelMetadata metadata,
        ControllerContext context,
        RequiredAttribute attribute
    ) : base(metadata, context, attribute)
    {
        attribute.ErrorMessageResourceType = typeof(Messages);
        attribute.ErrorMessageResourceName = "PropertyValueRequired";
    }
}

что вы зарегистрируетесь в Application_Start:

DataAnnotationsModelValidatorProvider.RegisterAdapter(
    typeof(RequiredAttribute),
    typeof(MyRequiredAttributeAdapter)
);

Теперь, когда для поля, отличного от нуля, не назначено значение, сообщение об ошибке будет появляться от Messages.PropertyValueRequired, где Messages.resx должно быть определено внутри App_GlobalResources.