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”命名参数应该解决这个问题。
[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
我解决了这个问题。