我的ProductsController只有一个View - Index.cshtml。
此控制器内有以下3种操作方法:
//http://localhost:55555/products
[HttpGet]
public IActionResult Index()
{
}
//http://localhost:55555/products
[HttpPost]
public IActionResult Index(ProductViewModel product)
{
}
//http://localhost:55555/products/1
[HttpDelete("{id}")]
public IActionResult Index([FromRoute] int id)
{
}
当我去/产品时,工作完全正常。当我使用/ products创建新产品时,Post非常好用。删除根本不起作用,我找不到/ products / 9找不到404。我正在使用标准的AJAX请求w / type:DELETE。
我正在使用默认的MVC传统路由设置:
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
以下是我的AJAX请求:
$(".js-delete-product").click(function () {
$.ajax({
type: "DELETE",
url: "products/" + $(this).data("id"),
success: onDeleteSuccess
});
});
我还尝试在邮递员中向http://localhost:55555/products/1发送DELETE请求,以确保它不是我的jquery ajax并且仍然找不到404。
更新 如果我向http://localhost:55555/products发送一个DELETE请求,它会进入该函数,但正如您所期望的那样,id param设置为null。知道为什么会这样吗?如果传递参数,我只希望它进入删除方法,但是当传递参数时它不会进入(404未找到)。
答案 0 :(得分:1)
对于路线,您可以将某些字段标记为可选字段,并为其他字段设置默认字段
routes.MapRoute(
name: "default",
template: "{controller}/{action}/{id}",
defaults: new {controller = "Home", action = "Index", id = UrlParameter.Optional});
然后你可以做
[HttpDelete]
public IActionResult Index(int id)
{
}
答案 1 :(得分:0)
在id
属性中包含[HttpDelete]
的路由参数:
[HttpDelete("{id}")]
public IActionResult Index([FromRoute] int id)
{
}
答案 2 :(得分:0)
终于找到了答案,但只能通过反复试验。我不知道为什么它只能以这种方式运作。
//http://localhost:55555/products/1
[HttpDelete("products/{id}")]
public IActionResult Index([FromRoute] int id)
{
}
我不知道为什么我必须指定控制器名称,因为它应该基于此设置进行假设:
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
如果有人能够进一步解释为什么情况会很好。
答案 3 :(得分:0)
[HttpDelete("{Id}")]
public IActionResult Delete(int? Id)
{
if (Id == null)
{
return BadRequest();
}
Item itemToRemove = Repo.Find(Id);
if (itemToRemove == null)
{
return BadRequest();
}
Repo.Delete(itemToRemove );
return NoContent();
}
并像这样进行通话: / products / 5
答案 4 :(得分:0)
对我来说,问题与此有关: https://weblog.west-wind.com/posts/2015/Apr/09/ASPNET-MVC-HttpVerbsDeletePut-Routes-not-firing
对于无扩展名的URL,仅处理少数动词即可。解决方案是更新您的web.config以显式指定可接受的动词。
<configuration>
<system.webServer>
<handlers>
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*."
verb="GET,HEAD,POST,DEBUG,PUT,DELETE,OPTIONS"
type="System.Web.Handlers.TransferRequestHandler"
preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
</system.webServer>
</configuration>