Validation EmailAddressAttribute是如何工作的?

Validation EmailAddressAttribute是如何工作的?,validation,asp.net-mvc-5,Validation,Asp.net Mvc 5,我使用ASP.NETMVC5,需要对电子邮件进行验证 我有以下视图模型: public class RegisterViewModel { [Required] [Display(Name = "User name")] [EmailAddress(ErrorMessage = "The email address is not valid")] public string UserName { get; set; } 和第页: @using (Html.Beg

我使用ASP.NETMVC5,需要对电子邮件进行验证

我有以下视图模型:

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>
@使用(Html.BeginForm(“AddUser”,“Account”,FormMethod.Post,new{@class=“form horizontal”,role=“form”}))
{
@Html.AntiForgeryToken()
创建一个新帐户。

@Html.ValidationSummary(true) @LabelFor(m=>m.UserName,新的{@class=“col-md-2控制标签”}) @TextBoxFor(m=>m.UserName,新的{@class=“form control”}) @Html.ValidationMessageFor(m=>m.UserName)

“必需”的验证器工作,但我可以在用户名文本字段和验证器“电子邮件”中输入“blablabla”不起作用。服务器端的相同问题,Model.IsValid=true。为什么以及如何修复?

它验证具有有效电子邮件格式的电子邮件地址是否已作为属性值提供。它基本上只是确保其格式正确……例如stink@dink.com


如果你希望它能验证邮件的真实性,那它就不是了。

聚会晚了几年,但我想有些人还是在寻找它。如果你使用的是来自
System.ComponentModel.DataAnnotations
的邮件,那么这就是它的代码。参考:

正如你所见,这里有一个疯狂的正则表达式

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);
    }

请注意,源代码解释了Regex非常具体:“此属性提供与jquery validate等效的服务器端电子邮件验证,因此共享相同的正则表达式”.@OhadSchneider为什么是特定的?客户端和服务器端也是如此,据我所知:)@OlegSh我的意思是,它是专门用来模拟jQuery的验证,而不是完整/正确的。