Как создать собственный атрибут проверки?

Я пытаюсь создать собственный атрибут проверки.

public class PhoneValidator : ValidationAttribute
{
    public override bool IsValid(object value)
    {
        return new RegularExpressionAttribute(@"^[+0]\d+").IsValid(Convert.ToString(value).Trim());
    }
}

И я использую это, чтобы использовать

[PhoneValidator]
public string PhoneNumber { get; private set; }

Скопировал с сайта, по идее должно работать. Но я не мог заставить его работать.


person David91    schedule 21.05.2014    source источник
comment
теоретически это работает, но я не работаю Что? Что не работает? Как вы вызываете проверку?   -  person Chris Mantle    schedule 21.05.2014
comment
Я люблю отмечать красным поле во время набора текста, а не после, помнишь меня?   -  person David91    schedule 21.05.2014
comment
Вы читали это?msdn.microsoft .com/en-us/library/vstudio/   -  person Dmitry Zaets    schedule 21.05.2014
comment
сейчас читаю, спасибо   -  person David91    schedule 21.05.2014


Ответы (1)


Вот пример из MSDN. :

Атрибут PhoneMaskAttribute .cs:

using System;
using System.Globalization;
using System.ComponentModel.DataAnnotations;


[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)]
sealed public class PhoneMaskAttribute : ValidationAttribute
{
    // Internal field to hold the mask value.
    readonly string _mask;

    public string Mask
    {
        get { return _mask; }
    }

    public PhoneMaskAttribute(string mask)
    {
        _mask = mask;
    }


    public override bool IsValid(object value)
    {
        var phoneNumber = (String)value;
        bool result = true;
        if (this.Mask != null)
        {
            result = MatchesMask(this.Mask, phoneNumber);
        }
        return result;
    }

    // Checks if the entered phone number matches the mask.
    internal bool MatchesMask(string mask, string phoneNumber)
    {
        if (mask.Length != phoneNumber.Trim().Length)
        {
            // Length mismatch.
            return false;
        }
        for (int i = 0; i < mask.Length; i++)
        {
            if (mask[i] == 'd' && char.IsDigit(phoneNumber[i]) == false)
            {
                // Digit expected at this position.
                return false;
            }
            if (mask[i] == '-' && phoneNumber[i] != '-')
            {
                // Spacing character expected at this position.
                return false;
            }
        }
        return true;
    }

    public override string FormatErrorMessage(string name)
    {
        return String.Format(CultureInfo.CurrentCulture,
          ErrorMessageString, name, this.Mask);
    }

}

Использование:

CustomerMetadata.cs:

using System.Web.DynamicData;
using System.ComponentModel.DataAnnotations;
[MetadataType(typeof(CustomerMetadata))]
public partial class Customer
{
}
public class CustomerMetadata
{
    [PhoneMask("999-999-9999",
        ErrorMessage = "{0} value does not match the mask {1}.")]
    public object Phone; 
}

Ссылки:

Как настроить проверку поля данных в Модель данных с использованием настраиваемых атрибутов

person Dmitry Zaets    schedule 21.05.2014
comment
Но это работает после или до нажатия кнопки? Пробую на примере майкрософта и это не показывает при вводе текста - person David91; 21.05.2014
comment
Ваш вопрос: как создать настраиваемый атрибут проверки? - person Dmitry Zaets; 21.05.2014
comment
Если вы хотите получить ответ на другой вопрос, например, как выполнить проверку на стороне клиента при нажатии клавиши и т. д., создайте отдельный вопрос. - person Dmitry Zaets; 21.05.2014
comment
Эта статья может помочь вам с проверкой на стороне клиента: asp.net/mvc/tutorials/older-versions/javascript/ - person Dmitry Zaets; 21.05.2014