Должно быть установлено значение ErrorMessageString или ErrorMessageResourceName, но не обе ошибки с использованием CreditCardAttribute
Это моя модель:
namespace MvcApplication2.Models
{
public class CreditCard
{
[CreditCard(ErrorMessageResourceType = typeof(Messages), ErrorMessageResourceName = "CardNumberInvalid")]
public string CardNumber { get; set; }
}
}
Это мои сообщения .resx:
Значение имени
CardNumberInvalid Проверьте правильность номера вашей карты
И это мое мнение:
@model MvcApplication2.Models.CreditCard
@Html.TextBoxFor(m => m.CardNumber);
В версии MVC 3 это работает без ошибок. В MVC 4, когда я перехожу на эту страницу, я получаю сообщение об исключении: "Должно быть установлено либо значение ErrorMessageString, либо ErrorMessageResourceName, но не оба". Это происходит только с помощью CreditCardAttribute. Другие атрибуты проверки, такие как RequiredAttribute, работают нормально. Я только установил ErrorMessageResourceName. Я не установил ErrorMessageString, поэтому не понимаю, что я сделал неправильно. Может ли кто-нибудь помочь?
Ответы
Ответ 1
Это известная проблема в .Net 4.5. Добавление параметра "ErrorMessage = null" named должно решить эту проблему.
Ссылка:
Ссылка теперь нарушена.
http://connect.microsoft.com/VisualStudio/feedback/details/757298/emailaddress-attribute-is-unable-to-load-error-message-from-resource-mvc
Ответ 2
[CreditCard(ErrorMessageResourceType = typeof(Messages), ErrorMessageResourceName = "CardNumberInvalid", ErrorMessage = null)]
Добавление ErrorMessage = null
устраняет вашу проблему.
Ответ 3
У меня была эта проблема, потому что я реализовал RequiredAttributeAdapter
, который автоматически устанавливал свойство ErrorMessageResourceName
.
Вы можете исправить это, проверив, установлено ли свойство ErrorMessage перед установкой ErrorMessageResourceName
:
/// <summary>
/// Creates a new instance of the RequiredAttributeAdapter, used for switching the default required message
/// format
/// </summary>
public CustomMessageRequiredAttributeAdapter(
ModelMetadata metadata,
ControllerContext context,
RequiredAttribute attribute
)
: base(metadata, context, attribute)
{
if (string.IsNullOrEmpty(attribute.ErrorMessage))
{
attribute.ErrorMessageResourceType = typeof (ValidationMessages);
attribute.ErrorMessageResourceName = "PropertyValueRequired";
}
}
Ответ 4
Так как любой пользователь, который использует специальные атрибуты проверки, а также хочет загрузить сообщения об ошибках из ресурсов для целей локализации, столкнулся бы с этой проблемой, я поделился бы своим обходным решением здесь.
предположим, что у вас есть собственный атрибут проверки, как этот
[FileTypeMustBe("jpg")]
public HttpPostedFileBase MyFile {get; set;}
в вашем пользовательском атрибуте проверки добавьте этот код
public override string FormatErrorMessage(string name)
{
return String.Format(CultureInfo.CurrentCulture,
ErrorMessageString, name, ValidFileType);
}
ValidFileType - это имя свойства, которое принимает входной аргумент пользовательского атрибута проверки (jpg здесь), теперь мы можем украсить наше свойство модели так, как нам нравится,
[FileTypeMustBe("jpg", ErrorMessageResourceType = typeof(Resources.Resources), ErrorMessageResourceName = "WrongFileTypeError")]
public HttpPostedFileBase MyFile {get; set;}
как вы видите, нет необходимости добавлять ErrorMessage=null
больше, потому что мы позаботились об этом в пользовательском классе проверки. просто не забудьте, если бы вы инициализировали строку сообщения об ошибке в своей пользовательской проверке, вы должны удалить ее сейчас и вместо этого использовать FormatErrorMessage
.
Ответ 5
У меня была простая проблема с пользовательским ValidationAttribute.
В методе IsValid я устанавливал ErrorMessage. Исправление заключалось в том, чтобы удалить назначение в ErrorMessage propety...
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
//code before ...
this.ErrorMessage = this.FormatErrorMessage(validationContext.DisplayName); //NOT GOOD...
ValidationResult validationResult = new ValidationResult(this.ErrorMessage, //And using the ErrorMessage Here...
new[] { validationContext.MemberName });
return validationResult;
}
Я писал Unit test, и они были pasisng, только если я выполнял/отлаживал один за другим. Но когда я нажимаю "Запустить все", проезжает только первый? Они не связаны никоим образом...
Итак, да, просто удалите удаление назначения в ErrorMessage propety
Я надеюсь, что это поможет кому-то!
Ответ 6
У меня была такая же проблема для свойства, которое я локализую. Я определил ErrorMessageResourceType, а затем ErrorMessageResourceName, но по ошибке также включил атрибут ErrorMessage atrtribute, который выбрал исключение
[NotEqualTo("User_Name", ErrorMessageResourceType = typeof(LROResources.Global), ErrorMessageResourceName = "UserPasswordCannotBeUsername", ErrorMessage = "The password cannot be the same as your Username.")]
Итак, в моем случае, просто удалив ErrorMessage
, я исправил проблему.