ErrorMessageString或ErrorMessageResourceName必须设置,但不能同时使用CreditCardAttribute错误

这是我的模特:

namespace MvcApplication2.Models { public class CreditCard { [CreditCard(ErrorMessageResourceType = typeof(Messages), ErrorMessageResourceName = "CardNumberInvalid")] public string CardNumber { get; set; } } } 

这是我的Messages.resx:

名称值

CardNumberInvalid请检查您的卡号是否正确

这是我的观点:

 @model MvcApplication2.Models.CreditCard @Html.TextBoxFor(m => m.CardNumber); 

在MVC版本3中,这个工作没有错误。 在MVC 4中,当我进入这个页面时,我得到一个消息:“ErrorMessageString或ErrorMessageResourceName必须设置,但不能同时设置”。 这只是发生在CreditCardAttribute。 其他validation属性(如RequiredAttribute)正常工作。 我只设置了ErrorMessageResourceName。 我没有设置ErrorMessageString,所以不明白我做错了什么。 任何人都可以帮忙吗?

这是.Net 4.5中的一个已知问题。 添加“ErrorMessage = null”命名参数应该解决这个问题。

参考:参考链接现在被打破。 http://connect.microsoft.com/VisualStudio/feedback/details/757298/emailaddress-attribute-is-unable-to-load-error-message-from-resource-mvc

 [CreditCard(ErrorMessageResourceType = typeof(Messages), ErrorMessageResourceName = "CardNumberInvalid", ErrorMessage = null)] 

添加ErrorMessage = null将解决您的问题。

我有这个问题,因为我已经实现了RequiredAttributeAdapter ,它是自动设置ErrorMessageResourceName属性。

您可以通过在设置ErrorMessageResourceName之前检查是否已经设置ErrorMessage属性来修复它:

 /// <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"; } } 

由于任何人谁使用自定义validation属性,也想加载本地化的资源错误消息,将面临这个问题,我在这里分享我的解决方法。
假设你有一个像这样的自定义validation属性

 [FileTypeMustBe("jpg")] public HttpPostedFileBase MyFile {get; set;} 

在您的自定义validation属性中添加此代码

 public override string FormatErrorMessage(string name) { return String.Format(CultureInfo.CurrentCulture, ErrorMessageString, name, ValidFileType); } 

ValidFileType是一个属性的名称,它接受自定义validation属性的input参数(这里是jpg),现在我们可以用我们喜欢的方式来装饰我们的模型属性

 [FileTypeMustBe("jpg", ErrorMessageResourceType = typeof(Resources.Resources), ErrorMessageResourceName = "WrongFileTypeError")] public HttpPostedFileBase MyFile {get; set;} 

因为您看到不需要添加ErrorMessage=null ,因为我们在自定义validation类中处理了它。 只是不要忘记,如果你已经初始化你的自定义validation中的任何错误消息string,你现在必须删除它,并使用FormatErrorMessage来代替。

我有一个自定义的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 testing,只有在我一个一个的运行/debugging的时候,他们才能通过。 但是当我点击“全部运行”时,只有第一个通过? 他们没有以任何方式链接…

所以是的,只要删除分配ErrorMessage属性

我希望这会帮助别人!

对于我本地化的财产,我也有同样的问题。 我已经定义了ErrorMessageResourceType,然后ErrorMessageResourceName,但错误地把ErrorMessage atrtribute以及抛出exception

 [NotEqualTo("User_Name", ErrorMessageResourceType = typeof(LROResources.Global), ErrorMessageResourceName = "UserPasswordCannotBeUsername", ErrorMessage = "The password cannot be the same as your Username.")] 

所以在我的情况下,通过删除ErrorMessage我解决了这个问题。