【问题标题】:AJAX call to async Task<string> successfully hit the method but returns failedAJAX 调用异步 Task<string> 成功命中方法但返回失败
【发布时间】:2015-02-05 11:00:02
【问题描述】:

我有一个 MVC 控制器(不是 api 控制器)[HttpPost] 方法 public async Task&lt;string&gt; PostDocument() 我正在从客户端进行 ajax 调用。该方法正在对[HttpPost] 方法PostDocument(DocRepoViewModel docRepo) 进行另一个API 调用。以下是我的代码:

public async Task<string> PostAdminUploadData()
{
    HttpResponseMessage response = null;
    //set the parameter docRepo (a complex object)
    try {
        using (var client = new HttpClient())
        {
            string uri = documentRepositoryApiUrl + Constants.PostDoc;
            client.BaseAddress = new Uri(documentRepositoryApiUrl);
            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            response = await client.PostAsJsonAsync(Constants.PostDoc, docRepo); //docRepo parameter for API method
        }
    }
    catch (Exception ex){}

    return (await response.Content.ReadAsAsync<string>());
}

现在在上面的代码response = await client.PostAsJsonAsync(Constants.PostDoc, docRepo); 代码片段返回success 响应变量(因为它做我所期望的)但是当上面的方法响应时,响应总是在我的ajax 下面的ajax 中被error: 捕获:

$.ajax({
    url: url,
    type: 'Post',
    data: data,
    cache: false,
    dataType: 'json',
    async: true,
    contentType: false,
    processData: false,
    success: function (data) {
        alert("pass");
    },
    error: function (data) {
        alert("field"); //always failed
    }
});

在 c# 的任何地方都没有抛出异常。请帮我解决问题

【问题讨论】:

  • 检查控制台是否有错误,并更改error 处理程序以接受传递给它的参数,从而为您提供有关错误的具体详细信息。

标签: c# jquery ajax async-await


【解决方案1】:

我遇到了类似的问题。首先,更改您的 ajax 请求,以便删除 dataType 并指定 contentType:

// dataType: "json",
contentType: "application/json",

然后,尝试将操作的返回类型更改为Task&lt;ActionResult&gt;,并使用Controller上的常用方法之一,例如:

return Json(/* valid json string content */) 

return Content(/* read content as a string here */)

这样做的原因是 WebApi 控制器获得了一个序列化层,以将结果转换为客户端请求的格式。相反,MVC 控制器应该调用一个方法,该方法将某种动作结果(通常是视图或类似的东西)返回给视图引擎......

当我尝试返回特定模型时,我在 JavaScript 端收到的只是该对象类型的完全限定名称。

另一种选择可能是使用 [AcceptAjax] 属性或类似的属性来装饰您的操作,我相信这允许该操作回复 ajax 请求。

【讨论】:

  • 啊,谢谢你,我误解(假设)dataType 指的是我传递给控制器方法的数据,但它声明了期望返回的内容类型。
猜你喜欢
  • 2016-10-28
  • 1970-01-01
  • 1970-01-01
  • 2014-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-17
  • 1970-01-01
相关资源
最近更新 更多