我有一个数据属性,字符串长度定义如下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; }
答案 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; }