.NET (ApiController) / jQuery .ajax:从 POST 返回啥?
Posted
技术标签:
【中文标题】.NET (ApiController) / jQuery .ajax:从 POST 返回啥?【英文标题】:.NET (ApiController) / jQuery .ajax : what to return from POST?.NET (ApiController) / jQuery .ajax:从 POST 返回什么? 【发布时间】:2015-12-09 20:48:53 【问题描述】:在从 ApiController 派生的 Controller 内的 Post 方法中,我应该返回什么来指示 jQuery 成功?
我已经尝试过 HttpResponseMessage 但 jQuery 认为这是一个错误(即使 jQuery 错误处理程序的参数显然具有 200 状态)。
jQuery 看起来像这样:
processParticipantEvent: function(parID, evtType, evtNotes, successFunction, errorFunction)
debugger;
var requestURL = '/api/participantevent';
var json = "parId" : parID, "evtType": evtType, "evtNotes": evtNotes;
var jsonArray=JSON.stringify(json);
$.ajax(
type: "POST",
contentType: "application/json; charset=utf-8",
url: requestURL,
data: jsonArray ,
dataType: "json",
success: function (data) successFunction(data); ,
error: function (data) errorFunction(data);
);
,
我读过这篇文章:Ajax request returns 200 OK, but an error event is fired instead of success 这似乎涉及到同样的问题,但我怀疑它的数据不足,因为它对我不起作用?
为了清楚起见,我想要做的就是返回一个没有数据的普通旧 2xx。
【问题讨论】:
【参考方案1】:根据documentation:
“json”:将响应评估为 JSON 并返回 javascript 目的。跨域“json”请求被转换为“jsonp”,除非 该请求在其请求选项中包含 jsonp: false 。 JSON 数据被严格解析;任何格式错误的 JSON 都会被拒绝,并且 抛出解析错误。 从 jQuery 1.9 开始,空响应也是 被拒绝;服务器应该返回 null 或 的响应。
因此,如果您想使用 jQuery ajax,您必须返回一个有效的 json 字符串,只需在您的 API 控制器中使用以下内容:
return Ok(new );
注意这是一个 jQuery ajax “功能”,例如使用 Angular 来做一个 ajax 帖子我可以在我的控制器中使用 return Ok();
并且一切都按预期工作。
【讨论】:
感谢您的回复,非常感谢。我将@Luiz 的回复标记为正确,因为它为我提供了更多信息,但您的回复涵盖了类似的内容,感谢您的努力。【参考方案2】:正如@Beyers 所提到的,使用 OK() 返回即可。
我在这里创建了相同的结构并工作了。
我的控制器有这个:
[Route("api/participantevent")]
public IHttpActionResult Test()
return Ok("");
在客户端,我更改了您的功能只是为了简化:
processParticipantEvent= function()
debugger;
var requestURL = '/api/participantevent';
$.ajax(
type: "POST",
contentType: "application/json; charset=utf-8",
url: requestURL,
data: ['test': '1'] ,
dataType: "json",
success: function (data) alert('success'); ,
error: function (data) alert('error');
);
【讨论】:
谢谢 - 这个答案的好处是它给了我返回类型 (IHTTPActionResult) 以及使用它的机制。【参考方案3】:您的错误在于requestURL
。它的值是绝对的,http://api/participantevent
不存在。尝试使用相对值。
var requestURL = './api/participantevent';
【讨论】:
感谢您的回复,非常感谢。事实上,URL 确实可以解析,因为控制器中的代码实际上是响应 .ajax 调用而执行的——只是一旦完成,jquery 就会将我发送的响应(HTTPRresponseMessage)视为错误并触发错误处理程序。还是谢谢。【参考方案4】:如果你得到一个 OK 响应,它可能不是一个有效的 JSON。 我建议您检查浏览器中的 HTTP 响应,并尝试使用 responseText 运行 JSON.parse 函数,看看它是否失败。
【讨论】:
如果您需要 javascript 帮助,也可以在此处发布 responseText【参考方案5】:我通常会像下面这样声明一个类:
公共类 AjaxResult
private bool success = true;
private List<string> messages;
public bool Success get return success; set success = value;
public List<string> Messages get return messages;
public AjaxResult()
messages = new List<string>();
在控制器中,操作(向其发出 ajax 请求)应该将 JsonResult 作为返回类型。
[HttpPost]
public JsonResult Action(string id)
AjaxResult result = new AjaxResult();
//Set the properties of result here...
result.Success = true;
result.messages.Add("Success");
return Json(result);
3.您的 ajax 调用将如下所示:
$.ajax(
type: "POST",
dataType: 'json',
url: /ControllerName/Action,
data: id: "Test",
success: function (data) alert('success'); ,
error: function (data) alert('error');
);
【讨论】:
以上是关于.NET (ApiController) / jQuery .ajax:从 POST 返回啥?的主要内容,如果未能解决你的问题,请参考以下文章
EnableCors 使用 ApiController 但不使用 Controller .NET Framework 4.7.2
ASP .NET Core 更改默认 ApiController BadResponse
ASP.NET MVC 4 中 Controller 与 ApiController 做读取新增更新删除 ( CRUD )