3

我正在使用 MVC 3。

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

  1. 是否有可以处理这种情况的属性?

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

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

我在这里想念什么?此正则表达式与以下帖子无关: asp.net mvc 4 中的 DataAnnotations 验证(正则表达式)-剃刀视图

4

2 回答 2

8

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

我所做的是创建一个扩展的 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

}

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

希望这可以帮助!

于 2014-03-05T18:41:38.580 回答
3

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

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

要回答您编号的问题:

  1. 不,没有开箱即用

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

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

于 2013-05-22T12:33:30.933 回答