2016-10-24 10 views
1

私は以下のように40文字の文字列長のデータ属性を定義しています。MVCデータの注釈 - 動的文字列の長さ

ここで、サービスからその値を取得するために要件が変更されました。

これらのデータ属性に値を取得する方法はありますか。 文字列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を保存し、次のようにvaligation中にDB(または別のデータソース)を照会し、独自のStringLengthAttributeを作成することです。

[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; } 
関連する問題