我正在為 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 和其他地方都找不到任何答案(在關于這個主題的幾乎所有其他問題中,問題是由傳遞給控制器??的引數或其他屬性引起的,這幾乎不可能是因為在這里,就像這個)
uj5u.com熱心網友回復:
簡單的解決方案:
使用以下屬性裝飾您的操作 PostAdd:
[Route("Cart/Add")]
原因:您在配置方法中使用MapControllers進行路由。MapControllers不對路由做任何假設,而是依賴于用戶進行屬性路由。
另一種方法:
在您當前的代碼中,您可以考慮以下更改:
- 第二個屬性ActionName是多余的。
- 您需要在控制器頂部添加[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();
}
}
注意:在這種情況下,您可能需要將 route 屬性添加到所有操作方法。
uj5u.com熱心網友回復:
由于您添加[HttpPost("Add"), ActionName("Add")]到 PostAdd 操作,該操作的路線將是/Add,嘗試更改您的 ajax,如:
$.ajax( {
method:"POST",
success: console.log,
url: "/Add"})
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/511753.html
