如何更改类型验证错误消息?

时间:2018-01-19 21:19:52

标签: c# entity-framework validation entity-framework-6 data-annotations

我首先在ASP MVC项目中使用实体框架代码,并且我想更改出现的错误消息以验证数字类型。

我有像

这样的属性
public decimal Amount1 { get; set; }

如果我在字段中输入非数字,我会收到消息:The field Amount1 must be a number.如何更改该消息?

对于其他验证,例如Required我可以使用ErrorMessage参数,例如:[Required(ErrorMessage = "My message...")]

验证类型有类似的东西吗?

谢谢。

2 个答案:

答案 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");
        }
    }
}