2010-01-27 1 views
23

Voici mes itinéraires dans Global.asaxComment itinéraire GET et les demandes de suppression pour la même URL pour différentes méthodes de contrôleur

routes.MapRoute("PizzaGet", "pizza/{pizzaKey}", new { controller = "Pizza", action = "GetPizzaById" }); 
    routes.MapRoute("DeletePizza", "pizza/{pizzaKey}", new { controller = "Pizza", action = "DeletePizza" });  

Voici les mes méthodes de contrôleur

[AcceptVerbs(HttpVerbs.Get)] 
public ActionResult GetPizzaById(long pizzaKey) 

[AcceptVerbs(HttpVerbs.Delete)] 
public ActionResult DeletePizza(long pizzaKey) 

Quand je fais une GET il renvoie l'objet, mais quand je fais un DELETE je reçois un 404. Il semble que cela devrait fonctionner, mais ce n'est pas le cas.

Si je change les deux routes, alors je peux faire le DELETE, mais obtenir un 404 sur le GET.

Maintenant, c'est vraiment magnifique. Merci

routes.MapRoute("Pizza-GET","pizza/{pizzaKey}", 
       new { controller = "Pizza", action = "GetPizza"}, 
       new { httpMethod = new HttpMethodConstraint(new string[]{"GET"})}); 

      routes.MapRoute("Pizza-UPDATE", "pizza/{pizzaKey}", 
       new { controller = "Pizza", action = "UpdatePizza" }, 
       new { httpMethod = new HttpMethodConstraint(new string[] { "PUT" }) }); 

      routes.MapRoute("Pizza-DELETE", "pizza/{pizzaKey}", 
       new { controller = "Pizza", action = "DeletePizza" }, 
       new { httpMethod = new HttpMethodConstraint(new string[] { "DELETE" }) }); 

      routes.MapRoute("Pizza-ADD", "pizza/", 
       new { controller = "Pizza", action = "AddPizza" }, 
       new { httpMethod = new HttpMethodConstraint(new string[] { "POST" }) }); 

Répondre

19

Vous pouvez limiter vos itinéraires par verbe HTTP comme ceci:

string[] allowedMethods = { "GET", "POST" }; 
    var methodConstraints = new HttpMethodConstraint(allowedMethods); 

    Route reportRoute = new Route("pizza/{pizzaKey}", new MvcRouteHandler()); 
    reportRoute.Constraints = new RouteValueDictionary { { "httpMethod", methodConstraints } }; 

    routes.Add(reportRoute); 

Maintenant, vous pouvez avoir les deux routes, et ils seront contraints par les verbes.

+1

Merci pour la nouvelle réponse. J'ai aussi trouvé ce http://arcware.net/adding-httpmethodconstraint-to-asp-net-mvc-routes/ –

18
[ActionName("Pizza"), HttpPost] 
public ActionResult Pizza_Post(int theParameter) { } 

[ActionName("Pizza"), HttpGet] 
public ActionResult Pizza_Get(int theParameter) { } 

[ActionName("Pizza"), HttpHut] 
public ActionResult Pizza_Hut(int theParameter) { } 
0

La solution de Womp n'a pas fonctionné pour moi.

Cela fait:

namespace ... 
{ 
    public class ... : ... 
    { 
     public override void ...(...) 
     { 
      context.MapRoute(
       "forSpecificRequestMethod", 
       "...{rctrl}/{ract}/{id}", 
       new { controller = "controller", action = "action", id = UrlParameter.Optional }, 
       new RouteValueDictionary(new { httpMethod = new MethodRouteConstraint("REQUEST_VERB_HERE") }), 
       new[] { "namespace" } 
      ); 

      context.MapRoute(
       "default", 
       "...{controller}/{action}/{id}", 
       new { action = "Index", id = UrlParameter.Optional }, 
       new[] { "namespace" } 
      ); 
     } 
    } 

    internal class MethodRouteConstraint : IRouteConstraint 
    { 
     protected string method; 
     public MethodRouteConstraint(string method) 
     { 
      this.method = method; 
     } 
     public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) 
     { 
      return httpContext.Request.HttpMethod == method; 
     } 
    } 
} 

Dans le cas où quelqu'un d'autre a des problèmes avec ayant des itinéraires en fonction de la méthode de demande.

Questions connexes