Javascript 通过AJAX Web API存在参数时无法发布

Javascript 通过AJAX Web API存在参数时无法发布,javascript,ajax,asp.net-web-api2,Javascript,Ajax,Asp.net Web Api2,我试图通过Ajax发布到一个函数。当web api函数没有参数时,它可以工作 当我添加参数时,它失败了 我怀疑这个问题是由于路由问题,但我不知道怎么会是这样 我的职能是 [HttpPost] [Route("api/cms/{accountId:int}/{paneId}/{url}/{content}")] public IHttpActionResult Post(int accountId, string paneId, string url, string con

我试图通过Ajax发布到一个函数。当web api函数没有参数时,它可以工作

当我添加参数时,它失败了

我怀疑这个问题是由于路由问题,但我不知道怎么会是这样

我的职能是

    [HttpPost]
    [Route("api/cms/{accountId:int}/{paneId}/{url}/{content}")]
    public IHttpActionResult Post(int accountId, string paneId, string url, string content)
    {
        ....
    }
如果我将上述内容更新为

    [HttpPost]
    public IHttpActionResult Post()
    {
        ....
    }
然后它就工作了(它从AJAX帖子中点击了这个函数)

javascript是

function ajaxStart(type, url, data, successDelegate, failDelegate, errorDelegate) {
    $.ajax({
        type: type.toUpperCase(),
        url: url,
        contentType: "application/json;",
        data: data,
        dataType: "json",
        success: function (response) {
            successDelegate(response);
        },
        failure: function (e) {
            failDelegate(e.statusText);
        },
        error: function (e) {
            errorDelegate(e.statusText);   //always hit this, statusText is Not Found
        }
    })
}
相关变量在哪里

type = "POST", 
url = "http://localhost:53733/api/cms", 
data = "{"accountId":1,"paneId":"02","url":"/Playground/Index","content":"Left"}"
数据对象是使用JSON.Stringify创建的

同样的问题也发生在

    public IHttpActionResult Post([FromBody] int accountId, [FromBody]string paneId, [FromBody]string url, [FromBody]string content)

为什么它不接受?

当您定义
路由(“api/cms/{accountId:int}/{paneId}/{url}/{content}”)
时,Mvc确实希望路由具有
accountId
paneId
url
内容

因此,如果您想在route/url中发布这些变量,您需要以这种方式构建url,而不需要发布任何数据

否则,如果您想将请求正文中的
application/json
格式的数据发布回服务器,您的url/route应该是
route(“api/cms”)

错误的url将导致404

选项1:在请求正文中发布数据 选项2:在url中嵌入数据(不推荐!) 我的看法
当您定义
路由(“api/cms/{accountId:int}/{paneId}/{url}/{content}”)
时,Mvc确实希望路由具有
accountId
paneId
url
内容

因此,如果您想在route/url中发布这些变量,您需要以这种方式构建url,而不需要发布任何数据

否则,如果您想将请求正文中的
application/json
格式的数据发布回服务器,您的url/route应该是
route(“api/cms”)

错误的url将导致404

选项1:在请求正文中发布数据 选项2:在url中嵌入数据(不推荐!) 我的看法
查看“网络”选项卡,查看您试图发布的内容。你应该能从中看出什么是错的。
“url”:“/playerd/Index”
将是一个问题,除非您避开
/
。也就是说,因为您使用的是post,所以您还可以创建一个视图模型并在控制器中使用它。从长远来看,这是一个更好的策略。您的路由表示您正在通过URL对参数进行编码。但是您的ajax帖子是通过请求主体发送的。调整你的帖子url
/api/cms/1/02/url/left
,正如@nurdyguy所说,你需要转义参数的
url
部分。由于这是一篇文章,您可以将其中一些参数移动到
[FromBody]
,并将其中一个“url”重命名为“action”或“endpoint”以避免混淆。您是否尝试过postmaster的调用?查看“网络”选项卡,查看您试图发布的内容。你应该能从中看出什么是错的。
“url”:“/playerd/Index”
将是一个问题,除非您避开
/
。也就是说,因为您使用的是post,所以您还可以创建一个视图模型并在控制器中使用它。从长远来看,这是一个更好的策略。您的路由表示您正在通过URL对参数进行编码。但是您的ajax帖子是通过请求主体发送的。调整你的帖子url
/api/cms/1/02/url/left
,正如@nurdyguy所说,你需要转义参数的
url
部分。由于这是一篇文章,您可以将其中一些参数移动到
[FromBody]
,并将其中一个“url”重命名为“action”或“endpoint”,以避免混淆。您是否尝试过postmaster的调用?
[HttpPost]
[Route("api/cms")]
public IActionResult Post(int accountId, string paneId, string url, string content)
{
    ...
}

$.ajax({
    type: 'POST',
    url: 'http://localhost:53733/api/cms',
    data: data,
    ...
});
[HttpPost]
[Route("api/cms/{accountId: int}/{paneId}/{url}/{content}")]
public IActionResult Post(int accountId, string paneId, string url, string content)
{
    ...
}

$.ajax({
    type: 'POST',

    // Remember to encode the url parameter! yawk!
    url: 'http://localhost:53733/api/cms/1/2/%2FPlayground%2FIndex/left',

    // No need to post with data as they're already in the url
    // data: data,
    ...
});
// Sample code run on ASP.NET Core MVC 2.0

// Controller
[Route("api/[controller]")]
public class CMSController : Controller
{
    ...

    [HttpPost]
    public IActionResult(CreateCmsViewModel model)
    {
        // Do something

        // Return a 201 response with new location header
        return Created(...);
    }
}

// The view model
public class CreateCmsViewModel
{
    public int AccountId { get; set; }
    public string PaneId { get; set; }
    public string Url { get; set; }
    public string Content { get; set; }
}

// jQuery AJAX
    $.ajax({
    type: 'POST',
    url: 'http://localhost:53733/api/cms',
    data: {
        accountId: 1,
        paneId: "02",
        url: "/Playground/Index",
        content: "Left"
    },
    dataType: 'json',
    // No longer need this
    // contentType: 'application/json',

    ...
}).done(function(response){

});