2015-05-04 3 views
0

Я создал свою собственную модель собственности, которая говорит «ErrorMessage не может быть найден»:Показать 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

Вы 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 regex не было тайм-аута), поэтому сообщение будет возвращено только, если вы вернете представление, когда ModelState.IsValid == false. В этом случае ваше сообщение «Недопустимый адрес электронной почты» будет довольно запутанным для пользователя, и это, вероятно, следует указать, что она должна быть @outlook или @hotmail и т.д.

+0

«DefaultErrorMessage не Existe в текущий контекст ". И почему declade DefaultErrorMessage как константа, если я должен назначить ему значение в конструкторе? – Joe

+0

Как он не может существовать - он определен в первой строке кода, который я вам дал - 'private const string DefaultErrorMessage =" Invalid email ";'! –

+0

Кроме того, у вас есть закрывающая скобка в неправильном месте - это должно быть '[RegularExpressionTimeOut (@" .... ", 5, ErrorMessage =" Недопустимый адрес электронной почты. ")]' –

Смежные вопросы