我创建了自己的模型属性,其中说“无法找到ErrorMessage”:
[DataType(DataType.EmailAddress)]
[Required]
[Display(Name = "Email")]
[StringLength(80, ErrorMessage = "Email too large.")]
[RegularExpressionTimeOut(@"^([a-zA-Z0-9._-]+)@(outlook|hotmail|yahoo)\.\w{2,}$", 5),
ErrorMessage = "Invalid email."] // 5 seconds
public string Email { get; set; }
这个属性的类:
public class RegularExpressionTimeOut :
System.ComponentModel.DataAnnotations.ValidationAttribute
{
public System.TimeSpan TimeOut { get; set; }
public string Pattern { get; set; }
//public string ErrorMessage { get; set; }
//new System.TimeSpan(0, 0, 5)
/// <summary>
/// Constructor
/// </summary>
/// <param name="pattern">Regular expression as string</param>
/// <param name="timeOut">Number of seconds</param>
public RegularExpressionTimeOut(string pattern, int timeOut)
{
this.Pattern = pattern;
this.TimeOut = new System.TimeSpan(0, 0, timeOut);
}
public override bool IsValid(object value)
{
//if (!string.IsNullOrEmpty(this.ErrorMessage) && ...)
return (new System.Text.RegularExpressions.Regex(this.Pattern,
System.Text.RegularExpressions.RegexOptions.None, this.TimeOut))
.IsMatch(this.Pattern);
}
}
然后,问题是,如何显示ErrorMessage?
使用FormatErrorMessage 进行了更新 我的网站无论如何都不会显示错误消息。
public class RegularExpressionTimeOut : System.ComponentModel.DataAnnotations.ValidationAttribute
{
public System.TimeSpan TimeOut { get; set; }
public string Pattern { get; set; }
private const string DefaultErrorMessage = "Invalid email.";
//private string ErrorMessage;
/// <summary>
/// Constructor
/// </summary>
/// <param name="pattern">Regular expression as string</param>
/// <param name="timeOut">Number of seconds</param>
public RegularExpressionTimeOut(string pattern, int timeOut) : base(DefaultErrorMessage)
{
this.Pattern = pattern;
this.TimeOut = new System.TimeSpan(0, 0, timeOut);
//this.ErrorMessage = errorMessage;
}
public override bool IsValid(object value)
{
//if (!string.IsNullOrEmpty(this.ErrorMessage) && ...)
return (new System.Text.RegularExpressions.Regex(this.Pattern, System.Text.RegularExpressions.RegexOptions.None, this.TimeOut)).IsMatch(this.Pattern);
}
public override string FormatErrorMessage(string ErrorMessage)
{
return string.Format(ErrorMessageString, ErrorMessage);
}
}
答案 0 :(得分:1)
您RegularExpressionTimeOut
构造函数没有ErrorMessage
的参数。典型用法是
public class RegularExpressionTimeOut : ValidationAttribute
{
private const string DefaultErrorMessage = "Invalid email";
public RegularExpressionTimeOut(string pattern, int timeOut) : base(DefaultErrorMessage)
并且通常会添加覆盖以格式化Attribute
中提供的特定消息,您可以在其中访问属性名称等值(尽管在您的情况下,您似乎并不需要或想要这样做。
public override string FormatErrorMessage(string name)
{
return string.Format(ErrorMessageString, name, .....);
}
旁注:您的右括号位置不正确。它应该是
[RegularExpressionTimeOut(@"....", 5, ErrorMessage = "Invalid email.")]
修改强>
您实际上没有测试回发的Email
属性的值(您只是测试正则表达式模式是否与自身匹配。您需要将IsValid()
方法更改为
public override bool IsValid(object value)
{
string email = (string)value; // cast it to a string for use in the Regex method
return (new Regex(this.Pattern, RegexOptions.None, this.TimeOut)).IsMatch(email);
}
另请注意,您显示的正则表达式模式应该花费几毫秒来测试,因此不清楚为什么需要它。此外,您没有任何关联的客户端验证(您的属性没有实现ICientValitable
,并且在任何情况下都没有任何意义,因为javascript正则表达式没有超时)因此只有在您输出时才会返回消息在ModelState.IsValid == false
时返回视图。在这种情况下,您的消息&#34;无效的电子邮件&#34; 会让用户感到困惑,它应该表明它需要 @outlook 或< em> @hotmail 等。