必须设置ErrorMessageString或ErrorMessageResourceName,但不能使用CreditCardAttribute设置错误
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了必须设置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上。其他验证属性(如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";
}
}
由于任何使用自定义验证属性并且还希望从资源加载错误消息以进行本地化的人都会遇到此问题,因此我在此处分享我的解决方法。 假设您有一个像这样的自定义验证属性
[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
。
我有一个自定义验证属性的类似问题。
在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;
}
我正在编写单元测试,只有当我一个接一个地运行/调试时它们才会通过。但是当我点击“全部运行”时,只有第一个通过?他们没有以任何方式联系......
所以,是的,只需删除删除ErrorMessage属性的赋值
我希望它会帮助别人!
我在本地化的属性上遇到了同样的问题。我已经定义了ErrorMessageResourceType然后定义了ErrorMessageResourceName但是错误地将ErrorMessage atrtribute也放在了引发异常的地方
[NotEqualTo("User_Name", ErrorMessageResourceType = typeof(LROResources.Global), ErrorMessageResourceName = "UserPasswordCannotBeUsername", ErrorMessage = "The password cannot be the same as your Username.")]
所以在我的情况下,通过删除ErrorMessage
我修复了问题。
以上是关于必须设置ErrorMessageString或ErrorMessageResourceName,但不能使用CreditCardAttribute设置错误的主要内容,如果未能解决你的问题,请参考以下文章
当请求 API 的自定义标头错误时,将 http 状态代码设置为 417
在 mfp WL.Client.createSecurityCheckChallengeHandler() 或 WLAuthorizationManager.login() 中登录失败