1

我正在使用 mvc4 webapi,我想知道如何进行将模型作为参数传递给 Get 方法的 ajax 调用。我在 Get 方法上得到模型 null。

//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;
}
4

1 回答 1

2

好的,您正在做的事情有一些问题。尝试以下更改:

1) 将您的 ajax 调用更改为 aGET而不是 aPOST

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

将您的操作名称更改为,Post(ProfileModel objProfileModel)但我认为在这种情况下,当您进行搜索时,get 更加 RESTful。

2)不要将您的操作作为您的网址的一部分。web-api 路由约定使用 http 动词来确定要使用的操作。所以,如果你的控制器被调用SearchWebApi,你的 url 就是这样的:

url: '/api/SearchWebApi/'

路由引擎将确定 get 将转到get名称中的方法/操作。

3)将表单数据放在正文中应该没问题。但请注意,您可能需要通过标记参数来明确说明这一点:

GetUsersList([FromBody] ProfileModel objProfileModel)

编辑:

为了解决您关于多种 get 方法的问题,我想有几个选择。

Web Api 中的“约定”是每个资源都有一个单独的控制器。所以你会有一个图像控制器和一个单独的用户控制器。因此没有冲突和 url 仍然有意义:

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

一个控制器上可以有多个 Get 方法,但它们不能冲突。所以你会看到很多控制器的资源都有一个返回集合的 Get 和一个通过 id 获取特定资源的 get。

公共 HttpResponseMessage 获取()

公共 HttpResponseMessage 获取(int id)

但实际上,这一切都取决于您希望如何指定 API,以及如何定义路由。默认的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 }
        );
于 2013-09-07T01:38:48.227 回答