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

how to change type validation error messages?

我首先在 ASP MVC 项目中使用 entity framework 代码,我想更改为验证数字类型而出现的错误消息。

我有一个属性喜欢

public decimal Amount1 { get; set; }

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

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

是否有类似的验证类型的东西?

谢谢。

遗憾的是,Microsoft 没有公开任何接口来更改默认消息。

但是如果你急于更改这些不友好的消息,你可以通过为 decimal 创建验证属性,创建相应的验证器并最终在应用程序启动时将其注册到 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:在 Global.asax 中的 Application_Start() 方法或 Main() 方法下注册适配器

DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(ValidDecimal), typeof(ValidDecimalValidator));

第 4 步: 最后用这个属性 属性 在你的模型中装饰你的

[ValidDecimal(ErrorMessage = "Only decimal numbers allowed")]
public decimal CPEHours { get; set; }

希望对您有所帮助。

我找不到干净的解决方案。如果有类似 [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");
        }
    }
}