ASP.NET MVC 2: области применения и маршруты - PullRequest
0 голосов
/ 19 мая 2010

Таким образом, мое приложение растет, и я хотел бы отделить мои контроллеры на основе View от моих контроллеров на основе JSON. По сути, у меня есть несколько контроллеров, которые все, что они делают, возвращают результаты JSON для вызовов AJAX.

То, что я хотел бы сделать, это настроить маршруты (и, соответственно, структуру папок в папке «Мои контроллеры») так, чтобы мои контроллеры JSON находились в / RPC /, а мои обычные контроллеры - в / - т.е. мой JavaScript будет вызывать / RPC / SomeController / SomeAction, а мои обычные страницы будут находиться в /SomeOtherController/SomeOtherAction.

Итак, я настроил папку Controllers следующим образом:

  • Контроллеры (папка)
    • RPC (папка)
      • JsonController1
      • JsonController2
    • ViewController1 1018 *
    • ViewContoller2
    • ViewController3

Я не смог просто зайти в / RPC / JsonController1 / Index и получить эту работу, поэтому я настроил свои маршруты следующим образом:

protected void Application_Start()
{
 AreaRegistration.RegisterAllAreas();

 RegisterRoutes(RouteTable.Routes);

 // Register new annotations.
 DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(UniqueUsernameAttribute), typeof(UniqueUsernameValidator));
}

public static void RegisterRoutes(RouteCollection routes)
{
 // Add the combres routes, too
 routes.AddCombresRoute("Combres");
 routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

 routes.MapRoute("RPC", 
  "RPC/{controller}/{action}/{id}", 
  new { controller = "None", action = "Index", id = UrlParameter.Optional },
  new[] { "Backplane.Web.Controllers.RPC" }
 );

 routes.MapRoute(
  "Default", // Route name
  "{controller}/{action}/{id}", // URL with parameters
  new { controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults
  new[] { "Backplane.Web.Controllers" }
 );
}

Это прекрасно работает! Мои контроллеры доступны как в / RPC /, так и в /! К сожалению, я могу получить доступ к / RPC / ViewController1 /, и я также могу получить доступ к /JsonController1/.

Кажется, у меня есть фундаментальное недопонимание о маршрутизации и о том, как она связана с физическим путем в файловой системе. Нужна ли здесь индивидуальная схема маршрутов? Я хотел бы сохранить все это в том же проекте, что и все контроллеры в одной DLL.

1 Ответ

0 голосов
/ 19 мая 2010

Маршрутизация не связана с физическим путем в файловой системе (на компьютере сборки или на сервере). Маршрутизация выполняется во время выполнения, и в этот момент нет никаких артефактов, которые бы указывали на обработчик маршрутизации MVC, где в файловой системе был расположен определенный класс. Таким образом, маршрутизация зависит только от порядка маршрутов в таблице маршрутизации (который зависит от их порядка в Global.asax.cs) и от того, как части пути URL отображаются на маршруты и имена классов контроллера и действия.

Самое простое решение для работы вашего сценария - удалить правило Default и перечислить явные правила для любого контроллера в корневом каталоге.

Другой подход - переместить все ваши контроллеры RPC в отдельную область (области / RPC / контроллеры) в вашем решении. То, как работают области, заключается в том, что любой путь /rpc/* сопоставляется с областью RPC. Существуют определенные предостережения с таким подходом, но в целом он должен работать, так как маршруты области регистрируются после основных маршрутов, а маршрутизация MVC пытается избежать использования контроллеров, которые являются частью области с URL, которые не карта этой области.

...