如何使用与DataAnnotations属性DataType.EmailAddress相同的方法验证电子邮件地址?



我使用MVC3,在代码的某些位置,我使用System.ComponentModel.DataAnnotations.DataType.EmailAddress属性,并让mvc模型验证为我做验证。

然而,我现在想在我不使用模型的代码的不同部分验证电子邮件地址。我想使用MVC已经使用的相同方法,但是我无法找到有关如何这样做的任何信息。

EDIT -抱歉,如果我的问题不清楚。我将尽力澄清。

以下是默认MVC模板中包含的RegisterModel代码片段:

    public class RegisterModel
    {
...
        [Required]
        [DataType(DataType.EmailAddress)]
        [DisplayName("Email address")]
        public string Email { get; set; }
...
     }

这些属性指示mvcs模型验证如何验证这个模型。

但是,我有一个应该包含电子邮件地址的字符串。我想验证电子邮件地址相同的方式 mvc正在做它。

string email = "noone@nowhere.com";
bool isValid = SomeMethodForValidatingTheEmailAddressTheSameWayMVCDoes(email);

正如其他人所说,DataType属性实际上不做任何验证。我建议你看看数据注释扩展,它包含了已经为各种事情编写的验证扩展,包括电子邮件。

也可以显式地对整个模型进行模型验证:使用数据注释进行手动验证。

如果您想对特定字段/属性进行每个属性验证,您还可以查看DataAnnotationExtensions的测试,它应该会给您想要的:

[TestMethod]
public void IsValidTests()
{
    var attribute = new EmailAttribute();
    Assert.IsTrue(attribute.IsValid(null)); // Don't check for required
    Assert.IsTrue(attribute.IsValid("foo@bar.com"));
    ..
}

看一下Scott Guthrie的这篇博文,它展示了如何使用自定义属性(基于regulareexpression attribute)实现对电子邮件地址的验证。

如果您需要在其他地方验证电子邮件地址,则可以重用该逻辑。

您可能想看看这个问题:DataTypeAttribute验证在MVC2中工作吗?

总而言之,[DataType(DataType.EmailAddress)] 实际上并没有验证任何,它只是说"嘿,这个属性应该是一个电子邮件地址"。像Html.DisplayFor()这样的方法将检查这一点并将其渲染为<a href="mailto:foo">foo</a>,但IsValid()方法几乎是一个简单的return true;

您将不得不滚动自己的代码来实际执行验证。上面链接的问题有一些示例代码,您可以使用它们作为起点。

最新更新