DataAnnotations - 禁止数字,或仅允许给定字符串

时间:2010-05-28 19:54:52

标签: c# asp.net-mvc validation asp.net-mvc-2 data-annotations

是否可以使用ASP.NET MVC 2的DataAnnotations仅允许字符(无数字),甚至提供允许字符串的白名单?实施例

3 个答案:

答案 0 :(得分:33)

使用RegularExpressionAttribute

这样的东西
[RegularExpression("^[a-zA-Z ]*$")]

将匹配a-z大小写和空格。

白名单看起来像

[RegularExpression("white|list")]

应该只允许“白色”和“列表”

[RegularExpression("^\D*$")]

\ D表示非数字字符,因此上面应该允许包含0-9之外的任何字符串。

正则表达式很棘手,但在线有一些有用的测试工具,如: http://gskinner.com/RegExr/

答案 1 :(得分:4)

是。使用“[RegularExpression]”

这是一个关于正则表达式的精彩网站 http://www.regexlib.com/CheatSheet.aspx

答案 2 :(得分:2)

您可以编写自己的验证器,其性能优于正则表达式。

这里我为int属性写了一个白名单验证器:

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;

namespace Utils
{
    /// <summary>
    /// Define an attribute that validate a property againts a white list
    /// Note that currently it only supports int type
    /// </summary>
    [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)]
    sealed public class WhiteListAttribute : ValidationAttribute
    {
        /// <summary>
        /// The White List 
        /// </summary>
        public IEnumerable<int> WhiteList
        {
            get;
        }

        /// <summary>
        /// The only constructor
        /// </summary>
        /// <param name="whiteList"></param>
        public WhiteListAttribute(params int[] whiteList)
        {
            WhiteList = new List<int>(whiteList);
        }

        /// <summary>
        /// Validation occurs here
        /// </summary>
        /// <param name="value">Value to be validate</param>
        /// <returns></returns>
        public override bool IsValid(object value)
        {
            return WhiteList.Contains((int)value);
        }

        /// <summary>
        /// Get the proper error message
        /// </summary>
        /// <param name="name">Name of the property that has error</param>
        /// <returns></returns>
        public override string FormatErrorMessage(string name)
        {
            return $"{name} must have one of these values: {String.Join(",", WhiteList)}";
        }

    }
}

样品使用:

[WhiteList(2, 4, 5, 6)]
public int Number { get; set; }