2

WebAPI はアクション パラメータで ValidationAttribute を処理できますか?

例えば:

public class SampleController : ApiController
{
   public string Get([RegularExpression("sampleExpression")]string id)
   {
      return "result";
   }
}

このサンプル WebAPI では、RegularExpressionAttribute (またはその他のデータ注釈属性) のメソッドを呼び出して、入力パラメーターを検証しません。ただし、クラスなどのオブジェクトをパラメーターとして渡す場合、WebAPI はプロパティを検証できます。

バグですか?それとも私は何か間違ったことをしていますか?

UPD:未解決の問題です: http://aspnetwebstack.codeplex.com/workitem/24?PendingVoteId=24

誰でも回避策を提案できますか?

4

2 に答える 2

1

これは本物の質問です。なぜ次のようなことをしないのか興味があります:

public class SampleController : ApiController
{
   public string Get(string id)
   {
      RegularExpressionHelper.ValidateWith("sampleExpression",id);

      return "result";
   }
}

私には、これは同等に簡潔に思えます。検証がいつ行われるかは明らかです。検証が失敗した場合、例外がスローされると安全に想定できます。追加の検証を簡単に追加して、それらが発生する順序に自信を持つことができます。

属性メソッドに関しては、検証がルート マッチングの一部として使用されているかどうかはわかりません。失敗した場合はどうなるかわかりません。検証の前後にどのフィルターが実行されるかわかりません。MVC をよく知っていれば、これらの質問に対する答えがわかると思いますが、コードの動作をフレームワーク制御のインフラストラクチャに依存させる属性を使用する利点がわかりません。

何か重要なメリットがありませんか?

于 2012-08-05T20:57:47.343 に答える
0

私も同じ疑問を持っていました。私の回避策は、パラメーターをカプセル化するためだけにクラスを作成することです。これにより、必要な検証属性でクラスを装飾できます。ダレルの回答で提案された回避策を使用できますが、アクションに入る前にModelState.IsValid をチェックするフィルターがあるため、アクションが実行される前に検証する必要があります。

[ModelBinder]
public class Item
{
    [RegularExpression("sampleExpression")]
    public string Id { get; set; }
}

クラスには で注釈を付ける必要があります。そうしないと、パラメーター バインディング メカニズムが要求の本文からフィールド[ModelBinder]を抽出しようとします。詳細については、この記事idをお読みください。

また、がcamelCaseではなくPascalCaseIdになっていることに注意してください。この記事を読んで、変換がどのように行われるかを理解してください。

アクションのシグネチャは次のとおりです。

public string Get(Item item)
于 2013-09-27T23:10:28.863 に答える