2015-05-19 5 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 совместимого с имеют mutliple появление параметра строки запроса –

ответ

3

параметр Web API не может преобразовать несколько параметров из строки запроса в массив, так что у вас есть два варианта:

  • настроить parameter binding
  • вручную доступ и преобразование параметров строки запроса

Второй вариант включает в себя получение пар слов-значений строки запроса и их парсинг. Для того, чтобы получить пары значений имени, используйте:

Request.GetQueryNameValuePairs() 

Чтобы извлечь значения INT, вы можете сделать что-то вроде этого:

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)); 
} 
Смежные вопросы