質問
MVC C# アプリ内でデータを検証する最良の方法を見つけようとしていますが、xVal が最適であると思われました。ただし、データ型の検証で問題が発生しています。
最初は、DTO に対して UpdateModel を実行し、DTO 上で検証を実行していました。これは必須フィールドなどにはうまく機能しましたが、たとえば文字列 (「asd」) を 10 進フィールドにマップしようとすると、UpdateModel は例外をスローします。検証するデータが存在する前に UpdateModel を実行する必要があるため、それを回避する方法がわかりませんでした。
私の解決策は、UpdateModel がコピーするフォームごとの DTO を作成し、それに対して検証を実行して、値を適切な DTO にコピーすることでした。フォーム DTO のすべての属性は文字列なので、UpdateModel が爆発することはなく、xVal を通じてデータ検証を強制します。ただし、required などのルールは有効になっていますが、DataType ルールを有効にすることができないようです (この場合は DataType.Currency を試しています)。
クライアント側の検証も機能させようとしましたが、サーバー側でデータ型の検証を行うきれいな方法があることを期待していました。
サーバー側でのデータ型の検証に関して他の人は何をしましたか?
解決
私は何をやってしまったこと形態を表すいくつかのDTOを作成しました。これらのDTOは中のRequest.Formを取ると自動的にフォーム値と同じ名前であることに基づいて、内部の特性(例:公共の文字列の電子メール、パブリック文字列FIRSTNAME)にすべてのフォームの値をマッピングします。
<のp>彼らはすべての文字列プロパティを持つことになり、私はXVALはそれらの属性置くところ。私は、入ってくるデータが有効であったことを確認(例:有効な日付、電子メール、番号など)を作るためにXVALや正規表現を使用すると思います。このように、それは常に文字列に行っていたので、日付や何かにそれを解析しようとしている。ネットとは対照的に、例外がスロー存在になることはありません。このデータは常に私が欲しいの検証を実行し、私は有効なデータを持って知っていれば、の後、の日時などの適切な型に変換することができXVALにそれを作っていることを確認します。
他のヒント
サーバー側で文字列から他のデータ型に解析する必要があるデータを検証するために、ValidationAttribute から派生したカスタム バリデータを使用しています。例えば:
public class DateAttribute : ValidationAttribute
{
public override bool IsValid(object value)
{
var date = (string)value;
DateTime result;
return DateTime.TryParse(date, out result);
}
}
また、カスタム JavaScript コードを作成せずに、そのような検証属性をクライアント側とサーバー側の検証属性に変換する方法も見つけました。別の検証属性基本クラスから派生する必要があるだけです。私のものを見てください クライアント側の検証に関するブログ記事 これについてさらに詳しく知りたい場合は。