Javascript 通过AJAX Web API存在参数时无法发布
我试图通过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
[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){
});