Как создать собственный атрибут проверки для MVC
Я хотел бы создать специальный атрибут проверки для MVC2 для адреса электронной почты, который не наследуется от RegularExpressionAttribute, но который может использоваться при проверке клиента. Может ли кто-нибудь указать мне в правильном направлении?
Я попробовал что-то простое:
[AttributeUsage( AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false )]
public class EmailAddressAttribute : RegularExpressionAttribute
{
public EmailAddressAttribute( )
: base( Validation.EmailAddressRegex ) { }
}
но он не работает для клиента. Однако, если я использую RegularExpression (Validation.EmailAddressRegex)], он работает нормально.
Ответы
Ответ 1
Вам необходимо зарегистрировать адаптер для нового атрибута, чтобы включить проверку на стороне клиента.
Поскольку у параметра RegularExpressionAttribute уже есть адаптер, который является RegularExpressionAttributeAdapter, все, что вам нужно сделать, это его повторно использовать.
Используйте статический конструктор, чтобы сохранить все необходимые коды в одном классе.
[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false)]
public class EmailAddressAttribute : RegularExpressionAttribute
{
private const string pattern = @"^\w+([-+.]*[\w-]+)*@(\w+([-.]?\w+)){1,}\.\w{2,4}$";
static EmailAddressAttribute()
{
// necessary to enable client side validation
DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(EmailAddressAttribute), typeof(RegularExpressionAttributeAdapter));
}
public EmailAddressAttribute() : base(pattern)
{
}
}
Для получения дополнительной информации ознакомьтесь с этим сообщением, объясняющим полный процесс.
http://haacked.com/archive/2009/11/19/aspnetmvc2-custom-validation.aspx
Ответ 2
На странице MSDN CustomValidationAttribute Class есть несколько примеров. Сообщение Phil Haacked устарело.
Ответ 3
Посмотрите на универсальный зависимый идентификатор свойства в this article
Ответ 4
Пробовали ли вы использовать аннотации данных?
Это мой проект аннотаций используя System.ComponentModel.DataAnnotations;
public class IsEmailAddressAttribute : ValidationAttribute
{
public override bool IsValid(object value)
{
//do some checking on 'value' here
return true;
}
}
Это в проекте "Мои модели"
namespace Models
{
public class ContactFormViewModel : ValidationAttributes
{
[Required(ErrorMessage = "Please provide a short message")]
public string Message { get; set; }
}
}
Это мой контроллер
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult ContactUs(ContactFormViewModel formViewModel)
{
if (ModelState.IsValid)
{
RedirectToAction("ContactSuccess");
}
return View(formViewModel);
}
Вам понадобится Google DataAnnotations, так как вам нужно захватить проект и скомпилировать его. Я бы это сделал, но мне нужно уйти отсюда долгое время.
Надеюсь, что это поможет.
ИЗМЕНИТЬ
Обнаружено это как быстрый google.