【问题标题】:How do I create my own webapi action and call it using jquery?如何创建自己的 webapi 操作并使用 jquery 调用它?
【发布时间】:2013-01-04 14:32:25
【问题描述】:

我正在学习 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属性

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

tks!

【问题讨论】:

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


    【解决方案1】:

    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}"
            );
    

    进一步阅读:

    【讨论】:

    • 工作了,非常感谢,我永远不会发现这个“技巧” :) 如果它是一个获取请求,我在使用 url 调用时如何使用它?
    • 因此,如果您想要一个具有复杂类型参数的 GET 操作,您需要使用 [FromUri] 属性:[System.Web.Http.HttpGet] public string MarkAsSeen([FromUri]MarkAsSeenRequest request) { } 然后您可以使用 url 调用此操作:例如/api/tutorial/MarkAsSeen?objectID=1&profileID=2
    猜你喜欢
    • 2011-06-22
    • 2012-11-14
    • 2020-02-17
    • 2018-03-11
    • 2021-11-17
    • 1970-01-01
    • 1970-01-01
    • 2014-10-23
    • 1970-01-01
    相关资源
    最近更新 更多