12

Ниже приведено описание API-интерфейса ASP.NET MVC4 Web API v1. Он должен принимать 1 или 2 параметра строки запроса.Как заставить веб-API распознавать параметр querystring

Однако параметр ko всегда равен null, если вызван метод. Запрос ниже. Как исправить, чтобы параметр klient или namepart мог передаваться в строке запроса?

Web контроллер API v1:

namespace MyApp.Controllers 
{ 
    public class CustomersSearchViewModel 
    { 
     public string Klient { get; set; } 
     public string Namepart { get; set; } 
    } 


    [Authorize] 
    public class CustomersController : ApiController 
     { 

     public HttpResponseMessage Get(CustomersSearchViewModel ko) 
      { 
      // why ko is null ?   
      var res = GetCustomers(ko.Klient,ko.Namepart); 
      return Request.CreateResponse(HttpStatusCode.OK, 
        new { customers = res.ToArray() }); 
      } 

     } 
    } 

Контроллер вызывается по запросу (заявл работает от ПОР virtal каталога):

GET /erp/api/customers?namepart=kaks&_=1385320904347 HTTP/1.1 
Host: localhost:52216 
Connection: keep-alive 
Accept: application/json, text/javascript, */*; q=0.01 
X-Requested-With: XMLHttpRequest 
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.57 Safari/537.36 
Referer: http://localhost:52216/erp/Sale 
Accept-Encoding: gzip,deflate,sdch 
Accept-Language: et-EE,et;q=0.8,en-US;q=0.6,en;q=0.4 
Cookie: .myAuth=8B6B3CFFF3DF64EBEF3D258240D217C56603AF255C869FBB7934560D9F560659342DC4D1EAE6AB28454122A86C3CE6C598FB594E8DC84A; My_Session=5aw2bsjp4i4a5vxtekz 

маршрутизации по умолчанию используется:

config.Routes.MapHttpRoute(
     name: "DefaultApi", 
     routeTemplate: "api/{controller}/{id}", 
     defaults: new { id = RouteParameter.Optional } 
    ); 

Необходимо запустить приложение, чтобы запустить сервер Windows 2003, так что Web API v.2 не может использоваться.

Update

Я попытался также

public HttpResponseMessage Get(string klient, string namepart) 

, но в этом случае возвращается 404 ошибка, действие не обнаружено.

+0

Вы пробовали атрибут '[FromUri]' по параметру? –

ответ

19

Сложные типов извлекаются из тела запроса, но вы можете изменить это поведение по умолчанию, как это:

public HttpResponseMessage Get([FromUri]CustomersSearchViewModel ko) 

Вашего QueryString должен содержать параметры, названные как ваши свойства модели, в противном случае привязки не будет работать ,

1

Другой вариант - реализовать поставщика настраиваемого типа. Это позволяет контролировать представление в строке запроса и означает, что вам не нужно добавлять атрибут [FromUri] к вашим методам действий. Это имеет смысл, если у вас широко распространено повторное использование сложного типа параметра или требуется пользовательское представление.

Хороший пример из этого приведен в this blog post, где местоположение с широтой и долготой реализовано с использованием обоих методов.

Смежные вопросы