2012-04-13 1 views
0

У меня есть следующие маршруты: MyHttpMethodConstraint - это тот, который проверяет метод HTTP, переопределяя форму переменной.ASP.NET MVC Создание URL-адресов для ссылок, выбирающих неправильный маршрут с ограничениями метода HTTP

routes.MapRoute("Retrieve", "{controller}/{id}/{action}", new { action = "retrieve" }, new { action = "create|retrieve|update|delete", httpMethod = new MyHttpMethodConstraint("GET", "HEAD"), id = new GuidRouteConstraint() }); 
routes.MapRoute("Update", "{controller}/{id}", new { action = "update" }, new { action = "update", httpMethod = new MyHttpMethodConstraint("PUT"), id = new GuidRouteConstraint() }); 
routes.MapRoute("Delete", "{controller}/{id}", new { action = "destroy" }, new { action = "delete", httpMethod = new MyHttpMethodConstraint("DELETE"), id = new GuidRouteConstraint() }); 
routes.MapRoute("Create", "{controller}", new { action = "create" }, new { action = "create", httpMethod = new MyHttpMethodConstraint("POST") }); 

Everthing направляется правильно входящими в действия, однако поколения URL-за Url.ActionLink не работает, как я надеялся (с использованием маршрутов, которые ограничены в HTTP GET методы), но вместо того, чтобы найти те, которые ограничены в POST/PUT/DELETE и, следовательно, неправильные URL-адреса. Я попробовал переупорядочить маршруты, но это не помогает. Я ожидаю, что это URL-генерация игнорирует ограничения.

Есть ли обходной путь, кроме создания моего собственного метода ActionLink?

EDIT

Существует также маршрут по умолчанию в нижней части списка:

routes.MapRoute("Default", "{controller}/{action}", new { controller = "home", action = "index" }); 
+0

Можете ли вы предоставить код для MyHttpMethodConstraint? Что делает это из-за недостатка HttpMethodConstraint? – danludwig

+0

См. Мой комментарий к вашему ответу - стандартный HttpMethodConstraint не обрабатывает X-HTTP-метод-переопределение –

ответ

1

Проблема решена - этот вопрос, что он не работает для ссылки на создания действия (т. е. когда GET), потому что он не использовал ни один из вышеуказанных маршрутов, но маршрут по умолчанию внизу (который не имеет каких-либо ограничений). Мой список маршрутов (в том числе по умолчанию), которые работают:

routes.MapRoute("Retrieve/UpdateSetup/DeleteSetup", "{controller}/{id}/{action}", new { action = "retrieve" }, new { action = "retrieve|update|delete", httpMethod = new MyHttpMethodConstraint("GET", "HEAD"), id = new GuidRouteConstraint() }); 
routes.MapRoute("CreateSetup", "{controller}/create", new { action = "create" }, new { action = "create", httpMethod = new MyHttpMethodConstraint("GET", "HEAD") }); 
routes.MapRoute("Update", "{controller}/{id}", new { action = "update" }, new { action = "update", httpMethod = new MyHttpMethodConstraint("PUT"), id = new GuidRouteConstraint() }); 
routes.MapRoute("Delete", "{controller}/{id}", new { action = "delete" }, new { action = "delete", httpMethod = new MyHttpMethodConstraint("DELETE"), id = new GuidRouteConstraint() }); 
routes.MapRoute("Create", "{controller}", new { action = "create" }, new { action = "create", httpMethod = new MyHttpMethodConstraint("POST") }); 

routes.MapRoute("Default", "{controller}/{action}", new { controller = "home", action = "index" }); 
Смежные вопросы