Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 如何将相同url的GET和DELETE请求路由到不同的控制器方法_Asp.net Mvc_Asp.net Mvc Routing - Fatal编程技术网

Asp.net mvc 如何将相同url的GET和DELETE请求路由到不同的控制器方法

Asp.net mvc 如何将相同url的GET和DELETE请求路由到不同的控制器方法,asp.net-mvc,asp.net-mvc-routing,Asp.net Mvc,Asp.net Mvc Routing,以下是我在Global.asax的路线 routes.MapRoute("PizzaGet", "pizza/{pizzaKey}", new { controller = "Pizza", action = "GetPizzaById" }); routes.MapRoute("DeletePizza", "pizza/{pizzaKey}", new { controller = "Pizza", action = "DeletePizza" }); 以下是我的控制

以下是我在Global.asax的路线

    routes.MapRoute("PizzaGet", "pizza/{pizzaKey}", new { controller = "Pizza", action = "GetPizzaById" });
    routes.MapRoute("DeletePizza", "pizza/{pizzaKey}", new { controller = "Pizza", action = "DeletePizza" });    
以下是我的控制器方法

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

[AcceptVerbs(HttpVerbs.Delete)]
public ActionResult DeletePizza(long pizzaKey)
当我执行GET时,它返回对象,但当我执行DELETE时,它返回404。看起来这应该行得通,但是不行

如果我切换两条路线,那么我可以执行删除操作,但在get上会得到404

现在这真是太美了。谢谢

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

您可以通过HTTP谓词约束路由,如下所示:

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

现在您可以拥有两条路线,它们将受到动词的约束。

Womp的解决方案对我不起作用

[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) { }
这是:

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

以防其他人对基于请求方法的不同路由存在问题。

感谢新的anwser。。我也发现了这个