Является ли валидация DataTypeAttribute в MVC2?
Насколько я знаю, System.ComponentModel.DataAnnotations.DataTypeAttribute не работает в проверке модели в MVC v1. Например,
public class Model
{
[DataType("EmailAddress")]
public string Email {get; set;}
}
В приведенных выше кодах свойство Email не будет проверено в MVC v1. Работает ли он в MVC v2?
Ответы
Ответ 1
[DataType("EmailAddress")]
по умолчанию не влияет на валидацию. Это метод IsValid
этого атрибута (из рефлектора):
public override bool IsValid(object value)
{
return true;
}
Это пример пользовательского атрибута 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));
}
}
Ответ 2
Как LukLed указал, DataTypeAttribute по умолчанию не выполняет никаких валидаций. Но это влияет на шаблоны, касающиеся представления данных.
Например, если вы вызываете метод Html.DisplayFor()
для модели с атрибутом DataType(DataType.EmailAddress)
, она будет отформатировать ее значение с помощью <a href="mailto:{0}">{0}</a>
(по крайней мере, в MVC RC2).
Ответ 3
В качестве альтернативы вы можете напрямую использовать атрибут RegularExpression в своем поле вместо создания собственного атрибута, который в конце концов будет проверять соответствие регулярных выражений.
[RegularExpression(@"\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*", ErrorMessage = PaErrorMessages.InvalidEmailAddress)]
public string Email { get; set; }
Ответ 4
Начиная с .NET 4.5 существует EmailAddressAttribute, который имеет правильную реализацию метода IsValid
. Поэтому, если вы ориентируетесь на .NET 4.5, то для проверки используйте EmailAddressAttribute
вместо пользовательского. Например,
public class Model
{
[EmailAddress(ErrorMessage = "INVALID EMAIL")]
public string Email {get; set;}
}
И если вам интересно о реализации EmailAddressAttribute
, то вот декомпилировался (используя декомпилятор JetBrains dotPeek), источник класс:
using System;
using System.ComponentModel.DataAnnotations.Resources;
using System.Text.RegularExpressions;
namespace System.ComponentModel.DataAnnotations
{
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter, AllowMultiple = false)]
public sealed class EmailAddressAttribute : DataTypeAttribute
{
private static Regex _regex = new Regex("^((([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+(\\.([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+)*)|((\\x22)((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(\\\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.?$", RegexOptions.IgnoreCase | RegexOptions.ExplicitCapture | RegexOptions.Compiled);
static EmailAddressAttribute()
{
}
public EmailAddressAttribute()
: base(DataType.EmailAddress)
{
this.ErrorMessage = DataAnnotationsResources.EmailAddressAttribute_Invalid;
}
public override bool IsValid(object value)
{
if (value == null)
return true;
string input = value as string;
if (input != null)
return EmailAddressAttribute._regex.Match(input).Length > 0;
else
return false;
}
}
}
Ответ 5
Отправляйте сообщение в блоге Скотта Гатри по проверке MVC 2. Это отлично.
http://weblogs.asp.net/scottgu/archive/2010/01/15/asp-net-mvc-2-model-validation.aspx