Routing not working when sending a DELETE request to an HttpDelete action
Solution 1
Include the route parameter for id
on the [HttpDelete]
attribute:
[HttpDelete("{id}")]
public IActionResult Index([FromRoute] int id)
{
}
Solution 2
for route you can mark certain fields as optional and set the default for others
routes.MapRoute(
name: "default",
template: "{controller}/{action}/{id}",
defaults: new {controller = "Home", action = "Index", id = UrlParameter.Optional});
then you can just do
[HttpDelete]
public IActionResult Index(int id)
{
}
Solution 3
For me the issue was related to this: https://weblog.west-wind.com/posts/2015/Apr/09/ASPNET-MVC-HttpVerbsDeletePut-Routes-not-firing
Out of the box only a few verbs are handled for extension-less URLs. The solution is to update your web.config to explicitly specify the accepted verbs.
<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>
Solution 4
Finally found the answer to this, but only from trial and error. I have no idea why it only works this way.
//http://localhost:55555/products/1
[HttpDelete("products/{id}")]
public IActionResult Index([FromRoute] int id)
{
}
I have no idea why I should have to specify the controller name as it should already be assumed based off of this setting:
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
If someone can further explain why this is the case that would be great.
Related videos on Youtube
Blake Rivell
I am a .NET developer who builds custom web applications for businesses. I have a very strong passion for what I do. My hobbies are video games and fitness.
Updated on June 04, 2022Comments
-
Blake Rivell almost 2 years
I have a ProductsController with only one View - Index.cshtml.
The following 3 action methods are inside of this controller:
//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) { }
Get works perfectly fine when I go to /products. Post works perfectly fine when I create a new product using /products. Delete does not work at all, I am getting a 404 not found for /products/9. I am using a standard AJAX request w/ type: DELETE.
I am using the default MVC conventional routing settings:
routes.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}");
Here is what my AJAX Request looks like:
$(".js-delete-product").click(function () { $.ajax({ type: "DELETE", url: "products/" + $(this).data("id"), success: onDeleteSuccess }); });
I also tried sending a DELETE request in postman to http://localhost:55555/products/1 to make sure it wasn't my jquery ajax and still 404 not found.
UPDATE: If I send a DELETE request to just http://localhost:55555/products it goes into the function, but as you would expect the id param is set to null. Any idea why this is happening? I only want it to go into the delete method if a param is passed, but when a param is passed it doesn't go in (404 not found).
-
Blake Rivell over 7 yearsI really thought this was going to work, but it does not.
-
rabelloo over 7 yearsApparently the template is not parsed the way you expected, therefore you are not able to set defaults and optional parameters within it. You must set it up like @Steve suggested. Here's MS documentation: msdn.microsoft.com/en-us/library/cc668201.aspx
-
Igor Mironenko about 5 years
[HttpDelete]
doesn't take any arguments (as of the latest MVC I'm using) so this doesn't compile