12

Web API REST コマンドの入力を検証したいと考えています。State以下のように、パラメーターの有効な値を制限する属性で装飾されているようにしたいと思います。

public class Item {
    ...

    // I want State to only be one of "New", "Used", or "Unknown"
    [Required]
    [ValidValues({"New", "Used", "Unknown"})]
    public string State { get; set; }

    [Required]
    public string Description { get; set; }

    ...
}

Web API の粒度に逆らわずにこれを行う方法はありますか。理想的には、アプローチは Ruby on Rails のカスタム検証に似ています。

4

4 に答える 4

29

派生したカスタム検証属性を作成し、メンバー関数ValidationAttributeをオーバーライドします。IsValid

public class ValidValuesAttribute: ValidationAttribute
{
  string[] _args;

  public ValidValuesAttribute(params string[] args)
  {
    _args = args;
  }

  protected override ValidationResult IsValid(object value, ValidationContext validationContext)
  {
    if (_args.Contains((string)value))
      return ValidationResult.Success;
    return new ValidationResult("Invalid value.");
  }
}

それからあなたはすることができます

[ValidValues("New", "Used", "Unknown")]

上記のコードはコンパイルもテストもされていません。

于 2013-06-21T20:28:59.403 に答える
1

値はどのように API に渡されますか? それはクエリパラメータですか、それとも本文にありますか? 私は通常、リクエスト ハンドラ レベルでチェックを行うだけです。受け入れられる値をリストまたは配列に入れる場合は、Contains拡張メソッドを使用できます。

  if (validStates.Contains(input))
  {
     return MethodThatProcessesRequest(requiredData);
  }
  else
  {
     return ErrorHandlingMethod(requiredData);
  }

このタイプの検証はサーバー側で行う必要があります。UI での入力は自由に制限できますが、REST API を作成している場合はクライアントの動作に関係なく、すべての入力を検証する必要があります。

于 2013-06-21T20:24:59.147 に答える
0

以下のように正規表現を使用してこれを行うこともできます。

[Required]
[RegularExpression("New|Used|Unknown", ErrorMessage = "Invalid State")]
 public string State{ get; set; }

詳細はこちら

于 2021-03-16T19:48:33.727 に答える