如何路由GET和DELETE请求相同的URL,以不同的控制器方法 [英] How to route GET and DELETE requests for the same url to different controller methods

查看:129
本文介绍了如何路由GET和DELETE请求相同的URL,以不同的控制器方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

下面是我的路线在Global.asax中

  routes.MapRoute(PizzaGet,比萨/ {} pizzaKey,新{控制器=比萨,行动=GetPizzaById});
    routes.MapRoute(DeletePizza,比萨/ {} pizzaKey,新{控制器=比萨,行动=DeletePizza});

下面是我的控制器方法

 的[AcceptVerbs(HttpVerbs.Get)
公众的ActionResult GetPizzaById(长pizzaKey)的[AcceptVerbs(HttpVerbs.Delete)
公众的ActionResult DeletePizza(长pizzaKey)

当我这样做是返回对象的GET,但是当我做了删除,我收到了404。看起来这应该工作,但事实并非如此。

如果我切换围绕两条路线,然后我可以做删除,但得到的得到404

现在,这是真正的美丽。谢谢

  routes.MapRoute(比萨-GET,比萨/ {} pizzaKey
              新{控制器=比萨,行动=GetPizza},
              新{列举HTTPMethod =新HttpMethodConstraint(新的String [] {GET})});            routes.MapRoute(比萨-UPDATE,比萨/ {} pizzaKey
              新{控制器=比萨,行动=UpdatePizza},
              新{列举HTTPMethod =新HttpMethodConstraint(新的String [] {PUT})});            routes.MapRoute(比萨 - 删除,比萨/ {} pizzaKey
              新{控制器=比萨,行动=DeletePizza},
              新{列举HTTPMethod =新HttpMethodConstraint(新的String [] {删除})});            routes.MapRoute(比萨-ADD,比萨/
              新{控制器=比萨,行动=AddPizza},
              新{列举HTTPMethod =新HttpMethodConstraint(新的String [] {POST})});


解决方案

您可以通过类似这样的HTTP动词限制你的路线:

 的String [] = allowedMethods {GET,POST};
  VAR methodConstraints =新HttpMethodConstraint(allowedMethods);  路线reportRoute =新干线(比萨/ {} pizzaKey,新MvcRouteHandler());
  reportRoute.Constraints =新RouteValueDictionary {{列举HTTPMethod,methodConstraints}};    routes.Add(reportRoute);

现在你可以有两条路线,他们将在动词的制约。

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

解决方案

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.

这篇关于如何路由GET和DELETE请求相同的URL,以不同的控制器方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆