asp.net-mvc - net - pasar datos entre controladores mvc
Cómo enrutar las solicitudes GET y DELETE para la misma url a diferentes métodos de controlador (3)
La solución de Womp no funcionó para mí.
Esto hace:
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;
}
}
}
En caso de que alguien más tenga problemas con tener diferentes rutas según el método de solicitud.
Aquí están mis rutas en Global.asax
routes.MapRoute("PizzaGet", "pizza/{pizzaKey}", new { controller = "Pizza", action = "GetPizzaById" });
routes.MapRoute("DeletePizza", "pizza/{pizzaKey}", new { controller = "Pizza", action = "DeletePizza" });
Aquí están los métodos de mi controlador
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult GetPizzaById(long pizzaKey)
[AcceptVerbs(HttpVerbs.Delete)]
public ActionResult DeletePizza(long pizzaKey)
Cuando hago un GET, devuelve el objeto, pero cuando hago un BORRAR obtengo un 404. Parece que esto debería funcionar, pero no lo hace.
Si cambio las dos rutas, entonces puedo hacer ELIMINAR, pero obtener un 404 en el GET.
Ahora esto es verdaderamente hermoso. Gracias
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" }) });
Puedes restringir tus rutas por el verbo HTTP de esta manera:
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);
Ahora puedes tener ambas rutas, y estarán limitadas por los verbos.
[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) { }