[英]Set default page in ASP.NET Core 3.1 MVC+Razor Pages+Web API
[英]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不对路由做出任何假设,而是依赖于用户进行属性路由。
另一种方法:
在您当前的代码中,您可以考虑以下更改:
下面的例子来自 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.