2015-05-19 22 views
1

考慮以下ApiController:多個參數同名

public class SomeController : ApiController 
{ 
    [HttpGet] 
    public class SomeFunction(int someVal = 0) { 
     ... 
    } 
} 

這按預期工作:

http://myserver/myApp/Some/SomeFunction?someVal=0 

,但我有這個功能,當它與

http://myserver/myApp/Some/SomeFunction?someVal=0&someVal=0 
稱之爲問題

現在我試着瞭解當時和當時發生了什麼。我沒有收到任何錯誤消息,但函數的輸出與預期不符。

+0

想知道,如果它是W3C兼容多次出現查詢字符串參數 –

回答

3

的Web API參數綁定不能幾個參數從查詢字符串轉換成一個數組,所以你有兩個選擇:

第二個選項包括獲取查詢字符串名稱 - 值對,並自己解析它們。要獲取名稱值對,用這個:

Request.GetQueryNameValuePairs() 

要提取整型值,你可以做這樣的事情:

var values= Request.GetQueryNameValuePairs() 
    .Where(kvp => kvp.Key == "someVal") 
    .Select(kvp => int.Parse(kvp.Value)) 
    .ToArray(); 

當然,你應該在解析控制誤差等。這是一個基本的示例代碼。

這是第一個選項模型綁定的實現:

public class IntsModelBinder : IModelBinder 
{ 
    public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext) 
    { 
     if (bindingContext.ModelType != typeof (Ints)) 
     { 
      return false; 
     } 
     var intValues = actionContext.Request.GetQueryNameValuePairs() 
      .Where(kvp => kvp.Key == bindingContext.ModelName) 
      .Select(kvp => int.Parse(kvp.Value)) 
      .ToList(); 
     bindingContext.Model = new Ints {Values = intValues}; 
     return true; 
    } 
} 

再次,這是一個基本的實現,在其他事物之間,沒有誤差的控制。

這是在一個動作中使用它的方法之一,但是,請閱讀參數綁定看到使用它的其他(更好)的方式鏈接:

// GET api/Test?keys=1&keys=7 
public string Get([ModelBinder(typeof(IntsModelBinder))]Ints keys) 
{ 
    return string.Format("Keys: {0}", string.Join(", ", keys.Values)); 
}