【问题标题】:DataAnnotation TextArea Multiple EmailsDataAnnotation TextArea 多封电子邮件
【发布时间】:2013-05-21 03:10:21
【问题描述】:

我正在使用 MVC 3。

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

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

    开箱即用,.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
    
    }
    

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

    希望这会有所帮助!

    【讨论】:

    • 不错。就我而言,我选择了正则表达式路由。
    • 好主意,适合我的场景。
    【解决方案2】:

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

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

    回答你编号的问题:

    1. 不,没有开箱即用的

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

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

    【讨论】:

    • 我从 #1 开始,但现在将使用您为 #2 指定的资源。谢谢
    猜你喜欢
    • 1970-01-01
    • 2011-02-08
    • 2015-05-29
    • 2016-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-13
    相关资源
    最近更新 更多