2010-01-27 14 views
23

Qui sono le mie vie in Global.asaxCome percorso GET e DELETE richieste per lo stesso URL a diversi metodi di controller

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

Qui ci sono i miei metodi di controller

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

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

Quando faccio un GET restituisce l'oggetto, ma quando faccio un DELETE ottengo un 404. Sembra che questo dovrebbe funzionare, ma non lo fa.

Se cambio i due percorsi in giro, posso eseguire il DELETE, ma ottenere un 404 su GET.

Ora questo è veramente bello. Grazie

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

risposta

19

È possibile vincolare i percorsi da verbo HTTP come questo:

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

Ora si possono avere entrambe le rotte, e saranno costretti dai verbi.

+1

Grazie per il nuovo anwser .. Ho anche trovato questo 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

soluzione Womp non ha funzionato per me.

Questo fa:

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

Nel caso in cui nessun altro sta avendo problemi con avere percorsi diversi in base al metodo di richiesta.

Problemi correlati