向HttpDelete操作发送DELETE请求时路由不起作用

时间:2016-12-19 17:43:22

标签: c# asp.net-mvc asp.net-mvc-routing asp.net-core-mvc asp.net-mvc-controller

我的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未找到)。

5 个答案:

答案 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>