Javascript 在添加ApicController属性之前,ASP.NET Core 3.1无法处理Axios请求
我有以下问题。每当我向Api端点发送某些内容时,ASP.NET Core 3.1都无法处理该请求。但是,当我添加Javascript 在添加ApicController属性之前,ASP.NET Core 3.1无法处理Axios请求,javascript,ajax,asp.net-core,axios,model-binding,Javascript,Ajax,Asp.net Core,Axios,Model Binding,我有以下问题。每当我向Api端点发送某些内容时,ASP.NET Core 3.1都无法处理该请求。但是,当我添加ApiController属性时,它工作得非常好 我的代码是正确的,但仅在添加此属性时有效。怎么会这样 作为参考,这里是我的代码 原料药 JS 仅供参考,我在ApicController上使用GET/POST还有其他方法。GET方法可以很好地工作,但是POST方法只有在使用查询参数时才能工作。在本例中,我没有使用查询参数,因为要发送到Api的数据比示例中实际给出的要多 我已经尝试使用[
ApiController
属性时,它工作得非常好
我的代码是正确的,但仅在添加此属性时有效。怎么会这样
作为参考,这里是我的代码
原料药
JS
仅供参考,我在ApicController上使用GET/POST还有其他方法。GET方法可以很好地工作,但是POST方法只有在使用查询参数时才能工作。在本例中,我没有使用查询参数,因为要发送到Api的数据比示例中实际给出的要多
我已经尝试使用
[FromBody]
获取我的响应。它不起作用。我得到了空值foo
甚至没有实例化。对于将请求主体绑定到模型,有两种类型,一种是从表单数据绑定,另一种是应用程序/json
对于Controller
,它将默认获取表单数据。对于ApiController
,它将默认获取json数据
如果您想在不使用[ApiController]
的情况下绑定请求正文,可以添加[FromBody]
:
//[ApiController]
[Route("api/SomeApi")]
public class ApiController : Controller
{
private readonly IService service;
public ApiController(IService service)
{
this.service = service;
}
[HttpPost]
[Route("Add")]
public SomeClass Add([FromBody]SomeClass foo)
{
//do your stuff...
}
}
型号:
public class SomeClass
{
public int Id { get; set; }
public string Name { get; set; }
}
视图:
@节脚本{
axios.post('/api/SomeApi/Add'{
id:1,
名称:“sdfsdf”
})
.然后(功能(响应){
控制台日志(响应);
})
.catch(函数(错误){
console.log(错误);
});
}
结果:
我遇到了同样的问题,并使用qs库对JSON对象进行字符串化来解决它
axios.post('/controller/action', Qs.stringify({Id: 1, Name: 'Test'}))
.then(function (response) {
console.log(response);
})
.catch(function (response) {
console.log(response);
});
另一种适用于普通对象的方法是使用URLSearchParams
var requestData = {Id: 1, Name: 'Test'}
var params = new URLSearchParams();
for(key in requestData)
params.append(key, requestData[key]);
axios.post('/controller/action', params)
.then(function (response) {
console.log(response);
})
.catch(function (response) {
console.log(response);
});
它只有在有Api控制器时才起作用,因为这告诉程序它是一个Api控制器(而不是其他类),并且像@George一样,即使没有添加ApiController
attribute,它也能工作。你说它过去工作是什么意思?我提到的属性所做的各种事情是添加@George。我的意思是,您不必为了能够调用端点而添加属性。您仍然能够跳转到该方法中,但遇到了一个异常。具体地说,对象引用未设置为对象的实例
您仍然获得了SomeClass的实例
,但所有值均为空/空。我已经尝试过此操作,但没有成功。我的foo
对象为空。它没有实例化。我可以成功地获取数据。你能分享一下如何在js中定义foo
吗?@Vins这是因为你正在发送带有属性foo
的对象,而foo
是对象,将你的axios post更改为axios.post('/api/SomeApi/Add',{this.foo})
而且它应该work@Rena嗯,很有趣。它现在似乎起作用了。我昨天遇到的问题已经过去了。我无法解释怎么做。在我发布这个问题之前,我尝试了与您提供的相同的示例,但由于某些原因,它不起作用。我真的很困惑,但无论如何,谢谢:)嗨@Vins,如果我的答案对你有帮助,你能接受我的答案吗?参考:
@section Scripts{
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
<script>
axios.post('/api/SomeApi/Add', {
id: 1,
name: 'sdfsdf'
})
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);
});
</script>
}
axios.post('/controller/action', Qs.stringify({Id: 1, Name: 'Test'}))
.then(function (response) {
console.log(response);
})
.catch(function (response) {
console.log(response);
});
var requestData = {Id: 1, Name: 'Test'}
var params = new URLSearchParams();
for(key in requestData)
params.append(key, requestData[key]);
axios.post('/controller/action', params)
.then(function (response) {
console.log(response);
})
.catch(function (response) {
console.log(response);
});