2012-08-31 44 views
0

我正在使用ASP.NET Web API(4 RTM)並希望創建一個方法來處理GET請求。把它看作GetCustomer()來處理我的GET請求。
現在,通過客戶Id獲取客戶非常簡單;我通過querystring中的客戶ID,我們已關閉並正在運行。假設我想讓這個選項傳遞兩個可能的參數之一;一個代表客戶的整數或縮寫。如何創建具有多個可能參數的GET

一個選項是有一個方法來處理整數和字符串的GET請求。然後,在該方法內部,我可以測試該值是否能夠被解析爲一個整數並相應地處理它。但這是處理這種情況的正確方法嗎?

如果我應該有兩個單獨的方法,我該怎麼做?

回答

0

個人而言,我只用一個切入點那種代碼:

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

好吧,也許不是最後一個例子,因爲可能有多個命中。

0

從您提及的使用(推測是唯一的)ID中,您可能需要一個單獨的操作方法。但是從你的一個意圖描述中,單個控制器的方法可能是要走的路 - 並注意你仍然不會有手動解析字符串,MVC模式,粘合劑可以爲你做的。

如果你有不同的方法,他們必須有不同的URL。它們可能會重載相同的方法名稱,但是它們仍然必須用ActionName屬性進行修飾才能爲它們分配不同的標識。 (請注意,您可以使用其他選擇器屬性來區分,如[HttpPost]或自定義屬性。)

請注意,您還可以使用MapRoute根據其參數有條件地調用不同的控制器方法(在Global.asax )期望參數。

處理所有相同類型的活動在一個地方的好處是,該代碼變得更清晰,更易於維護,並減少易產生缺陷的。如果你發現情況並非如此,那就分手吧。這是通常的不要重複你自己/單一的真相點/我要說的責任分離的東西。

一般來說我在MVC發現URL路徑(不含查詢字符串),在控制器方法,並意圖都打破沿着相同的路線。例如,這兩個網址遵循這條規則:

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

我們表示在URL意圖讓任何一個人或可能的多個匹配。

你說你可能傳遞的縮寫(這聽起來並不像它會是唯一的),爲兩個參數之一。如果每個可選參數都是獨立的,那麼一次只能爲多個參數提出問題可能沒有意義。如果你可能有a,b,或者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並且它不存在,那麼這可能是一個錯誤情況,如果某人按照不會產生結果的標準進行搜索,則可能不是錯誤情況。但儘管如此,你可以:

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 

祝你好運!