2014-02-27 63 views
1

我有一個Web API應用程序,預計會返回患者臨牀警報列表。該請求通過以下URL調用:Web API查詢字符串不傳遞第二個參數到控制器/操作

http://myserver:18030/api/Alerts/search?systemId=182&patientId=T000282L 

其中systemId確定patientID值與其相關的臨牀信息系統。路由被設置爲在WebApiConfig.cs

public static void Register(HttpConfiguration config) 
    { 
     config.Routes.MapHttpRoute(
      name: "Alertsapi", 
      routeTemplate: "api/Alerts/search", 
      defaults: new { controller = "Alerts" , action = "search"} 
     ); 

並且所述控制器操作如下如下:

[ActionName("search")] 
    public List<Alert> GetAlerts(string systemId = "", string patientId = "") 
    { 
     var alerts = from a in db.Alerts 
        where a.alertAuthorReference.Equals(systemId) 
        where a.alertSubjectReference.Equals(patientId) 
        select a; 
     return alerts.ToList(); 
    } 

我的印象是,查詢字符串參數,其中,自動映射到動作方法的參數,但在這個例子中,patientId總是空(或者是一個空字符串,因爲我默認提供這個空字符串)。我已經嘗試讀取操作方法內的代碼中的QueryString,但它只有一個具有密鑰systemId的成員。

爲什麼不通過第二個參數?

我可以通過使用patientId = 182:T000282L的QueryString解析這個組合鍵,但我希望最終能夠搜索多個參數,因此可能需要訪問第三個甚至第四個來自查詢字符串的值。

+0

如果從'GetAlerts()'參數刪除您的默認值,會發生什麼? –

+0

如果我這樣做的參數爲null –

+0

這兩個參數,或只是'patientId'? –

回答

0

您需要定義像

routes.MapHttpRoute(
      name: "GetPagedData", 
      routeTemplate: "api/{controller}/{action}/{pageSize}/{pageNumber}" 
     ) 

該路由控制器會像

[HttpGet] 
("GetPagedResult")] 
HttpResponseMessage GetPagedResult(int StartIndex, int PageSize) 
{ 
     // you can set default values for these parameters like StartIndex = 0 etc. 
} 
+1

這需要一個URL,例如'http:// myserver:18030/api/Alerts/search/182/T000282L'才能使用我的原始示例。我想要靈活地搜索多個參數。例如,我可能想要搜索姓名和出生日期,例如'?姓氏= Jones&forename = Fred&dob = 19450401',我不想爲每個搜索參數組合配置單個路線。 –

+0

爲什麼你不使用自定義對象,比如創建一個帶有10個參數的類SearchFilter,這個參數應該是默認的null,並且你的函數只是接收那個對象並且檢查給定的參數並且從jquery填充那個對象並且作爲數據檢查通過這個鏈接http://techbrij.com/pass-parameters-aspdotnet-webapi-jquery也檢查這個http://habrahabr.ru/post/164945/ – dnxit

0

您可以輕鬆地得到你現在需要使用Web API 2什麼和屬性的路由。

看看這篇文章:

http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2

首先,您需要編輯WebApiConfig.cs

public static void Register(HttpConfiguration config) 
    { 
     // Web API configuration and services 

     // Web API routes 
     config.MapHttpAttributeRoutes(); 

[...]

你的情況

你可以測試它在控制器內部的工作情況:

[Route("search")] 
    [HttpGet] 
    public string search(string systemId = "", string patientId = "") 
    { 

     return patientId; 
    } 

,並把它稱爲:

http://myserver:18030/search?systemId=182&patientId=T000282L 
相關問題