ASP.Net MVC2中的通用DataAnnotations

时间:2010-05-21 14:11:55

标签: validation asp.net-mvc-2 data-annotations

你好,我有一个简单的问题。我有一组使用System.CompontentModel.DataAnnotations的验证。我有一些特定于某些视图模型的验证,所以我很满意将验证代码放在与我的模型相同的文件中(如在MVC2附带的默认AccountModels.cs文件中)。但我也有一些适用于多个模型的常见验证(例如有效的电子邮件地址格式)。当我将该验证剪切/粘贴到需要它的第二个模型时,当然我得到一个重复的定义错误,因为它们位于相同的命名空间(projectName.Models)中。所以我想到删除命名空间中单独的类的常见验证,期望我的所有视图模型都能够从那里访问验证。出乎意料的是,验证不再可访问。我已经验证它们仍然在同一名称空间中,并且它们都是公开的。我不希望我必须对它们进行任何特定的引用(尝试为同一命名空间添加using语句,但是没有解决它,并且通过添加引用对话框,项目无法引用自身(使感觉)。

那么为什么我的模型看不到为什么公共验证只是被移动到同一命名空间中的另一个文件?

CommonValidations.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Text.RegularExpressions;

namespace ProjectName.Models
{
    public class CommonValidations
    {
        [AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = true, Inherited = true)]
        public sealed class EmailFormatValidAttribute : ValidationAttribute
        {
            public override bool IsValid(object value)
            {
                if (value != null)
                {
                    var expression = @"^[a-zA-Z][\w\.-]*[a-zA-Z0-9]@[a-zA-Z0-9][\w\.-]*[a-zA-Z0-9]\.[a-zA-Z][a-zA-Z\.]*[a-zA-Z]$";
                    return Regex.IsMatch(value.ToString(), expression);
                }
                else
                {
                    return false;
                }
            }
        }
    }
}

这是我想要使用验证的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using Growums.Models;

namespace ProjectName.Models
{
    public class PrivacyModel
    {
        [Required(ErrorMessage="Required")]
        [EmailFormatValid(ErrorMessage="Invalid Email")]
        public string Email { get; set; }
    }
}

1 个答案:

答案 0 :(得分:1)

您已将EmailFormatValidAttribute声明为CommonValidations的子类。因此,您需要像CommonValidations.EmailFormatValidAttribute一样引用它。或者将EmailFormatValidAttribute类移出CommonValidations类。

这应该有效:

[CommonValidations.EmailFormatValid(ErrorMessage="Invalid Email")]
public string Email { get; set; }

顺便说一下,您可以按如下方式简化课程:

public class EmailFormatValidAttribute : RegularExpressionAttribute
{            
   public EmailFormatValidAttribute() : 
      base(@"^[a-zA-Z][\w\.-]*[a-zA-Z0-9]@[a-zA-Z0-9][\w\.-]*[a-zA-Z0-9]\.[a-zA-Z][a-zA-Z\.]*[a-zA-Z]$")
   {}
}

另外,请看一下:Data Annotations Extensions。这是一个很棒的DataAnnotations库,它已经包含了最常见的验证。

相关问题