Правильно сформировать общую схему маршрутизации RESTful - PullRequest
3 голосов
/ 02 марта 2012

У меня есть несколько маршрутов в ASP.NET MVC 3. Я хочу добиться правильной обработки следующих URL-адресов:

/users
/users/123
/users/123/modules
/users/123/modules/1
/users/123/modules/1/modulesettings
/users/123/modules/1/modulesettings/642

Я также хочу иметь возможность поддерживать все стандартные HTTP-глаголы. Теперь я попытался создать несколько маршрутов в моем Global.asax, но всегда есть один маршрут, который не работает должным образом. Вот что у меня так далеко:

routes.MapRoute("RESTSubEntity",
            "{entity}/{entityId}/{subEntity}/{subEntityId}/{controller}/{id}/{action}", // action is the associated entity plurality
            new { controller = "Home", action = "Index", id = UrlParameter.Optional },
            new { id = @"\d+", entityId = @"\d+", subEntityId = @"\d+" });

routes.MapRoute("RESTEntity",
            "{entity}/{entityId}/{controller}/{id}/{action}", // action is the associated entity plurality
            new { controller = "Home", action = "Index", id = UrlParameter.Optional },
            new { id = @"\d+", entityId = @"\d+" });

routes.MapRoute("REST",
            "{controller}/{id}/{action}",
            new { controller = "Home", action = "Index", id = UrlParameter.Optional },
            new { id = @"\d+" });

routes.MapRoute("Default",
            "{controller}/{action}/{id}",
            new { controller = "Home", action = "Index", id = UrlParameter.Optional });

Гадкий, я знаю. Мне было интересно, есть ли способ заставить все мои маршруты работать с как можно более общим маршрутом. Спасибо!

1 Ответ

0 голосов
/ 05 марта 2012

Оказывается, проблема в том, что вы не можете объединить ограничение с необязательным параметром, что имеет смысл.Вот схема маршрутизации, которую я сейчас использую:

routes.MapRoute("Resource",
    "{controller}/{id}",
    new { controller = "Home", action = "Index", id = UrlParameter.Optional });

routes.MapRoute("SubResource",
    "{entityType}/{entityId}/{controller}/{id}",
    new { controller = "Home", action = "Index", id = UrlParameter.Optional },
    new { entityId = @"\d+" });

routes.MapRoute("SubSubResource",
    "{entityType}/{entityId}/{subEntity}/{subEntityId}/{controller}/{id}",
    new { controller = "Home", action = "Index", id = UrlParameter.Optional },
    new { entityId = @"\d+", subEntityId = @"\d+" });

routes.MapRoute("Default",
    "{controller}/{action}/{id}",
    new { controller = "Home", action = "Index", id = UrlParameter.Optional });
...