2

我正在学习 ASP.NET MVC4 Web API。我想创建一个接收两个参数的新方法

[HttpPost] 
public string MarkAsSeen(int objectID, long userID)

我想使用 jquery 来使用它:

$.ajax({
        type: "POST",
        url: "/api/tutorial/MarkAsSeen",
        data: JSON.stringify({ objectID: _obj, profileID: _pid }),
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function (result) {
            alert(_tutorial + ' seen');
        },async: true
});

我的路线是这样配置的

config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{action}"
            );

但它只是不起作用:

未找到与请求 URI 'http://local.dev.unation.com/api/tutorial/MarkAsSeen' 匹配的 HTTP 资源。","MessageDetail":"在控制器 'Tutorial' 上找不到与要求。

如果我将路由的模板更改为 api/{controller}/{action}/{objectID}/{profileID} 和 jquery 方法以在 url 上添加此信息:/api/tutorial/MarkAsSeen/ + _obj + / + _pid 它作品。

我不想执行这些更改,因为:

  • 我想为所有操作提供一条通用路线(因此它们的参数名称/数量无关紧要)
  • 这个 url 附加很丑,我想使用 data 属性

你能告诉我我做错了什么吗?

谢谢!

4

1 回答 1

3

Web.Api 真的不喜欢多个参数。最简单的解决方案是创建一个保存数据的新类型:

public class MarkAsSeenRequest
{
    public int objectID { get; set; }

    public int profileID { get; set; }
}

并在您的控制器操作中使用它:

[HttpPost] 
public string MarkAsSeen(MarkAsSeenRequest request)
{
    //...
}

它应该适用于您的原始路线:

config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{action}"
        );

进一步阅读:

于 2013-01-04T14:38:40.253 回答