ASP.NET MVC 데이터 형식 속성을 사용하는 전자 메일 주소 유효성 검사


163

이메일 확인에 문제가 있습니다.

내 모델에서 :

[Required(ErrorMessage = "Field can't be empty")]
[DataType(DataType.EmailAddress, ErrorMessage = "E-mail is not valid")]
public string ReceiverMail { get; set; }

내 견해로는 :

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>

@Html.TextBoxFor(m => m.ReceiverMail, new { @placeholder="E-mail"}) <br />
@Html.ValidationMessageFor(m => m.ReceiverMail)

이제 필드를 비워두면 "필드를 비울 수 없습니다"라는 메시지가 올바르게 표시됩니다. 그러나 "fwenrjfw"와 같은 잘못된 이메일 주소를 입력하면 양식에 "이메일이 유효하지 않습니다"라고 표시되지 않습니다.

입력을 이메일 주소로 확인하는 양식을 어떻게 얻습니까? 이것에 대한 도움을 찾고 있습니다.

답변:


327

.NET Framework 4.5를 사용 EmailAddressAttribute하는 경우 솔루션은 내부에있는 것을 사용 하는 것 System.ComponentModel.DataAnnotations입니다.

코드는 다음과 유사해야합니다.

[Display(Name = "Email address")]
[Required(ErrorMessage = "The email address is required")]
[EmailAddress(ErrorMessage = "Invalid Email Address")]
public string Email { get; set; }

@Shittu Olugbenga에게 감사합니다! 그러나 이것이 왜 작동하지 않는지 이해할 수 없습니다.[DataType(DataType.EmailAddress, ErrorMessage = "Error message.")]
Wellington Zanelli

15
@Wellington Zanelli-DataType (DataType.EmailAddress)을 사용하여 사용자 입력을 확인할 수 없습니다. 디스플레이 / 편집기 템플릿을 사용하여 값을 렌더링하기위한 UI 힌트를 제공하는 데만 사용됩니다.
Liam

3
@Jni DataType.EmailAddress는 유효성 검사에 관한 것이 아닙니다. 그것은 ... 데이터 프리젠 테이션에 관하여
세바스찬 Xawery Wiśniowiecki

3
나는 같은 문제가 있으며 'name @ xxx'와 같은 이메일을 제외하고는 이메일 유효성 검사가 제대로 작동합니다. 다른 사람이 이것을 본 적이 있습니까?
Kremena Lalova

3
@KremenaLalova name@xxx는 완전히 유효한 이메일 주소이므로 해당 방법에 아무런 문제가 없습니다. 예 username@localhost를 들어 보자.
John Bergman

39

Html.EditorFor대신 도우미 메소드를 사용해보십시오 Html.TextBoxFor.


1
모델에 이미 추가 한 데이터 유형과 오류를 사용하므로 정답입니다.
Ricardo Sanchez

4
이 방법은 도메인 tld를 확인하지 않으므로 누군가 myname @ whatever에 넣고 .com을 남길 수 있으며 올바르게 유효성을 검사합니다.
JasonH

8
MyName로 @ 유효한 이메일 주소가 무엇이든
michaelmsm89

mvc 4에서 완벽하게 작동했습니다. 감사합니다.
Jose Gomez

이메일을 확인하기 위해 html.Editor에 무엇을 작성해야합니까?
Neeraj Kumar

28

다음과 같은 RegularExpression 속성을 사용해야합니다.

[RegularExpression("^[a-zA-Z0-9_\\.-]+@([a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,6}$", ErrorMessage = "E-mail is not valid")]

[RegularExpression]은 빈 필드에 영향을 미치지 않으므로 [필수]를 삭제하지 마십시오.


8
오래된 스쿨은 좋지만 Microsoft가 특성을 구현 한 이후 특정 상황, 국가, 시간대 또는 행성에서 발생할 수있는 버그 및 감독을 해결합니다. 따라서 사용자 정의 정규식보다 완전히 릴리스 된 코드베이스를 사용하는 것이 가장 좋습니다. 예를 들어 정규 표현식이 새로운 최상위 도메인을 고려합니까?
Piotr Kula

2
정규식은 외국 문자 또는 비표준 문자가 많은 전자 메일 주소에서 실패하는 것처럼 보입니다.
EricP

2
정규식과 이메일 주소를 검증하는 것은 일반적으로 끔찍한 생각입니다 ...하지만 당신이해야하는 경우, 좋은 참조가 .. 여기에있다 regular-expressions.info/email.html
Molomby

9
이 정규식과 웹 사이트가 잘못되었습니다. 6 자 이상의 새로운 TLD가 많이 있습니다. 이것을 따르지 마십시오.
jsgoupil

14

아직 .net 4.5를 사용하지 않는 경우 :

/// <summary>
/// TODO: AFTER WE UPGRADE TO .NET 4.5 THIS WILL NO LONGER BE NECESSARY.
/// </summary>
public class EmailAnnotation : RegularExpressionAttribute
{
    static EmailAnnotation()
    {
        DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(EmailAnnotation), typeof(RegularExpressionAttributeAdapter));
    }

    /// <summary>
    /// from: http://stackoverflow.com/a/6893571/984463
    /// </summary>
    public EmailAnnotation()
        : base(@"^[\w!#$%&'*+\-/=?\^_`{|}~]+(\.[\w!#$%&'*+\-/=?\^_`{|}~]+)*"
            + "@"
            + @"((([\-\w]+\.)+[a-zA-Z]{2,4})|(([0-9]{1,3}\.){3}[0-9]{1,3}))$") { }

    public override string FormatErrorMessage(string name)
    {
        return "E-mail is not valid";
    }
}

그런 다음이 작업을 수행 할 수 있습니다

    public class ContactEmailAddressDto
    {
        public int ContactId { get; set; }
        [Required]
        [Display(Name = "New Email Address")]
        [EmailAnnotation] //**<----- Nifty.**
        public string EmailAddressToAdd { get; set; }
    }

1
나는 정적 생성자를 좋아합니다.
브라이언 스위니

1
@BrianSweeney, 나는 그것을 인정할 수 없습니다 : P. 그러나 몇 년 전에 여기에서 얻은 또 다른 성가신.
mcfea

10

MVC 3을 사용합니다. 내 수업 중 하나에서 이메일 주소 속성의 예는 다음과 같습니다.

[Display(Name = "Email address")]
[Required(ErrorMessage = "The email address is required")]
[Email(ErrorMessage = "The email address is not valid")]
public string Email { get; set; }

Required입력이 옵션 인 경우를 제거하십시오 . RFC 2822 수준까지의 전자 메일 주소 내의 모든 옵션을 다루는 표현식이 있지만 정규 표현식이 필요하지 않습니다 (매우 길습니다).


3
귀하의 이메일 속성은 어떤 네임 스페이스입니까? 아니면 사용자 지정 특성입니까?
사용자

5
MVC 4를 사용 [EmailAddress]하고 있어야합니다using System.ComponentModel.DataAnnotations;
Piotr Kula

1
내가하는 일에 관계없이 필드를 사용 Email하거나 RegularExpression필드를 필요로하는 것처럼 보입니다 . Required주석을 제거해 도 효과가 없습니다. RegularExpression유효성 검사 필드가 빈 필드를 허용 하도록하려면 어떻게해야 합니까?
Eric K

@QuantumDynamix 옵션으로 정규식에 빈 문자열 테스트를 추가하십시오. 한번도 시도하지 않았지만 누가 알겠습니까?
피터 스미스

7
[Required(ErrorMessage = "Please enter Social Email id")]
    [DataType(DataType.EmailAddress)]
    [EmailAddress]
    public string Email { get; set; }

4

MVC5 프로젝트에서 위의 코드를 사용했으며 유효성 검사 오류와 함께 완벽하게 작동합니다.

   [Required]
   [Display(Name = "Email")]
   [EmailAddress]

   [RegularExpression(@"^([A-Za-z0-9][^'!&\\#*$%^?<>()+=:;`~\[\]{}|/,₹€@ ][a-zA-z0- 
    9-._][^!&\\#*$%^?<>()+=:;`~\[\]{}|/,₹€@ ]*\@[a-zA-Z0-9][^!&@\\#*$%^?<> 
        ()+=':;~`.\[\]{}|/,₹€ ]*\.[a-zA-Z]{2,6})$", ErrorMessage = "Please enter a 
   valid Email")]


   public string ReceiverMail { get; set; }

1
StackOverflow에 오신 것을 환영합니다. 코드 전용 답변은 모범 사례로 간주되지 않습니다. 이것이하는 일과 문제를 해결하는 방법을 자세히 설명하십시오.
quinz 2016

0

스크립트는 일반적으로 html 페이지 끝에로드되며 MVC는 번들 사용을 권장합니다. 따라서 가장 좋은 방법은 jquery.validate파일이 전자 메일 입력의 유효성을 검사하기 때문에 어떤 방식 으로든 변경되었거나 최신 버전으로 업데이트되지 않는 것입니다.

따라서 너겟 패키지를 업데이트 / 새로 고치거나 실제로 자신의 기능을 작성할 수 있습니다.

다음에 추가 파일을 추가하는 예는 다음과 같습니다 jquery.validate.unobtrusive.

$.validator.addMethod(
    "email",
    function (value, element) {
        return this.optional( element ) || /^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test( value );
    },
    "This e-mail is not valid"
);

이것은 현재 jquery.validate정규식 의 복사 및 붙여 넣기 일 뿐이므로 사용자 지정 오류 메시지를 설정하거나 가까운 미래에 유효성을 검사하려는 필드에 추가 방법을 추가 할 수 있습니다.


0

위와 같이 전자 메일 주소의 서버 측 유효성 검사가 수정됩니다.

[Display(Name = "Email address")]
[Required(ErrorMessage = "The email address is required")]
[EmailAddress(ErrorMessage = "Invalid Email Address")]
public string Email { get; set; }

하나...

JQuery 클라이언트 측 유효성 검증을 사용하는 경우 이메일이 서버 측 (모델 유효성 검증)과 클라이언트 측 (JQuery 유효성 검증)의 유효성을 다르게 검증한다는 것을 알아야합니다. 해당 test @ example (최상위 도메인 이메일 주소)은 서버 측에서는 실패하지만 클라이언트 측에서는 제대로 검증됩니다.

이 불일치를 해결하기 위해 다음과 같이 기본 클라이언트 측 이메일 유효성 검증을 대체 할 수 있습니다.

$.validator.methods.email = function (value, element) {
    return this.optional(element) || /[a-z]+@[a-z]+\.[a-z]+/.test(value);
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.