如何使用JavaScript从.NET Core 3.1正确调用HttpPost方法,避免出现400错误

问题描述

.NET Core 3.1中的实验

我显然在Core中缺少HttpPost的KEY元素。我想将JSON传递给控制器​​,并从后面的代码中获取JSON所需的内容。运行此命令总是会提供400(错误请求),而永远不会使其成为函数,因此我被认为是基本的事情。我还尝试过使用jQuery POST方法$.post("/nodes",item,function () { alert("success");}),该方法返回415(不受支持的媒体类型)。

我尝试了来自body,fromheader,from request的几个动作参数。 FromBody似乎应该是一个。我添加了基于其他帖子的CORS只是为了消除。如果需要的话,纯html文件就是项目中的文件,而不是cshtml。除jQuery外,没有其他客户端框架。我不想特定于框架的答案(角度,moo,vue,react等)。看来,如果做得正确,我们应该能够在最基本的层面上做到这一点。使用香草javascript或jQuery的答案可以很好地帮助我。

前进:GET全部起作用。

// Client side JavaScript. 
var item = {
    id: "9f14a706-e750-4b76-8ba5-78d890bbdf0d"
};

$.ajax({
    type: "POST",accepts: "application/json",url: '/nodes',contentType: "application/json",data: JSON.stringify(item),error: function (jqXHR,textStatus,errorThrown) {
        console.error("Something went wrong!");
        console.error(textStatus);
        console.error(errorThrown);
    },success: function (result) {
        console.log('Testing');
    }
});


/// NodesController.cs 
namespace INM.Controllers
{
[Route("[controller]")]
[ApiController]

    public class NodesController : ControllerBase
    {
        [HttpPost]
        public void Post([FromBody] string value)
        {
             var foo = "bar";
        }

        [HttpPut("{id}")]
        public void Put(int id,[FromBody] string value)
        {
            var foo = "bar";
        }
    }
}


    ///StartUp.cs
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddRazorPages();
        services.AddCors();
        services.AddControllers();
    }

            public void Configure(IApplicationBuilder app,IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            DeveloperExceptionPageOptions developerExceptionPageOptions = new DeveloperExceptionPageOptions
            {
                SourceCodeLineCount = 10
            };

            app.UseCors(builder =>
            {
                builder.WithOrigins("http://localhost:61246/")
                       .AllowAnyMethod()
                       .AllowAnyHeader()
                       .AllowAnyOrigin();
                //.AllowCredentials()
            });


            app.UseDeveloperExceptionPage(developerExceptionPageOptions);
        }

        FileServerOptions fileServerOptions = new FileServerOptions();
        fileServerOptions.DefaultFilesOptions.DefaultFileNames.Clear();
        fileServerOptions.DefaultFilesOptions.DefaultFileNames.Add("INM.html");

        app.UseFileServer(fileServerOptions); // combines app.UseDefaultFiles(); & app.UseStaticFiles(); 

        app.UseRouting();

        app.UseAuthorization();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllers();
        });

        app.Run(async (context) => 
        {
            //throw new Exception("Some proc err");
            await context.Response.WriteAsync("Hello World from Startup.cs (Configure) ");
        });
    }

更新 对于潜伏者:更改控制器中的签名可以解决我的问题。我知道这是基本的疏忽。

[HttpPost]
public object Post([FromBody] object value)
{
    var foo = "bar";
    return value;
}

此外,在撰写本文时,我误以为$ .ajax调用中的 dataType 属性。这指的是返回值与请求中发送的数据有效负载之间的关系。

希望这对您也有帮助。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)