2015-12-17 55 views
2

我對API和MVC比較陌生,我仍在學習。我只通過檢索(全部)數據,更新,添加和刪除,完成了Web API和客戶端MVC(GET,PUT,POST,DEL)的基礎知識。這是我的老師用來上課的主要指南。 http://www.asp.net/web-api/overview/data/using-web-api-with-entity-framework/part-1具有多個可選參數(客戶端和API)的搜索功能

我目前在短期休息,我正在探索自己。我遇到了一個特定的任務,通過10個左右的參數過濾器顯示項目列表,其中大部分都是可選字段。 字段:名稱,形狀,顏色,簽名,產品代碼等。 大多數字段都是可以爲空的,但選定的幾個字段爲空列表。

大多數指南和教程會給我一些參數的例子1,也許不過此任務需要不止於此。

這裏的問題是,我不知道如何從一個MVC客戶在通過API傳遞這麼多參數。我讀過很多其他的解決方案,它可以通過他們的URI

baseuri/action?a=&b=&c=1&d=example 

但我怎麼能忽略空字段永遠不會被填補,僅搜索中實際填充到數據庫中的呢?

baseuri/action?a=&b=&c=1&d=example 

//ignoring a and b 
var result = from b in db.table where (c==1 && d==example) 

我的老師暗示我,使我自己的控制器和功能,但我不太確定如何去做。

有一些解決方案,建議我使用[FromURI],但搜索功能太複雜,我也不太清楚如何使用[FromBody]工作,要麼。

任何幫助?

回答

3

要忽略空字段,你可以讓參數爲空的和過濾他們,只有當他們具有價值。例如:

public IQueryable<Row> Action(string a, bool? b, int? c, string d) 
{ 
    var result = db.table.Where(e => true); 
    if (a != null) 
     result = result.Where(e => e.a == a); 
    if (b.HasValue) 
     result = result.Where(e => e.b == b.Value); 
    if (c.HasValue) 
     result = result.Where(e => e.c == c.Value); 
    if (d != null) 
     result = result.Where(e => e.d == d); 
    return result; 
} 

至於10+參數的解決方案,我可以建議是這樣的:

public IQueryable<Row> Action() 
{ 
    var result = db.table.Where(e => true); 
    foreach(var parameter in HttpUtility.ParseQueryString(ActionContext.Request.RequestUri.Query).ToKeyValuePairs()) 
    { 
    switch(parameter.Key) 
    { 
     case "a": 
     result = result.Where(e => e.a == parameter.Value); 
     break; 
     case "b": 
     result = result.Where(e => e.b == parameter.Value); 
     break; 
     ... 
    } 

    } 
    return result; 
} 

或檢查查詢所需的參數並在其上過濾器底座的價值

+0

但不會效率超低,因爲我處理10+左右的參數?這個解決方案對於一些參數看起來很好,但對於10個以上的參數來說並不那麼重要。 – Kei

+0

它的話,你可以用'ActionContext.Request.RequestUri.Query.ParseQueryString()'(在'System.Web.HttpUtility'擴展方法)來獲取NameValueCollection中的查詢參數和過濾結果基礎上,這個值的循環 –

+0

內我已經在答案中添加了示例,請看看 –

相關問題