如何创建自己的web api操作并使用jquery调用它?

时间:2013-01-04 14:32:26

标签: asp.net-mvc asp.net-web-api

我正在学习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资源'http://local.dev.unation.com/api/tutorial/MarkAsSeen'.",MessageDetail":"在控制器'Tutorial'上找不到任何操作与请求匹配。

如果我将路径的模板更改为api / {controller} / {action} / {objectID} / {profileID},并使用jquery方法将此信息添加到url:/ api / tutorial / MarkAsSeen / + _obj + / + _pid 它有效。

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

  • 我想有一条通往所有行动的通用路线(因此它们的参数名称/数量无关紧要)
  • 这个网址附加只是丑陋,我想使用数据属性

你能告诉我我做错了吗?

TKS!

1 个答案:

答案 0 :(得分: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}"
        );

进一步阅读: