質問

xValをASP.Net MVCフレームワークのエンティティを検証するためのフレームワークとして評価しています。私は最近、検証ルールが破られるたびに、xValが例外をスローすることを発見しました。私には間違っているようです。たとえば、ユーザーがフォームに入力し、3つの必須フィールドの入力を忘れると、3つの例外がスローされます。これは良い習慣ですか? (編集:私もこれを読みますので、良い習慣ではないと思います)

xValの使用経験は何ですか?例外をスローしない優れた代替検証フレームワークはありますか?

ありがとう

(PS: Fluent Validationを使用していることを知らせるために、多くの人がこれを読んでいることに気付きました now)

役に立ちましたか?

他のヒント

いいえ、深刻な問題は何も起きていないため、単純なメッセージの代わりに例外を表示するのは良い習慣ではありません...代わりにこれらのエラーを ModelState に入力し、<を使用してフォームに表示する必要があります

Html.ValidationMessage("EntityPropertyName");

xValはこれらすべてをサポートしています。また、フォームがポストバックされる前にクライアント側で検証します。

一部のコード

エンティティクラス(またはそのメタデータコンパニオンクラス)に DataAnnotations 属性を設定すると、Validate()メソッドも実装する可能性が高くなります。最良の方法は、それらを自動生成するT4を使用することです。そのため、同じコードを何度も繰り返す必要はありません。

public IEnumerable<ErrorInfo> Validate()
{
    IList<ErrorInfo> errors = DataAnnotationsValidationRunner.GetErrors(this).ToList<ErrorInfo>();
    return errors.AsEnumerable();
}

あなたがしなければならないのは、これを呼び出すことです:

IEnumerable<ErrorInfo> errors = entityObjectInstance.Validate();
if (errors.Any())
{
    new RulesException(errors).AddModelStateErrors(filterContext.Controller.ViewData.ModelState, entityPropertyName);
}

これをさらに自動化するために、アクションフィルターでこれを実装できるため、コントローラーアクションに渡されるエンティティオブジェクトの検証が自動的に行われます。コントローラアクションは、 ModelState.IsValid()かどうかを確認するだけで済みます。

ここで必要なもう1つのクラスは(そしてWebのどこかから取得されます):

public static class DataAnnotationsValidationRunner
{
    public static IEnumerable<ErrorInfo> GetErrors(object instance)
    {
        var metadataAttribute = instance.GetType().GetCustomAttributes(typeof(MetadataTypeAttribute), true).OfType<MetadataTypeAttribute>().FirstOrDefault();
        var metaClass = metadataAttribute != null ? metadataAttribute.MetadataClassType : instance.GetType();
        var metaClassProperties = TypeDescriptor.GetProperties(metaClass).Cast<PropertyDescriptor>();
        var modelClassProperties = TypeDescriptor.GetProperties(instance.GetType()).Cast<PropertyDescriptor>();

        return from metaProp in metaClassProperties
               join modelProp in modelClassProperties on metaProp.Name equals modelProp.Name
               from attribute in metaProp.Attributes.OfType<ValidationAttribute>()
               where !attribute.IsValid(modelProp.GetValue(instance))
               select new ErrorInfo(metaProp.Name, attribute.FormatErrorMessage(string.Empty), instance);
    }
}

MVC 2

Asp.net MVC 2 Beta 2での検証は、xValでの検証と似ています。そのため、プロジェクトにあまり詳しくなく、基盤として開発進行中のコードを使用することを検討できる場合は、おそらくそれがあなたのための方法です。

xValは素晴らしいと思います。で使用しています。 Castle Validators で完全に機能します。検証を実行しているときに必ずRulesExceptionをキャッチし、ModelStateにエラーを追加します。例:

try
{
  // execute validation runner
}
catch (RulesException ex)
{
   ex.AddModelStateErrors(ModelState, "prefix");
}

ASP.NET MVC v2は、独自の検証フレームワークを導入します

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top