.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 )

ASP.NET Web API 的 Castle Windsor ApiController Factory 实现

将 JSON 发布到 apicontroller

ApiController的执行顺序