2013-09-06 4 views
1

Я использую mvc4 webapi, я хочу знать, как сделать вызов ajax, который передает модель в качестве параметра метода Get. Я получаю модель null в методе Get.MVC Webapi метод получения метода в качестве параметра

//Controller 

public HttpResponseMessage GetUsersList(ProfileModel objProfileModel) 
{ 
} 

//Jquery Ajax 

function GetUsersList() 
{ 
$.ajax({ 
    type: 'POST', 
    url: '/api/SearchWebApi/GetUsersList', 
    data: $("#frmsearch").serialize(), 
    success: function (data) 
    { 


    }, 
    error: function (xhr, textStatus, errorThrown) 
    { 
     //window.location = JsErrorAction; 
    }, 
    dataType: "json" 
}); 
return false; 
} 

ответ

2

Хорошо, есть несколько проблем с тем, что вы делаете. Попробуйте эти изменения:

1) Изменить АЯКС вызов на GET, а не POST

$.ajax({type: 'GET', ... 

ИЛИ изменить имя действия для Post(ProfileModel objProfileModel), но я думаю, что прибудет в этом случае более RESTful, как вы выполняют поиск.

2) Не помещайте свое действие как часть своего URL-адреса. Соглашения web-api route используют http-глагол, чтобы определить, какое действие использовать. Таким образом, если вы контроллер называется SearchWebApi, Ваш URL будет просто так:

url: '/api/SearchWebApi/' 

Двигателя маршрутизации будет выяснить, что прибудет пойдут на методе/действие с get имени.

3) Наличие данных формы в теле должно быть в порядке. Но знайте, что вам может понадобиться явно сказать это, испачкать параметр:

GetUsersList([FromBody] ProfileModel objProfileModel) 

EDIT:

Для решения вашего вопроса о нескольких методах ПОЛУЧИТЬ, я думаю, есть несколько вариантов.

«Соглашение» в Web Api заключается в том, что у вас будет отдельный контроллер для каждого ресурса. Таким образом, у вас будет контроллер изображения и отдельный контроллер пользователей. Таким образом, конфликт и URL еще не имеют смысла:

GET /api/images/ 
GET /api/users/ 

У вас может быть несколько методов Get на контроллере, но они не могут конфликтовать. Таким образом, вы увидите много контроллеров для ресурса, у которого есть Get, который возвращает коллекцию, и get, который по id, чтобы получить конкретный ресурс.

общественного HttpResponseMessage Get()

общественного HttpResponseMessage Get (интермедиат идентификатор)

Но на самом деле, все это сводится к тому, как вы хотите, чтобы указать свой API, и как определить маршруты. по умолчанию апи маршрут это:

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

Обратите внимание, что это не указывает действие. Если вы хотите разрешить несколько попаданий на один и тот же контроллер, вы можете просто добавить сегмент {action} к URL-адресу, точно так же, как обычный Mvc.

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

Привет, Ваш ответ решил мою проблему, один вопрос заключается в том, что согласно пункту 2), как вы уже упоминали ... почему нет необходимости передавать имя метода в URL-адресе?например, если у меня есть 2 метода (a) GetUsersList, b) GetImages) в контроллере WebApi, с извлечением данных, а затем какой из них будет вызываться без передачи имени метода в URL-адресе – user2734405

+0

@ user2734405 Я добавил обновление к моему ответу на адрес ваш вопрос –

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