DataAnnotation TextArea多个电子邮件

时间:2013-05-21 03:10:22

标签: regex asp.net-mvc-3 data-annotations

我正在使用MVC 3。

我有一个文本区域,用户可以在其中输入多个电子邮件地址。电子邮件可以用逗号和空格分隔。用户也可以在框中输入enter。

  1. 是否有可以处理此方案的属性?

  2. 我使用正则表达式检查字符,但是“abc @ abc.com,tyz @tyz.com”

  3. 失败了

    这是我的正则表达式: [RegularExpression(@“([a-zA-Z0-9。@ -_ \ n \ t \ r] +)”,ErrorMessage = ValidationMessageConstants.EmailAdressInvalid)]

    我在这里缺少什么?这个正则表达式不在以下帖子中: DataAnnotations validation (Regular Expression) in asp.net mvc 4 - razor view

2 个答案:

答案 0 :(得分:3)

开箱即用,.NET 4.5具有System.ComponentModel.DataAnnotations程序集中的System.ComponentModel.DataAnnotations.EmailAddressAttribute,但这仅限于验证一个电子邮件地址。因此,如果您有一个接受分隔的电子邮件地址的模型,并且您使用此属性修饰该属性,它将失败,因为它会将整个字符串视为一封电子邮件。

我所做的是创建一个扩展的emailaddress属性,用于验证分隔的电子邮件地址:

    [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter, AllowMultiple = false)]
public class EmailAddressExAttribute : DataTypeAttribute
{
    #region privates
    private readonly EmailAddressAttribute _emailAddressAttribute = new EmailAddressAttribute();
    #endregion

    #region ctor
    public EmailAddressExAttribute() : base(DataType.EmailAddress){ }
    #endregion

    #region Overrides
    /// <summary>
    /// Checks if the value is valid
    /// </summary>
    /// <param name="value"></param>
    /// <returns></returns>
    public override bool IsValid(object value)
    {
        var emailAddr = Convert.ToString(value);
        if (string.IsNullOrWhiteSpace(emailAddr)) return false;

        //lets test for mulitple email addresses
        var emails = emailAddr.Split(new[] {';', ' ', ','}, StringSplitOptions.RemoveEmptyEntries);
        return emails.All(t => _emailAddressAttribute.IsValid(t));
    }
    #endregion

}

现在,您可以使用此新扩展属性修饰任何字符串属性,以验证分隔的电子邮件地址。您可以更新分隔符以包含您要使用的任何特殊字符。

希望这有帮助!

答案 1 :(得分:2)

你没有说明问题是什么,所以我将不得不从你的回答中假设数据注释没有像你期望的那样工作。

考虑到这一假设,很容易解释为什么它不起作用:数据注释在整个字段,文本区域中运行。如果您只有一封电子邮件,它将按预期工作。由于您在该字段中有多个电子邮件,以逗号或空格分隔,因此整个字段不会反映电子邮件规定的数据注释和失败。

回答您编号的问题:

  1. 不,没有开箱即用的

  2. 您使用的正则表达式不会考虑多个电子邮件,而是一个。您的案例中的解决方案将是

  3. 按照上面的链接,您将看到非常好的“如何”的例子,并希望能让您朝着正确的方向前进。 希望这有帮助,如果没有,请告诉我。