2

Comment puis-je détecter au démarrage de l'application qu'un client ne prend pas en charge les verbes DELETE et PUT et surcharger automatiquement le verbe POST?
Sur le serveur, comment puis-je rediriger les verbes POST surchargés dans les bonnes actions?
Dites que j'ai une demande DELETE qui est redéfinie, comment puis-je appeler la fonction appropriée dans le contrôleur qui correspond à l'action?
Je suppose que je devrais utiliser un filtre d'action et utiliser la réflexion pour inspecter les attributs qui correspondent à ma fonction (dans cet exemple: DeleteFoo(Guid Id)).Comment surcharger automatiquement DELETE et PUT s'ils ne sont pas disponibles par le client?

Répondre

5

Vous ne pouvez pas détecter si un client prend en charge ou non ces verbes. Aussi pour les navigateurs qui ne supportent pas les verbes PUT et DELETE dans les formulaires html, vous pouvez utiliser l'assistant HttpMethodOverride dans votre formulaire qui ajoutera un champ caché au formulaire qui demandera à l'exécution d'invoquer l'action du contrôleur approprié malgré le fait que sous les couvertures une demande POST est envoyée.

<% using (Html.BeginForm("Destroy", "Products", new { id = "123" }, FormMethod.Post)) { %> 
    <%: Html.HttpMethodOverride(HttpVerbs.Delete) %> 
    <input type="submit" value="Delete" /> 
<% } %> 

qui appellera l'action décorée avec [HttpDelete]:

[HttpDelete] 
public ActionResult Destroy(int id) 
{ 
    // TODO: delete product 
    TempData["message"] = "product deleted"; 
    return RedirectToAction("index");  
} 

L'important ici est que le contrôleur ne doit pas occuper ou dépendent de ce que les verbes du client prend en charge. Si vous concevez vos contrôleurs d'une manière RESTful en utilisant les verbes et les noms appropriés, il existe des techniques telles que celles montrées ici qui permettent aux clients qui ne supportent pas les verbes PUT et DELETE d'invoquer ces actions.

+0

Mais qu'en est-il des demandes ajax? –

+1

Et à propos d'eux? Les requêtes AJAX prennent en charge les verbes PUT et DELETE, vous n'avez donc pas besoin du champ caché supplémentaire. Ils seront automatiquement envoyés à l'action du contrôleur approprié en fonction du verbe HTTP que vous utilisez: '$ .ajax ({url: '/ products/destroy/123', tapez: 'DELETE', succès: fonction (résultat) {alert ('produit supprimé');}}); ' –

+0

Pourquoi les requêtes ajax prennent en charge PUT et DELETE et les requêtes de formulaire normales ne le font pas? –

Questions connexes