2016-10-24 5 views
1

У меня есть атрибут данных для длины строки, как указано ниже, для 40 символов.Аннотации данных MVC - длина динамической строки

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

ответ

1

Вы не можете передать непостоянную значение атрибута, поэтому ваше решение не может быть реализовано.

Однако вы можете передать значение const из файла конфигурации. Если вы принимаете поведение следующим образом: проверка строки будет иметь максимальную длину для всего срока службы приложения и для ее изменения вы должны перезагрузить приложение, посмотрите на variables in application config.

Если вы не приемлет такое поведение, то один из возможных решений для хранения MaxLength где-то в базе данных и создать свой собственный StringLengthAttribute, который будет запрашивать БД (или другой источник данных) в течение valigation следующим образом:

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

Другим возможным решением является выполнение проверки на стороне клиента вместо серверной. На ваш взгляд, если вы будете запрашивать свой источник данных с клиентской стороны, он будет выглядеть лучше, чем запрашивать его из атрибута.

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