2016-04-01 21 views
0

モデルの検証を実行する2つのカスタム検証があります。最初は、文字列 "<"と ">"に文字が含まれているかどうかを確認するコントロールです。2番目の日付は2つの日付が連続しているかどうかを確認するためのものです。ASP.NET MVCのカスタム検証は機能しません

アングルブラケットバリ

public class AngleBracketsValidator : ValidationAttribute 
{  
    public override Boolean IsValid(Object value) 
    { 


     Boolean isValid = true; 
     if (value != null && (value.ToString().Contains('<') || value.ToString().Contains('>'))) 
     { 
      isValid = false; 
     } 

     return isValid; 
    } 
} 

日バリ

public class CustomDateCompareValidator : ValidationAttribute 
{ 
    public String PropertyDateStartToCompare { get; set; } 

    public String PropertyDateEndToCompare { get; set; } 

    public CustomDateCompareValidator(string propertyDateStartToCompare, string propertyDateEndToCompare) 
    { 
     PropertyDateStartToCompare = propertyDateStartToCompare; 
     PropertyDateEndToCompare = propertyDateEndToCompare; 
    } 

    public override Boolean IsValid(Object value) 
    { 
     Type objectType = value.GetType(); 
     PropertyInfo[] neededProperties = 
      objectType.GetProperties() 
      .Where(propertyInfo => propertyInfo.Name == PropertyDateStartToCompare || propertyInfo.Name == PropertyDateEndToCompare) 
      .ToArray(); 

     if (neededProperties.Count() != 2) 
     { 
      throw new ApplicationException("CustomDateCompareValidator error on " + objectType.Name); 
     } 

     Boolean isValid = true; 
     if (Convert.ToDateTime(neededProperties[0].GetValue(value, null)) != Convert.ToDateTime("01/01/0001") && Convert.ToDateTime(neededProperties[1].GetValue(value, null)) != Convert.ToDateTime("01/01/0001")) 
     { 
      if (Convert.ToDateTime(neededProperties[0].GetValue(value, null)) > Convert.ToDateTime(neededProperties[1].GetValue(value, null))) 
      { 
       isValid = false; 
      } 
     }  
     return isValid; 
    } 
} 

モデル:最初のバリことが知られている試験を行う

[Serializable] 
[CustomDateCompareValidator("DtStart", "DtEnd", ErrorMessage = "the start date is greater than that of the end.")] 
public class ProjModel 
{ 
    [Display(Name = "Codice:")] 
    [AllowHtml] 
    [AngleBracketsValidator(ErrorMessage = "Code can not contain angle bracket.")] 
    public string Code { get; set; } 

    [Display(Name = "Date Start:")] 
    public DateTime? DtStart { get; set; } 

    [Display(Name = "Date End:")] 
    public DateTime? DtEnd { get; set; } 

} 

ながら、角括弧のは、表示されています2番目に、日付のものが表示されます。しかし、キュー内に公平な値を投稿し、山括弧の検証をパスすると、日付バリデータの表示でエラーメッセージが表示されます。 正しく動作させるためのアイデアはありますか?

+1

質問を再入力してください。実際にうまくいかないことを理解するのは難しいです。 – Mats

+0

私の悪い英語のため申し訳ありません...問題は、同時に2つのバリデータを表示できないことです。 –

+0

'CustomDateCompareValidator'をクラスに適用しないでください。これをモデルのプロパティに適用します。たとえば、 'DtEnd'とし、それに他のプロパティ(' DtStart')を指定して比較します。 [foolproof](http://foolproof.codeplex.com/) '[GreaterThan]'や同様の検証属性を使用することをお勧めします。これはクライアント側の検証も行います。 –

答えて

0

"これはサポートされていません。プロパティレベルの検証のいずれかが失敗した場合、クラスレベルの検証は実行されません"。 オリジナルをご覧くださいentry