MVC Web Api获取方法传递模型作为参数

时间:2013-09-06 21:55:49

标签: jquery asp.net-mvc-4 model asp.net-web-api

我正在使用mvc4 webapi,我想知道如何进行ajax调用,将模型作为参数传递给Get方法。我在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;
}

1 个答案:

答案 0 :(得分:2)

好的,你正在做的事情有一些问题。尝试这些更改:

1)将您的ajax调用更改为GET而不是POST

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

将您的操作名称更改为Post(ProfileModel objProfileModel),但我认为在您进行搜索时,此案例中的获取更为RESTful。

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

url: '/api/SearchWebApi/'

路由引擎会发现get将转到名称中带get的方法/操作。

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

GetUsersList([FromBody] ProfileModel objProfileModel)

修改

要解决有关多个get方法的问题,我想有几个选项。

Web Api中的“约定”是每个资源都有一个单独的控制器。因此,您将拥有一个Image控制器和一个单独的Users控制器。因此,没有冲突和网址仍然有意义:

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

您可以在控制器上拥有多个Get方法,但它们不会发生冲突。因此,您将看到许多控制器用于具有返回集合的Get的资源,以及用于获取特定资源的get的get。

public HttpResponseMessage Get()

public HttpResponseMessage Get(int id)

但实际上,这一切都取决于您希望如何指定API以及如何定义路线。 默认 api路由是:

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

请注意,这并未指定操作。如果您想在同一个控制器上允许多个获取,您只需在网址中添加{action}段,就像常规的Mvc一样。

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