c# - 如何创建自定义验证属性?

标签 c# data-annotations

我正在尝试创建自定义验证属性。

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; }

我从网站上复制了它,理论上这应该可行。但我无法让它发挥作用。

最佳答案

这是来自 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);
    }

}

用法:

客户元数据.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; 
}

链接:

How to: Customize Data Field Validation in the Data Model Using Custom Attributes

关于c# - 如何创建自定义验证属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23780943/

相关文章:

c# - .Net Core 单元测试错误 - 源 IQueryable 未实现 IAsyncEnumerable<...>

entity-framework - 我应该如何使用 EF 4.1 注释 CreatedOn 和 ModifiedOn 列?

c# - 无效的跨线程访问问题

c# - Fluent NHibernate 异常 : An association from the table X refers to an unmapped class: System. 字符串

c# - 使用 C# 检测 IE11

c# - ExecuteReader : Connection property has not been initialized. 如何解决这个问题?

c# - Guid的验证

c# - 属性未调用的隐式/显式转换运算符 (System.ComponentModel.DataAnnotation.dll)

asp.net - 如何仅存储 hh :mm in the datetime field?

c# - stringlength属性errormessage带什么参数?