2009-08-31 4 views
2

MVC C#アプリケーションとxVal内のデータを検証する最適な方法を理解しようとしています.xValが最適です。しかし、私はデータ型のバリデーションに問題があります。xValを使用したデータ型の検証

私は最初にDTOにUpdateModelを実行してから、DTOで検証を実行していました。これは必須フィールドのようなものではうまくいきましたが、たとえば、文字列( "asd")を10進数のフィールドにマップしようとすると、UpdateModelは例外をスローします。検証するデータがある前にUpdateModelを実行しなければならなかったので、私はそれを回避する方法がわかりませんでした。

私の解決策は、UpdateModelがコピーするフォームごとにDTOを作成し、その検証を実行してから、値を適切なDTOにコピーすることでした。フォームDTOのすべての属性は文字列なので、UpdateModelは決して爆発することはありません。xValを通じてデータ検証を強制します。しかし、要求のようなルールが踏み込まれている間は、DataTypeルールを取得することはできません(この場合、DataType.Currencyを試行します)。

私はまた、クライアント側の検証を機能させることを試みましたが、データ型のサーバー側の検証を行うためのきれいな方法があることを期待していました。

サーバー側のデータ型の検証に関して他の人たちは何をしましたか?

+0

DTOでは、カスタムViewModelを意味しますか? –

答えて

2

私がやったことは、フォームを表すいくつかのDTOを作成することでした。これらのDTOはRequest.Formを取り込み、自動的にすべてのフォーム値をフォーム値と同じ名前である内部プロパティ(ex public string email、public string firstname)にマップします。

これらはすべての文字列プロパティを持ち、xVal属性をそれらに配置します。私はxValと正規表現を使用して、データが有効であることを確認します(有効な日付、電子メール、番号など)。この方法では、.Netが日付や何かに解析しようとするのとは対照的に、いつも文字列に入っていたので例外がスローされることはありません。

これは、私が必要とする検証を実行することができるxValにデータが常に作られていることを確認します。次には有効なデータがあると、DateTimeのような適切なタイプに変換します。

1

私はValidationAttributeから派生したカスタムバリデータを使用して、サーバー側で解析する必要のあるデータを文字列から他のデータ型に検証しています。たとえば:

public class DateAttribute : ValidationAttribute 
    { 

     public override bool IsValid(object value) 
     { 
      var date = (string)value; 
      DateTime result; 
      return DateTime.TryParse(date, out result); 
     } 
    } 

私はまた、このような検証javascriptのコードの任意のカスタムを記述することなく、属性、クライアント側とサーバー側の検証に属性を有効にする方法を見つけました。私はちょうど別の検証属性の基底クラスから派生しなければなりません。詳細については、blog article about client-side validationをご覧ください。

+0

検証は問題ではありません。検証する前に検証を保存する場所です。私は理想的には、ビューモデルを必要とせずにDTOにコピーしたいと思っていました。通貨フィールドは小数点になります。しかし、これはintフィールドに文字列を入力しようとすると破損し、UpdateModelを使ってフィールドは、フォームをビュー・モデルまたはDTOに形成します。 – Parrots

関連する問題