繁体   English   中英

ASP.NET 核心 MVC+Razor POST controller 返回“错误请求”

[英]ASP.NET core MVC+Razor POST controller returning "bad request"

我正在为 ASP.NET Core MVC + Razor 应用程序创建一个简单的 POST API,它目前除了返回视图外没有做太多事情:

public class CartController : Controller
{
    public IActionResult Add()
    {
        return this.View();
    }

    [HttpPost("Add"), ActionName("Add")]
    public IActionResult PostAdd() 
    {
        return this.View();
    }
}

它在Startup.cs中是这样注册的:

public void ConfigureServices(IServiceCollection services)
{
    services.AddRazorPages();
    services.AddControllers();
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    //...
    app.UseRouting();
    app.UseEndpoints(builder => {
            builder.MapRazorPages();
            builder.MapControllers();
    });
}

尝试 GET /Cart/Add 时,一切正常,并返回 Add.cshtml 视图。 但是,POST 请求失败,返回“400 Bad request”HTTP 状态码:

$.ajax( {
  method:"GET",
    success: console.log,
    url: "/Cart/Add"}) // works, HTML is logged to the console

$.ajax( {
  method:"POST",
    success: console.log,
    url: "/Cart/Add"})  //Fails: XHR POST http://localhost:5265/Cart/Add [HTTP/1.1 400 Bad Request 0ms]

我在这里遗漏了什么明显的东西吗? 我相信这可能是一个配置问题,但是我在 stackoverflow 和其他地方都找不到任何答案(在关于这个主题的几乎所有其他问题中,问题是由传递给 controller 或其他属性的参数引起的,这几乎不可能是因为这里,就像这个

简单的解决方案:

使用以下属性装饰您的操作 PostAdd:

   [Route("Cart/Add")] 

原因:您在配置方法中使用MapControllers进行路由。 MapControllers不对路由做出任何假设,而是依赖于用户进行属性路由。

另一种方法:

在您当前的代码中,您可以考虑以下更改:

  • 第二个属性ActionName是多余的。
  • 您需要在 controller 的顶部添加[Route("[controller]")]属性。

下面的例子来自 MSDN。

[Route("Store")]
[Route("[controller]")]
public class ProductsController : Controller
{
    [HttpPost("Buy")]       // Matches 'Products/Buy' and 'Store/Buy'
    [HttpPost("Checkout")]  // Matches 'Products/Checkout' and 'Store/Checkout'
    public IActionResult Buy()
    {
        return ControllerContext.MyDisplayRouteInfo();
    }
}

注意:在这种情况下,您可能需要将路由属性添加到所有操作方法。

由于您将[HttpPost("Add"), ActionName("Add")]到 PostAdd 操作,操作的路径将是/Add ,请尝试更改您的 ajax ,例如:

$.ajax( {
  method:"POST",
    success: console.log,
    url: "/Add"})

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM