Javascript 在添加ApicController属性之前,ASP.NET Core 3.1无法处理Axios请求

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的数据比示例中实际给出的要多 我已经尝试使用[

我有以下问题。每当我向Api端点发送某些内容时,ASP.NET Core 3.1都无法处理该请求。但是,当我添加
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);      
});