如何更改类型验证错误消息?
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");
}
}
}
我首先在 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");
}
}
}