2

ASP.NET Web API でオプションのパラメーターのデータ型を検証するにはどうすればよいですか?

私のルーティングは次のようになります。

context.MapHttpRoute(
    name: "ItemList",
    routeTemplate: "api/v1/projects/{projectId}/items",
    defaults: new
        {
            area = AreaName,
            controller = "Items",
            action = "GetItems",
            offset = RouteParameter.Optional,
            count = RouteParameter.Optional,
        }
);

これらはすべて有効なリクエストです。

http://localhost/api/v1/projects/1/items  
http://localhost/api/v1/projects/1/items?offset=20  
http://localhost/api/v1/projects/1/items?count=10  
http://localhost/api/v1/projects/1/items?offset=20&count=10

パラメータの 1 つに無効な値が指定されている場合を除いて、すべて正常に機能します。例えば、

http://localhost/api/v1/projects/1/items?count=a

検証エラーはなく、count が null になるだけです。

これを検出してエラー メッセージを返す方法はありますか? カスタム メッセージ ハンドラーを使用した解決策をどこかで見たことを思い出すと思いますが、それ以上は見つかりません。

コントローラ メソッドは次のようになります。

public IEnumerable<Item> GetItems([FromUri]GetItemsParams getItemsParams)
{
    // logic
}

params クラスは次のようになります。

[DataContract]
public class GetItemsParams
{
    [DataMember] public int? offset { get; set; }
    [DataMember] public int? count { get; set; }
}
4

2 に答える 2

0

制約を追加したいようです。制約はここに文書化されており、パスに有効な入力があることを確認するために使用されます。制約に違反している場合は、コントローラー/アクションが一致しないため、呼び出されないかのようになります。制約は、以下の例のように RegEx にすることも、クラスを実装してカスタマイズすることもできます。IRouteConstraint

例えば:

context.MapHttpRoute(
    name: "ItemList",
    routeTemplate: "api/v1/projects/{projectId}/items",
    defaults: new
        {
            area = AreaName,
            controller = "Items",
            action = "GetItems",
            offset = RouteParameter.Optional,
            count = RouteParameter.Optional,
        },
     constraints: new
        {
            offset = @"\d+",
            count = @"\d+"
        }
);
于 2013-04-25T20:08:16.893 に答える
0

メソッドまたはコントローラーにモデル検証を追加するだけで、必要なものが自動的に取得されます。

[ValidateModel]
public IEnumerable<Item> GetItems([FromUri]GetItemsParams getItemsParams)
{
    // logic
}

で呼び出されたとき

http://localhost/api/v1/projects/1/items?count=a

次のメッセージでエラーが表示されます。

{"Message":"The request is invalid.","ModelState":{"getItemsParams.offset":["The value 'a' is not valid for offset."]}}

モデルの検証に関する完全なストーリーをお読みください。

于 2015-12-17T20:45:54.973 に答える