Маршрутизация ASP.NET MVC: маршрут, подобный подпапке

Это моя файловая структура в моем проекте ASP.NET MVC 4 относительно контроллеров:

 |--Models
 |--Controllers
       |
       |--api
       |   |
       |   |--UsersController.cs  (MyProject.Controllers.API.UsersController.cs)
       |   |--PlacesController.cs (MyProject.Controllers.API.PlacesController.cs)
       |
       |--UsersController.cs  (MyProject.Controllers.ViewsControllers.UsersController.cs)
       |--PlacesController.cs  (MyProject.Controllers.ViewsControllers.PlacesController.cs)

Все контроллеры в пространстве имен MyProject.Controllers.API возвращают JsonResult
Все контроллеры в пространстве имен MyProject.Controllers.ViewsControllers возвращают представления

Мой RouteConfig.cs таков:

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/",
            defaults: new { controller = "Places", action = "List" },
            namespaces: new[] { "MyProject.Controllers.ViewsControllers" }
        );
    }

Когда я иду с веб-браузером к http://localhost/Places/List, он возвращает представление, как и ожидалось, потому что он использует контроллер MyProject.Controllers.PlacesControlller.cs

Как я могу создать MapRoute для своих json-контроллеров, чтобы при переходе в веб-браузере к http://localhost/api/Places/SomeAction он использовал класс MyProject.Controllers.API.PlacesController.cs?

Примечание. Я не хочу использовать функцию API ASP.NET MVC.

Я пробовал это, но это не работает:

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            name: "ViewRoute",
            url: "{controller}/{action}/",
            namespaces: new[] { "MyProject.Controllers.ViewsControllers" }
        );

        routes.MapRoute(
            name: "APIRoute",
            url: "api/{controller}/{action}/",
            namespaces: new[] { "MyProject.Controllers.API" }
        );
    }

person sports    schedule 12.08.2014    source источник
comment
проверьте это bubblogging.wordpress.com/2012/06/09/mvc -routing-пространства имен   -  person malkam    schedule 12.08.2014
comment
хорошо, теперь я вижу, что происходит: если я изменю URL-адрес: api/... на URL-адрес: apix/..., это сработает. Видимо API зарезервировано.   -  person sports    schedule 13.08.2014
comment
В конце API не был зарезервирован, но уже использовался, как в этом ответе: stackoverflow.com/questions/25277926/ - я не знаю, повлияет ли закрытие этого вопроса на мою репутацию, но я хотел бы оставить этот другой вопрос вместо Вот этот.   -  person sports    schedule 20.09.2014


Ответы (1)


Для вызова обычного действия контроллера вы должны зарегистрировать свои маршруты следующим образом, что вы уже сделали:

    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        name: "ViewRoute",
        url: "{controller}/{action}/",
        namespaces: new[] { "MyProject.Controllers.ViewsControllers" }
    );

Для вызова API-контроллера определите следующий метод в вашем классе маршрутов и зарегистрируйте этот метод в вашем методе global.asax Application_Start():

    public static void RegisterAPI(HttpConfiguration config)
    {
        // Web API configuration and services

        // Web API routes
        config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
person Henry Chettiar    schedule 13.08.2014