3

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

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

ありがとう

(追伸: 多くの人がこれを読んでいることに気付きました。私が現在Fluent Validation を使用していることをお知らせするためだけです)

4

3 に答える 3

5

Beta 2 の検証を見たことがありますか?

http://blogs.msdn.com/rickandy/archive/2009/10/03/client-side-validation-for-mvc-2-p2.aspx

于 2009-11-27T12:08:04.537 に答える
3

いいえ、重大な問題は発生していないため、簡単なメッセージの代わりに例外を表示することはお勧めできません...代わりに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);
    }
}

MVC2

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

于 2009-11-27T12:07:53.090 に答える
2

xVal は素晴らしいと思います。Castle Validatorsと一緒に使用してきましたが、完璧に動作します。検証を実行しているときはいつでも RulesException をキャッチし、ModelState にエラーを追加するだけです。

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

ASP.NET MVC v2 では、独自の検証フレームワークが導入されます。

于 2009-11-27T12:10:47.057 に答える