views:

164

answers:

3

Here are my routes in Global.asax

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

Here are the my controller methods

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

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

When I do a GET it returns the object, but when I do a DELETE I get a 404. It seems like this should work, but it doesn't.

If I switch the two routes around then I can do the DELETE, but get a 404 on the GET.

Now this is truly beautiful. Thanks

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" }) });
+2  A: 

I retract my previous answer. You can constrain your routes by HTTP verb like this:

  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);

Now you can have both routes, and they will be constrained by the verbs.

womp
Thanks, the work around isn't so bad.
Arron
Thanks for the new anwser.. I also found this http://arcware.net/adding-httpmethodconstraint-to-asp-net-mvc-routes/
Arron
A: 

I tend to do this ... and it works for me

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

 [AcceptVerbs(HttpVerbs.Delete)]
 public ActionResult Pizza(long pizzaKey)
Hurricanepkt
How? That's a compile error. Same method twice?
Arron
+4  A: 
[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) { }
Levi