在自己的模型属性中显示ErrorMessage

时间:2015-05-04 00:52:18

标签: regex asp.net-mvc

我创建了自己的模型属性,其中说“无法找到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);
    }
}

1 个答案:

答案 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 等。