【问题标题】:MVC Webapi get method passing model as parameterMVC Webapi获取方法传递模型作为参数
【发布时间】:2013-09-08 06:41:45
【问题描述】:

我正在使用 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;
}

【问题讨论】:

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


    【解决方案1】:

    好的,您的操作存在一些问题。尝试以下更改:

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

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

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

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

    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 Get()

    公共 HttpResponseMessage 获取(int id)

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

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

    请注意,这并没有指定操作。如果你想在同一个控制器上允许多个获取,你可以在 url 中添加一个{action} 段,就像普通的 Mvc 一样。

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

    【讨论】:

    • 嗨,您的回答解决了我的问题,一个问题是,根据您提到的 2) 点...为什么不需要在 URL 中传递方法名称?例如,如果我在 WebApi 控制器中有 2 个方法(a)GetUsersList,b)GetImages),并获取数据,那么将调用哪个方法而不在 URL 中传递方法名称
    • @user2734405 我已在回答中添加了更新以解决您的问题
    猜你喜欢
    • 1970-01-01
    • 2014-03-03
    • 2020-01-15
    • 1970-01-01
    • 2018-12-27
    • 2014-07-04
    • 1970-01-01
    • 1970-01-01
    • 2015-12-26
    相关资源
    最近更新 更多