自定义API路由不暴露POST方法

时间:2013-12-30 20:47:48

标签: c# ajax asp.net-mvc post

我想通过AJAX向我的API提交表单帖子。我已经按如下方式设置了我的WebApiConfig.cs类以启用多个GET:

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

config.Routes.MapHttpRoute(
    name: "ApiById",
     routeTemplate: "api/{controller}/{id}",
     defaults: new { id = RouteParameter.Optional },
     constraints: new { id = @"^[0-9]+$" }
);
config.Routes.MapHttpRoute(
    name: "ApiByName",
    routeTemplate: "api/{controller}/{action}/{name}",
    defaults: null,
    constraints: new { name = @"^[a-z]+$" }
);

config.Routes.MapHttpRoute(
    name: "ApiByAction",
    routeTemplate: "api/{controller}/{action}",
    defaults: new { action = "Get" }
);

以下是控制器操作:

[HttpPost]
[ActionName("ChangeStuff")]
public string ChangeStuff(int val1, int val2, int val3)
{
    //Code
}

这就是我提出请求的地方:

var url = window.location.protocol + "//" + window.location.host + "/api" + "@Url.Action("ChangeStuff", "ApiControllerName")";
        $.ajax({
            url: url,
            type: "POST", //Works with GET
            data: { val1: val1, val2: val2, val3: val3 },
            contentType: "application/json:; charset=utf-8",
            dataType: "json",
            success: function (msg) {
            },
            failure: function (msg) {
            }
        });

但是,我在发帖时收到此错误:

POST http://localhost:50627/api/ApiControllerName/ChangeStuff 404 (Not Found) 

我认为这是因为我的API路由默认为GET请求然后无法接受POST类型(即使它在AJAX调用中显式化)的问题。它在制作GET请求时工作得很好。

编辑: 以下尝试都没有奏效:

data: JSON.stringify( { currentobject } )
data: { data: { currentobject } }

是否确保问题不在于修改的API路由?

1 个答案:

答案 0 :(得分:2)

尝试使用您要传递的值定义对象,然后告诉您的API Post操作期望该对象而不是单个值的列表。

public class ApiPostModel
{
    public int Val1 { get; set; }
    public int Val2 { get; set; }
    public int Val3 { get; set; }
}

然后在你的控制器中:

[HttpPost]
[ActionName("ChangeStuff")]
public string ChangeStuff(ApiPostModel model)
{
    //Code
}

只要您在data{}区块中传递的密钥的名称与属性名称相匹配,您就应该这样做。

或者将值作为查询字符串传递给控制器​​。

相关问题