Проблемы неловкой трассы MVC (рядом с зонами) - PullRequest
0 голосов
/ 26 сентября 2011

Как мне настроить следующие не области маршруты?

/ foo / {controller} / {action} / {id}
отображается наконтроллеры в пространстве имен myapp.foo.

/ {controller} / {action} / {id}
отображаются на контроллеры в пространстве имен myapp.

У меня также есть2 области, бар и баз , они зарегистрированы в registeraAllAreas.

Моя текущая настройка

Это мои текущие настройки.Это дает проблему ниже, когда я использую url /Home/Index.

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

AreaRegistration.RegisterAllAreas();

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

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

Было найдено несколько типов, которые соответствуют контроллеру с именем 'Menu'.Это может произойти, если маршрут, обслуживающий этот запрос ( 'foo / {controller} / {action} / {id}' ), не указывает пространства имен для поиска контроллера, соответствующего запросу.

Запрос 'Menu' обнаружил следующие подходящие контроллеры: myapp.Controllers.MenuController
myapp.Areas.bar.Controllers.MenuController
myapp.Areas.baz.Controllers.MenuController

Очевидно, что я что-то делаю не так.

Обновление

Я также получаю неправильный адрес, генерируемый при использовании:

<% using (Ajax.BeginForm("SaveSomething", "Home", ...

Это делает<form target="/foo/Home/SaveSomething"

Я предполагаю, что нельзя надежно использовать {controller} на двух маршрутах в одной и той же области.

Обновление 2

Этокажется, работает намного лучше, когда я помещаю регистрацию маршрута / foo внизу.
Это поднимает вопрос, что считается маршрутом по умолчанию?(Поскольку маршрут по умолчанию рекомендуется поместить в самый конец.)

1 Ответ

2 голосов
/ 26 сентября 2011

У вас есть два контроллера с именем MenuController, поэтому MVC не знает, какой из них использовать, если вы не предоставите ему больше информации.В вашем регионе у вас, вероятно, есть файлы с именем что-то вроде <YourAreaName>AreaRegistration.Откройте эти файлы и обновите метод RegisterArea, чтобы направить запрос в нужный контроллер.

Из вашего сообщения об ошибке кажется, что маршрут отображается в foo / {controller} / {action} / {id}, который не имеет MenuController.Я предполагаю, что у вас есть ссылка действия на странице под foo что-то что-то.Это приведет к неправильной ссылке, если вы не укажете область для ссылки.

Попробуйте использовать маршрут по умолчанию с ActionLink:

@Html.ActionLink("Some text", "action", "controller", new { area = "" }, null)

Если вы хотите запросчтобы перейти в определенную область, просто запишите ее в вызове.

ОБНОВЛЕНИЕ: Проблема в том, что когда вы пишете что-то вроде Ajax.BeginForm("SaveSomething", "Home",...), оно будет соответствовать первому маршруту.Вы не можете решить эту проблему, поместив область в оператор BeginForm, как я предлагал ранее, поскольку маршрут foo не является областью.У вас есть два варианта: 1: переместить часть foo в область, 2: поставить маршрут foo после маршрута по умолчанию.Если вы поместите маршрут по умолчанию перед маршрутом foo, вы получите трудную визуализацию URL, если у вас есть foo в той же области, что и маршрут по умолчанию (область по умолчанию), так как механизм маршрутизации всегда сначала найдет маршрут по умолчанию.Однако вы сможете отловить запрос к маршруту foo.Поэтому мое лучшее предложение - проложить маршрут foo в области.

...