Работает ли валидация DataTypeAttribute в MVC2?
Насколько я знаю, System.ComponentModel.DataAnnotations.DataTypeAttribute не работает при проверке модели в MVC v1. Например,
public class Model
{
[DataType("EmailAddress")]
public string Email {get; set;}
}
В приведенных выше кодах свойство Email не будет проверено в MVC v1. Это работает в MVC v2?
5 ответов
[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));
}
}
Как указывалось в LukLed, DataTypeAttribute по умолчанию не выполняет никакой проверки. Но это влияет на шаблоны относительно того, как данные представлены.
Например, если вы звоните Html.DisplayFor()
метод на модели, которая имеет DataType(DataType.EmailAddress)
атрибут, он отформатирует свое значение с <a href="mailto:{0}">{0}</a>
(по крайней мере, в MVC RC2).
Кроме того, вы можете напрямую использовать атрибут RegularExpression в своем поле вместо создания собственного атрибута, который в конце концов будет проверять соответствие регулярному выражению.
[RegularExpression(@"\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*", ErrorMessage = PaErrorMessages.InvalidEmailAddress)]
public string Email { get; set; }
Начиная с.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;
}
}
}
Проверьте сообщение в блоге Скотта Гатри о проверке MVC 2. Это превосходно. http://weblogs.asp.net/scottgu/archive/2010/01/15/asp-net-mvc-2-model-validation.aspx