0

ASP.NET Web API (4 RTM) を使用しており、GET 要求を処理するメソッドを作成したいと考えています。GetCustomer()これを私の GET リクエストを処理するものと考えてください。
これで、顧客 ID による顧客の取得は非常に簡単になりました。で顧客 ID を渡すと、作業が開始されquerystringます。2 つの可能なパラメーターのいずれかを渡すオプションが必要だとします。顧客を表す整数または略語。

1 つのオプションは、整数と文字列の GET 要求を処理する単一のメソッドを持つことです。次に、メソッド内で、値を整数として解析できるかどうかをテストし、それに応じて処理できます。しかし、これはこの状況を処理する正しい方法ですか?

2 つの別々のメソッドが必要な場合、どうすればよいですか?

4

2 に答える 2

0

個人的には、その種のコードへのエントリ ポイントを 1 つだけ使用します。

http://example.com/lookupUser?id=18475
http://example.com/lookupUser?userCode=jjs
http://example.com/lookupUser?FullName=Jeremy%20J%20%Starcher

複数のヒットがある可能性があるため、最後の例ではないかもしれません。

于 2012-08-31T23:18:57.057 に答える
0

(おそらく一意の)IDを使用するというあなたの言及から、別のアクションメソッドが必要になる場合があります。しかし、単一のインテントの説明から、単一のコントローラーメソッドがおそらく進むべき道です-そして、文字列を手動で解析する必要がないことに注意してください.MVCモデルバインダーがそれを行うことができます.

別々のメソッドがある場合は、異なる URL を持つ必要があります。それらはオーバーロードされた同じメソッド名である可能性がありますが、異なる ID を割り当てるために ActionName 属性で修飾する必要があります。([HttpPost] やカスタム属性など、他のセレクター属性を使用して区別できることに注意してください。)

パラメータを期待する MapRoute (Global.asax 内) を使用して、パラメータに基づいて URL で異なるコントローラ メソッドを条件付きで呼び出すこともできます。

同じ種類のアクティビティをすべて 1 か所で処理することの利点は、コードがより明確になり、保守しやすくなり、欠陥が発生しにくくなることです。そうでない場合は、それらを分割します。これは、私が話しているいつものことを繰り返さないでください/真実の単一点/責任の分離です。

原則として、MVC では、URL パス (クエリ文字列なし)、コントローラー メソッド、およびインテントがすべて同じ行に分かれていることがわかります。たとえば、次の 2 つの URL はその規則に従います。

http://example.com/person/id/403
http://example.com/person/search?FirstName=Joe&LastName=Smith

URL で意図を表現して、1 人の人物または可能な複数の一致を取得します。

2 つのパラメーターの 1 つとして、省略形 (一意のようには聞こえません) を渡す可能性があるとおっしゃいました。オプションの各パラメータが個別に一意である場合、一度に複数の質問を作成することはおそらく意味がありません。a、b、または a AND b がある場合、実際にカスタム コントローラー ロジックの主力製品に入る前に、どのメソッドにリクエストを渡すかを判断するのは複雑になります。

また、LINQ などのテクノロジを使用すると、プロシージャルにクエリを動的に構成して、結果にいずれかまたは両方の制約を持たせることが非常に簡単になります。

[HttpGet]
public ViewResult Search(string FirstName, string LastName) {
     var people = AllPeopleInDatabase();
     if (!string.IsNullOrEmpty(FirstName)) people=people.Where(p => p.FirstName==FirstName);
     if (!string.IsNullOrEmpty(LastName)) people=people.Where(p => p.LastName==LastName);
     return View(people);
}

一意の ID をその組み合わせに入れることは、別の基準が一致する場合にのみ指定されたレコードを取得する必要があるという、プログラムによるシナリオ (パスワード検証のかなりユニークなケースを除いて) をすぐに考えることができないという理由だけで、私には意味がありません。 . したがって、誰かが ID を尋ねたときに ID が存在しない場合、それはおそらくエラー ケースであり、誰かが結果を生成しない条件で検索した場合、それはおそらくエラー ケースではありません。それでも、次のことができます。

public ViewResult Search(string FirstName, string LastName, int? id) {

編集: また、モデル バインダーはクラスのプロパティを処理することに注意してください。これは、複数のパラメーターをバインドする一般的な方法です。

public ViewResult Search(MyCriteriaViewModel criteria) {

edit2: RESTful サービス (WebAPI が理想的に適している) には、CRUD URL の標準的なプラクティスがあることにも注意してください。以下はhttp://www.asp.net/web-api/overview/creating-web-apis/creating-a-web-api-that-supports-crud-operationsからのものです。

Action                      HTTP method  Relative URI
Get a list of all products  GET          /api/products
Get a product by ID         GET          /api/products/id
Get a product by category   GET          /api/products?category=category
Create a new product        POST         /api/products
Update a product            PUT          /api/products/id
Delete a product            DELETE       /api/products/id

幸運を!

于 2012-09-01T00:11:19.163 に答える