我首先在ASP MVC项目中使用实体框架代码,并且我想更改出现的错误消息以验证数字类型。
我有像
这样的属性public decimal Amount1 { get; set; }
如果我在字段中输入非数字,我会收到消息:The field Amount1 must be a number.
如何更改该消息?
对于其他验证,例如Required
我可以使用ErrorMessage
参数,例如:[Required(ErrorMessage = "My message...")]
验证类型有类似的东西吗?
谢谢。
答案 0 :(得分:1)
不幸的是,Microsoft没有公开任何接口来更改默认消息。
但是如果你非常绝望地改变这些非友好的消息,你可以通过创建十进制的验证属性,创建相应的验证器并最终在应用程序启动时使用DataAnnotationsModelValidatorProvider注册它来实现。希望这可以帮助。
<强>更新强>:
以下示例
第1步:创建验证属性
[AttributeUsage(AttributeTargets.Field | AttributeTargets.Method | AttributeTargets.Parameter | AttributeTargets.Property, AllowMultiple = false)]
public class ValidDecimalAttribute : ValidationAttribute
{
protected override ValidationResult IsValid(object value, ValidationContext validationContext) {
if (value == null || value.ToString().Length == 0) {
return ValidationResult.Success;
}
decimal d;
return !decimal.TryParse(value.ToString(), out d) ? new ValidationResult(ErrorMessage) : ValidationResult.Success;
}
}
第2步:创建验证器
public class ValidDecimalValidator : DataAnnotationsModelValidator<ValidDecimal>
{
public ValidDecimalValidator(ModelMetadata metadata, ControllerContext context, ValidDecimal attribute)
: base(metadata, context, attribute)
{
if (!attribute.IsValid(context.HttpContext.Request.Form[metadata.PropertyName]))
{
var propertyName = metadata.PropertyName;
context.Controller.ViewData.ModelState[propertyName].Errors.Clear();
context.Controller.ViewData.ModelState[propertyName].Errors.Add(attribute.ErrorMessage);
}
}
}
步骤3:在Application_Start()方法或Main()方法下的Global.asax中注册适配器
DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(ValidDecimal), typeof(ValidDecimalValidator));
第4步:最后使用此属性
在您的模型中装饰您的媒体资源[ValidDecimal(ErrorMessage = "Only decimal numbers allowed")]
public decimal CPEHours { get; set; }
希望它有所帮助。
答案 1 :(得分:0)
我无法找到一个干净的解决方案。如果有类似[Required]
的内容,您可以以相同的方式覆盖它。我找到的唯一选项是删除并在模型状态中添加另一个错误。如果你有更好的替代品,那么这不是最好的选择,而是完成工作。此示例仅在最后有must be a number
之类的情况下才有效。您可以使用这种循环创建过滤器:
foreach (var m in ModelState)
{
var errors = m.Value.Errors;
foreach (var error in errors)
{
if (error.ErrorMessage.EndsWith("must be a number"))
{
errors.Remove(error);
ModelState.AddModelError(m.Key, $"This is my own validation");
}
}
}