MVC数据注释 - 动态字符串长度

时间:2016-10-24 12:33:24

标签: asp.net-mvc data-annotations

我有一个数据属性,字符串长度定义如下40个字符。

[Display(Name = "Name"), StringLength(40, ErrorMessage = "The name cannot be more than 40 characters")]
public string EmployeeName { get; set; }

现在更改了需求以从服务获取该值。

有没有办法将这些值纳入这些数据属性,例如: string s = 50; //假设调用服务来获取此值

[Display(Name = "Name"), StringLength(s, ErrorMessage = "The name cannot be more than {0} characters")]
public string EmployeeName { get; set; }

2 个答案:

答案 0 :(得分:1)

您无法将非常量值传递给属性,因此无法实现您的解决方案。

但是,您可以从配置文件传递const值。如果您接受以下行为:字符串的验证将在整个应用程序生命周期内具有单个最大长度,并且要更改它,您应该重新启动应用程序,请查看variables in application config

如果您不接受此行为,可能的解决方案之一是将MaxLength存储在数据库中并创建您自己的StringLengthAttribute,它将在valigation期间查询DB(或其他数据源)通过以下方式:

[AttributeUsage(AttributeTargets.Property, Inherited = false, AllowMultiple = true)]
sealed class MyValidationAttribute : ValidationAttribute
{
    public MyValidationAttribute()
    {

    }

    public override bool IsValid(object value)
    {
        if (value != null && value.GetType() == typeof(string))
        {
            int maxLength = //query your data source

            return ((string)value).Length <= maxLength;
        }

        return base.IsValid(value);
    }
}

另一种可能的解决方案是执行客户端验证而不是服务器端。如果您将从客户端查询数据源,那么看起来会比在属性中查询数据更好。

答案 1 :(得分:0)

您无法将动态值传递给属性,但您可以在属性实现中检索它自己的动态值,并仅将键传递给该属性。例如:

public class DynamicLengthAttribute : ValidationAttribute
{
    private string _lengthKey;

    public DynamicLengthAttribute (string lengthKey)
    {
     _lengthKey = lengthKey;
    }

    public override bool IsValid(object value)
    {
        if (value != null && value.GetType() == typeof(string))
        {
           //retrive teh max length from the database according to the lengthKey variable, if you will store it in web.config you can do:

           int maxLength = ConfigurationManager.AppSettings[_lengthKey];
            return ((string)value).Length <= maxLength;
        }

        return base.IsValid(value);
    }
}

并在您的模型中

[DynamicLength(maxLengths="EmpNameMaxLength", ErrorMessage = "The name cannot be more than {0} characters")]
public string EmployeeName { get; set; }