【发布时间】:2019-03-19 10:27:52
【问题描述】:
我想通过继承StringLengthAttribute 来创建自定义属性。这样做的原因是因为我需要使用动态错误消息。默认的 ErrorMessage 只支持常量消息。当我使用没有恒定消息的默认验证时,它正在工作。
public class CustomerProfile
{
public string Username { get; set; }
[StringLength(10,ErrorMessage ="Original Error Message")]
public string Name { get; set; }
public string Mobile { get; set; }
public string Email { get; set; }
}
但是当我使用下面的代码创建自定义消息时,它显示为弹出警告框,而不是在文本框上方显示验证消息。
public class CustomerProfile
{
public string Username { get; set; }
//[StringLength(10,ErrorMessage ="Original Error Message")]
[MaxNameLengthAttributes(10)]
public string Name { get; set; }
public Gender Gender { get; set; }
public string Mobile { get; set; }
public string Email { get; set; }
}
public class MaxNameLengthAttributes : StringLengthAttribute
{
private readonly int _maxWords;
public MaxNameLengthAttributes(int maxWords) : base(maxWords)
{
_maxWords = maxWords;
}
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
if (value == null)
return new ValidationResult("Name required");
var textValue = value.ToString();
if (textValue.Length <= _maxWords)
return ValidationResult.Success;
var errorMessage = string.Format("max length is {0}",_maxWords);
return new ValidationResult(errorMessage);
}
}
如何通过继承默认属性创建自定义消息并在文本框上方显示验证消息而不是弹出警报框?
备注:
如果继承 StringLength 属性,则假设不使用 IClientValidatable 也可以正常工作。并且消息假设不会成为弹出警报,是否缺少任何部分?
【问题讨论】:
-
@ChetanRanpariya,这不是动态错误信息,请参考我的代码。谢谢
-
@StephenMuecke,示例提供不继承 StringLength 属性,我在想如果直接使用该属性,我不再需要创建 IClientValidatable。
-
我认为
_maxWords用于计算单词而不是字符,这就是你正在做的,那么你的属性有什么意义。只需使用[StringLength(ErrorMessage = "max length is {1}")]属性。附带说明一下,ValidationAttribute有一个责任,因此您的if (value == null) { return new ValidationResult("Name required"); }块是错误的 - 您可以使用[Required]属性来处理它。
标签: c# asp.net-mvc data-annotations custom-attributes