DataTypeAttribute验证是否在MVC2中有效?

wen*_*ang 21 c# email validation asp.net-mvc data-annotations

据我所知,System.ComponentModel.DataAnnotations.DataTypeAttribute不适用于MVC v1中的模型验证.例如,

public class Model
{
  [DataType("EmailAddress")]
  public string Email {get; set;}
}
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,不会在MVC v1中验证Email属性.它在MVC v2中运行吗?

Luk*_*Led 36

[DataType("EmailAddress")]默认情况下不会影响验证.这是IsValid此属性的方法(来自反射器):

public override bool IsValid(object value)
{
    return true;
}
Run Code Online (Sandbox Code Playgroud)

这是用于验证电子邮件的自定义DataTypeAttribute的示例(取自此站点http://davidhayden.com/blog/dave/archive/2009/08/12/CustomDataTypeAttributeValidationCustomDisplay.aspx):

[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple  = false)]
public class EmailAddressAttribute : DataTypeAttribute
{
    private readonly Regex regex = new Regex(@"\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*", RegexOptions.Compiled);

    public EmailAddressAttribute() : base(DataType.EmailAddress)
    {

    }

    public override bool IsValid(object value)
    {

        string str = Convert.ToString(value, CultureInfo.CurrentCulture);
        if (string.IsNullOrEmpty(str))
            return true;

        Match match = regex.Match(str);   
        return ((match.Success && (match.Index == 0)) && (match.Length == str.Length));
    }
}
Run Code Online (Sandbox Code Playgroud)


Çağ*_*kin 13

LukLed指出的一样,DataTypeAttribute默认情况下不进行任何验证.但它确实会影响有关数据呈现方式的模板.

例如,如果Html.DisplayFor()在具有DataType(DataType.EmailAddress)属性的模型上调用方法,则它将使用<a href="mailto:{0}">{0}</a>(至少在MVC RC2中)格式化其值.

  • 感谢您指出DataTypeAttribute不是验证属性. (2认同)

Eti*_*nne 8

或者,您可以直接在字段上使用RegularExpression属性,而不是创建自己的属性,最终将检查正则表达式匹配.

[RegularExpression(@"\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*", ErrorMessage = PaErrorMessages.InvalidEmailAddress)]
public string Email { get; set; }
Run Code Online (Sandbox Code Playgroud)