使用EmailAddressAttribute验证.net中的电子邮件字符串,但不在属性上验证

时间:2016-04-29 21:37:34

标签: c# .net data-annotations

我希望能够做到这一点:

string email = "some@email.com";
bool isValid = IsValidEmail(email);
//returns true

...但是使用Microsoft已经在 EmailAddressAttribute 中提供给我们的逻辑。

有很多好的和坏的IsValidEmail实现,我不想添加自己的,当我可以使用的东西,微软已经考虑过。按理说,他们会比我做得更好。

在最近的ASP.Net版本中,我们有System.ComponentModel.DataAnnotations,它为我们提供了优秀的EmailAddressAttribute,让我们可以像这样装饰我们的模型:

public class SomeModel
{
    [EmailAddress]
    public string Email { get; set; }
}

class is sealed,所以我无法调用EmailAddressAttribute.IsValid()

有没有一种好方法可以利用微软已经做过的事情?在.Net框架中的某个地方是否有一个方法,让我测试字符串与数据注释,我忽略了?

......的一些事情:

var emailChecker = new DataAnnotationsChecker<EmailAddressAttribute>();
string email = "some@email.com";
bool isValid = emailChecker.IsValid(email);
//returns true

如果您无法想象为什么我会想要这个,请考虑获取一个列表并想要检查哪些是有效的电子邮件。

2 个答案:

答案 0 :(得分:12)

您可以使用EmailAddressAttribute进行验证。

sealed表示您无法创建从其继承的另一个类。并不意味着你不能使用它。

创建了一些单元测试并且工作正常

[TestMethod]
public void Should_Use_Email_Address_Attribute_To_Validate_Email() {
    var emailChecker = new System.ComponentModel.DataAnnotations.EmailAddressAttribute();
    string email = "some@email.com";
    bool isValid = emailChecker.IsValid(email);
    Assert.IsTrue(isValid);
}

[TestMethod]
public void Should_Use_Email_Address_Attribute_To_Invalidate_Email() {
    var emailChecker = new System.ComponentModel.DataAnnotations.EmailAddressAttribute();
    string email = "some@emai l.com";
    bool isValid = emailChecker.IsValid(email);
    Assert.IsFalse(isValid);
}

答案 1 :(得分:0)

使用MailAddress
即使从' Elmer Fudd '样式的输入(例如从电子邮件客户端复制粘贴的输入),这也是一种用于读取和验证电子邮件地址的有用技术。 / p>

private string? ExtractEmailAddress(string raw)
{
    try
    {
        var address = new MailAddress(raw);
        return address.Address;
    }
    catch (Exception)
    {
        return null;
    }
}

我还使用[EmailAddress]属性来指示API文档所需的类型。