AJAX 调用异步任务<string> 成功命中该方法但 returns 失败
AJAX call to async Task<string> successfully hit the method but returns failed
我有一个 MVC 控制器(不是 api 控制器)[HttpPost]
方法 public async Task<string> 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);
代码片段 returns success
响应变量(因为它做了我预期的)但是当上面的方法响应时,响应总是被捕获在 error:
在 ajax 我的 ajax:
$.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#。请帮我解决问题
我运行陷入了类似的问题。首先,更改您的 ajax 请求,以便删除数据类型并指定内容类型:
// dataType: "json",
contentType: "application/json",
然后,尝试将动作的 return 类型更改为 Task<ActionResult>
,并使用 Controller 上的一种常用方法,例如:
return Json(/* valid json string content */)
或
return Content(/* read content as a string here */)
这样做的原因是 WebApi 控制器获得了一个序列化层,用于将结果转换为客户端请求的格式。相反,MVC 控制器应该调用一个方法,该方法 return 向视图引擎发送某种操作结果(通常是视图或类似的东西)...
虽然我试图 return 一个特定的模型,但我在 JavaScript 端收到的只是该对象类型的完全限定名称。
另一种选择可能是用 [AcceptAjax]
属性或类似的东西装饰你的动作,我相信这允许该动作回复 ajax 请求。
我有一个 MVC 控制器(不是 api 控制器)[HttpPost]
方法 public async Task<string> 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);
代码片段 returns success
响应变量(因为它做了我预期的)但是当上面的方法响应时,响应总是被捕获在 error:
在 ajax 我的 ajax:
$.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#。请帮我解决问题
我运行陷入了类似的问题。首先,更改您的 ajax 请求,以便删除数据类型并指定内容类型:
// dataType: "json",
contentType: "application/json",
然后,尝试将动作的 return 类型更改为 Task<ActionResult>
,并使用 Controller 上的一种常用方法,例如:
return Json(/* valid json string content */)
或
return Content(/* read content as a string here */)
这样做的原因是 WebApi 控制器获得了一个序列化层,用于将结果转换为客户端请求的格式。相反,MVC 控制器应该调用一个方法,该方法 return 向视图引擎发送某种操作结果(通常是视图或类似的东西)...
虽然我试图 return 一个特定的模型,但我在 JavaScript 端收到的只是该对象类型的完全限定名称。
另一种选择可能是用 [AcceptAjax]
属性或类似的东西装饰你的动作,我相信这允许该动作回复 ajax 请求。