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」などの無効なメールアドレスを入力すると、フォームに「E-mail is not valid」と表示されません。

入力をメールアドレスとして検証するフォームを取得するにはどうすればよいですか?私はこれでいくつかの助けを探しています。

回答:


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.")]
ウェリントンZanelli

15
@Wellington Zanelli-DataType(DataType.EmailAddress)を使用してユーザー入力を検証することはできません。これは、表示/エディターテンプレートを使用して値をレンダリングするためのUIヒントを提供するためにのみ使用されます。
リアム

3
@Jni DataType.EmailAddressは検証についてではありません。それはデータのプレゼンテーションについてです...
Sebastian XaweryWiśniowiecki15年

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を
省略でき、

8
myname @ whateverは有効なメールアドレスです
michaelmsm89

mvc 4で完全に機能しました。ありがとうございます。
Jose Gomez

メールを検証するためにhtml.Editor内に何を書きますか?
Neeraj Kumar 2017

28

次のようなRegularExpression属性を使用する必要があります。

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

また、[RegularExpression]は空のフィールドに影響を与えないため、[必須]は削除しないでください。


8
古いskoolは素晴らしいですが、Microsoftは属性を実装して以来、特定の状況、国、タイムゾーン、または惑星で発生する可能性のあるバグと見落としに対処しています。したがって、カスタム正規表現よりも完全にリリースされたコードベースを使用するのが最善です。たとえば、正規表現は新しいトップレベルドメインを考慮に入れていますか?
Piotr Kula、

2
その正規表現は、外部文字または多くの非標準文字が含まれる電子メールアドレスでは失敗するように見えます。
EricP 2014年

2
正規表現での電子メールアドレスを検証..通常、ひどいアイデアです...しかし、あなたがしなければならない場合は、ここでの優れた参照がありますregular-expressions.info/email.html
Molomby

9
この正規表現とウェブサイトは間違っています。6文字を超える新しいTLDがたくさんあります。これに従わないでください。
jsgoupil 2015

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を使用しています。私のクラスの1つにある電子メールアドレスプロパティの例は次のとおりです。

[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
私が何をしても、どちらEmailRegularExpressionを使用するか、フィールドを必須にするように思えます。Required注釈を削除しても効果はありません。RegularExpression検証付きのフィールドが空のフィールドを受け入れるようにするために何をすべきかについての提案はありますか?
Eric K

@QuantumDynamix空の文字列テストをオプションとして正規表現に追加してみてください。試したことはありませんが、誰が知っていますか?
Peter Smith


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へようこそ。コードのみの回答は良い習慣とは見なされていません。これが何をして、どのように問題を解決するかを詳しく説明してください。
クインズ

0

通常、スクリプトはhtmlページの最後に読み込まれ、MVCはバンドルの使用をお勧めします。だから私の最善の策はあなたのことですjquery.validate電子メールの入力を検証するためファイルが何らかの方法で変更されたか、最新バージョンに更新されないことです。

つまり、nugetパッケージを更新/更新するか、実際に独自の関数を作成することができます。

次に、追加のファイルに追加する例を示します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クライアント側の検証を使用している場合、Eメールはサーバー側(モデルの検証)とクライアント側(JQueryの検証)では異なる検証を行うことを知っておく必要があります。そのtest @ example(トップレベルドメインの電子メールアドレス)では、サーバー側は失敗しますが、クライアント側では問題なく検証されます。

この格差を修正するには、次のようにデフォルトのクライアント側の電子メール検証を上書きできます。

$.validator.methods.email = function (value, element) {
    return this.optional(element) || /^[a-z0-9._]+@[a-z]+\.[a-z.]+/.test(value);
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.