2013-11-21 1 views
3

ASP.NET MVC 5를 사용하고 전자 메일의 유효성 검사를 수행해야합니다. EmailAddressAttribute는 어떻게 작동합니까?

I 다음 뷰 모델이 있습니다

public class RegisterViewModel 
{ 
    [Required] 
    [Display(Name = "User name")] 
    [EmailAddress(ErrorMessage = "The email address is not valid")] 
    public string UserName { get; set; } 

페이지 : "필요한"작품

@using (Html.BeginForm("AddUser", "Account", FormMethod.Post, new { @class = "form-horizontal", role = "form" })) 
{ 
    @Html.AntiForgeryToken() 
    <h4>Create a new account.</h4> 
    <hr /> 
    @Html.ValidationSummary(true) 
    <div class="form-group"> 
     @Html.LabelFor(m => m.UserName, new { @class = "col-md-2 control-label" }) 
     <div class="col-md-10"> 
      @Html.TextBoxFor(m => m.UserName, new { @class = "form-control" }) 
      @Html.ValidationMessageFor(m => m.UserName) 
     </div> 
    </div> 

검증을하지만 사용자 이름 텍스트 필드에 "즐 - 즐 - 즐 ~"를 입력 할 수 있습니다 유효성 검사기 "전자 메일"이 작동하지 않습니다. 서버 측에서도 동일한 문제, Model.IsValid = true. 왜, 어떻게 수정해야합니까?

답변

-1

유효 이메일 형식의 이메일 주소가 속성 값으로 제공되었는지 확인합니다. 기본적으로 올바른 형식임을 보장합니다. 예 : [email protected]

이메일이 실제로 유효한지 확인하려는 경우 ... 그렇지 않습니다.

1

파티에 몇 년 늦었지 만, 어떤 사람들은 여전히 ​​이것을 찾습니다. System.ComponentModel.DataAnnotations의 코드를 사용하고 있다면이 코드가됩니다. 참조 : http://referencesource.microsoft.com/#System.ComponentModel.DataAnnotations/DataAnnotations/EmailAddressAttribute.cs

자세히 알 수 있듯이 RegEx가 있습니다. 소스가 정규식을 설명하는 것이

public override bool IsValid(object value) { 
     if (value == null) { 
      return true; 
     } 

     string valueAsString = value as string; 

     // Use RegEx implementation if it has been created, otherwise use a non RegEx version. 
     if (_regex != null) { 
      return valueAsString != null && _regex.Match(valueAsString).Length > 0; 
     } 
     else { 
      int atCount = 0; 

      foreach (char c in valueAsString) { 
       if (c == '@') { 
        atCount++; 
       } 
      } 

      return (valueAsString != null 
      && atCount == 1 
      && valueAsString[0] != '@' 
      && valueAsString[valueAsString.Length - 1] != '@'); 
     } 
    } 

    private static Regex CreateRegEx() { 
     // We only need to create the RegEx if this switch is enabled. 
     if (AppSettings.DisableRegEx) { 
      return null; 
     } 

     const string pattern = @"^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$"; 
     const RegexOptions options = RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.ExplicitCapture; 

     // Set explicit regex match timeout, sufficient enough for email parsing 
     // Unless the global REGEX_DEFAULT_MATCH_TIMEOUT is already set 
     TimeSpan matchTimeout = TimeSpan.FromSeconds(2); 

     try { 
      if (AppDomain.CurrentDomain.GetData("REGEX_DEFAULT_MATCH_TIMEOUT") == null) { 
       return new Regex(pattern, options, matchTimeout); 
      } 
     } 
     catch { 
      // Fallback on error 
     } 

     // Legacy fallback (without explicit match timeout) 
     return new Regex(pattern, options); 
    } 
+1

참고는 매우 구체적이다 : _ "이 속성은 서버 측 이메일 확인 상당을 제공 JQuery와 유효성 검사, 따라서 같은 정규 표현식 공유에"_가. –

관련 문제