Результат MVC3 RouteHandler игнорирует область в разрешенном маршруте - почему? - PullRequest
0 голосов
/ 23 июня 2011

Я работаю над разделением приложения MVC3 на две области. Существующее приложение входит в одну область (V1), и мы начинаем редизайн во второй области (V2).

У меня все представления, модели, контроллеры и т. Д. Перемещены в папки MyApp \ Areas \ V1 \ xxx, и я смог убедиться, что все загружается, как и должно быть, по большей части. Я переместил всю регистрацию маршрута для V1 в файл V1AreaRegistration.cs и изменил его, чтобы использовать context.MapRoute вместо RouteTable.Routes.MapRoute.

Глядя на маршрутизацию с помощью RouteDebugger Фила Хаака, все выглядит хорошо - мои маршруты V2 разрешаются так, как должны, и основные маршруты V1 работают. Что НЕ работает, так это маршруты V1, где у меня есть пользовательский MvcRouteHandler, определенный следующим образом:

context.MapRoute(
    "MyRouteName",
    "{myRouteVal}/{controller}/{action}",
    new { area = "V1", controller = "DefaultController", action = "Index" },
    new { controller = _someRouteConstraint},
    new string[] { "My.Custom.Project.WebLibrary.Areas.V1.Controllers" },
        _myCustomRouteHandler);

Если я удаляю _myCustomRouteHandler из этого вызова, он прекрасно работает и отправляет меня к правильному виду в области V1. Когда он установлен, кажется, что маршрутизация игнорирует тот факт, что он зарегистрирован как маршрут по области, и я получаю желтую страницу с сообщением об ошибке:

The view 'Index' or its master was not found or no view engine
supports the searched locations. The following locations were searched:
~/Views/DefaultController/Index.cshtml
~/Views/DefaultController/Index.vbhtml
~/Views/Shared/Index.cshtml
~/Views/Shared/Index.vbhtml
~/Views/DefaultController/Index.aspx
~/Views/DefaultController/Index.ascx
~/Views/Shared/Index.aspx
~/Views/Shared/Index.ascx

Мне нужно иметь возможность использовать обработчик маршрута - он выполняет некоторую работу по проверке параметра {myRoutVal} и перенаправляет на страницу ошибки, если она недействительна.

Помощь !!

1 Ответ

1 голос
/ 24 июня 2011

Нашел проблему. У нас есть метод расширения для AreaRegistrationContext, который вы видите выше (context.MapRoute) - в этом методе я неправильно устанавливаю значение route.DataTokens["Area"], поэтому, когда он пытается найти представление, он не смотрит в площадь.

Добавление следующей строки в мой AreaRegistrationContext метод расширения решило проблему:

route.DataTokens["Area"] = context.AreaName;
...