2013-08-07 9 views
5

から複合型への結合は、このような形式である必要があります:ASP.net WEBAPIパラメータ私は、.NET 4.5</p> <p>URLのASP.net WEBAPIを使用してRESTのWebサービスを作成したいURI

/values?Age=55&Height=176&Race=1&Weight=80&Gender=male&id=800001 

人口は基本的に特定のプロパティを持つだけDTOあるカスタムオブジェクトである

[HttpGet] 
public string Get(int id, [FromUri]Demographics demographics) 
{ // etc.} 

:関連するコントローラは、次のようになります。 しかし、それはカスタム列挙型のタイプがあるつのプロパティが含まれます。

enum Gender 
{ 
Female = 0, 
Male 
} 

URLは、上記の形式であれば、デフォルトのマッピングが正常に動作しますが。 しかしもちろん、URLで提供されるパラメータが正しいかどうかを確認する必要もあります。

ASP.net WebApi(afaik)per defaultは、想定されている型に基づいて(またはその型に変換可能な場合)各パラメータをマップしようとします。 URI内で一致する値が見つからない場合は、それはただ0とみなされます。

ここで、0は定義上、Gender Demographics.Genderの有効な値であるという非常に不幸な状況になります〜Gender.Female)。

もっとも簡単な解決策は、0が「確認できない」状態になるように列挙を変更することです。しかし、私はenumを変更することはできません。 私はDemographicsオブジェクトのために私自身のオーバーロードを作成することができましたが、むしろこれをやりません。なぜなら、より良い方法が必要だと思うからです。

genderパラメータをURI内のパラメータに明示的にバインドし、送信されなかった場合は例外をスローすることはできますか?

私はタイプコンバータについて読んだことがありますが、私はURI文字列を処理しなければならないと思います.WebApiが明らかに既に持っている多くの機能を実装する必要があると思います。

URIで作業する必要があり、リクエストボディを使用できないことに注意してください。

答えて

4

このようにenumをnullにすることはどうですか?

public class Demographics 
{ 
    public Gender? Gender { get; set; } 
} 

demographics.Genderがnullであるかどうかを確認することができます。

1

WebAPIには、data annotationsによる検証フレームワークが含まれています。 (強制的に他の方法について読み、

public class Demographics 
{ 
    [Required] 
    public Gender Gender { get; set; } 
} 

そして、コントローラまたは検証を強制的に[ValidateModel]属性を持つコントローラメソッドをマーク:これは、人口統計におけるジェンダー・プロパティは、[必須]のような物体マークすることができますこれ、例えばグローバル:model validation):

{"Message":"The request is invalid.","ModelState":{"Gender":["The Gender field is required."]}} 

無効な値が処理されます:あなたは、パラメータを提供するために欠場する場合は、この後

[HttpGet] 
[ValidateModel] 
public string Get(int id, [FromUri]Demographics demographics) 
{ // etc.} 

、あなたは自動検証とメッセージとエラー400不正な要求を取得します必要な属性がなくてもデフォルトで正しく設定されているため、性別に提供されるFooの誤った値は400 Bad Requestメッセージでも返されます。

{"Message":"The request is invalid.","ModelState":{"Gender":["The value 'Foo' is not valid for Gender."]}} 
関連する問題