C# 自定义API路由未公开POST方法

C# 自定义API路由未公开POST方法,c#,ajax,asp.net-mvc,post,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( nam

我想通过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路由默认为获取请求,然后无法接受POST类型(即使它在AJAX调用中是显式的)。它在发出GET请求时工作正常

编辑: 以下两种尝试均无效:

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

是否可以确定问题不在于修改后的API路由?

尝试使用要传递的值定义对象,然后告诉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
}
只要在
数据{}
块中传递的键的名称与属性名称匹配,就可以继续使用


或者将值作为querystring传递给控制器。

控制器的名称是什么?我认为在Ajax调用中传递
JSON
的方式有问题。i、 e.here=>
数据:{val1:val1,val2:val2,val3:val3}
。我相信在正确构造
数据
字符串之后,您必须使用类似于
JSON.stringify(data)
的东西。请参见此处的示例:@Nix我不拥有我正在处理的代码,因此无法分发名称,但我可以通过复制粘贴验证名称是否相同(并且Visual Studio没有抱怨)。我会尝试整理数据,我一直以为你不必这么做,但我会试一试。编辑:我刚刚尝试使用Stringify,仍然没有骰子,但我将尝试将其包装在一个对象中,例如{data:(当前数据对象)}一个[FromBody]属性对参数有帮助吗?将[FromBody]添加到每个参数会导致500个错误,不确定这是正确的还是错误的,尽管lol。它没有达到我在控制器执行的第一行中设置的断点。