1

J'ai un ProductsController avec un seul View - Index.cshtml.Le routage ne fonctionne pas lors de l'envoi d'une requête DELETE à une action HttpDelete

Les 3 méthodes d'action suivantes sont à l'intérieur de ce contrôleur:

//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 fonctionne parfaitement bien quand je vais à/produits. Post fonctionne parfaitement bien lorsque je crée un nouveau produit en utilisant/products. Supprimer ne fonctionne pas du tout, je reçois un 404 introuvable pour/products/9. J'utilise une requête AJAX standard avec le type: DELETE.

J'utilise les paramètres de routage classiques par défaut MVC:

 routes.MapRoute(
      name: "default", 
      template: "{controller=Home}/{action=Index}/{id?}"); 

Voici ce que ma demande AJAX ressemble:

$(".js-delete-product").click(function() { 
    $.ajax({ 
     type: "DELETE", 
     url: "products/" + $(this).data("id"), 
     success: onDeleteSuccess 
    }); 
}); 

J'ai aussi essayé d'envoyer une demande de suppression dans postier à http://localhost:55555/products/1 pour m'assurer que ce n'était pas mon ajax jquery et encore 404 pas trouvé.

MISE À JOUR: Si j'envoie une demande SUPPRIMER juste http://localhost:55555/products il va dans la fonction, mais comme on peut s'y attendre l'identifiant est param défini sur null. Une idée de pourquoi cela se passe? Je veux seulement qu'il entre dans la méthode delete si un param est passé, mais quand un param est passé, il ne va pas dans (404 not found).

+0

Pourriez-vous s'il vous plaît essayer d'envoyer une demande DELETE à 'http: // localhost: 55555/products/index/1' et voir si cela fonctionne? – rabelloo

+0

Pouvez-vous poster votre code Ajax? –

+0

@Dobbins J'ai mis à jour mon message avec le code ajax. Je ne sais pas pourquoi ça ne marcherait pas. La console lance une erreur 404 non trouvée et me dit que l'URL demandée est: http: // localhost: 555555/products/1 –

Répondre

0

Inclure le paramètre de route pour id sur l'[HttpDelete] attribut:

[HttpDelete("{id}")] 
public IActionResult Index([FromRoute] int id) 
{ 
} 
+0

Je pensais vraiment que ça allait marcher, mais ce n'est pas le cas. –

+0

S'il vous plaît voir la mise à jour au bas de mon message. –

1

pour la route, vous pouvez marquer certains champs en option et définir la valeur par défaut pour les autres

routes.MapRoute(
    name: "default", 
    template: "{controller}/{action}/{id}", 
    defaults: new {controller = "Home", action = "Index", id = UrlParameter.Optional}); 

alors vous pouvez juste faire

[HttpDelete] 
public IActionResult Index(int id) 
{ 
} 
+0

Je crois que c'est la même chose que la configuration spécifiée dans mon message. Corrigez-moi si je me trompe. –

+0

@BlakeRivell ne sait pas si le tag from route a un conflit avec l'attribut {id}.Jetez un coup d'œil – Steve

+0

S'il vous plaît voir la mise à jour au bas de mon message. –

0

Enfin trouvé la réponse à cette question, mais seulement à partir d'essais et erreurs. Je ne sais pas pourquoi cela ne fonctionne que de cette façon.

//http://localhost:55555/products/1 

[HttpDelete("products/{id}")] 
public IActionResult Index([FromRoute] int id) 
{ 
} 

je ne sais pas pourquoi je devrais préciser le nom du contrôleur comme il devrait déjà être pris basé sur de ce paramètre:

routes.MapRoute(
     name: "default", 
     template: "{controller=Home}/{action=Index}/{id?}"); 

Si quelqu'un peut encore expliquer pourquoi il en est le cas que serait génial.

+0

Apparemment, le modèle n'est pas analysé comme prévu, vous ne pouvez donc pas définir les valeurs par défaut et les paramètres facultatifs à l'intérieur. Vous devez le configurer comme suggéré par @Steve. Voici la documentation MS: https://msdn.microsoft.com/en-us/library/cc668201.aspx – rabelloo