Результат MVC3 RouteHandler игнорирует область в разрешенном маршруте - почему?

Я работаю над разделением приложения 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 Area. С этим на месте маршрутизация, кажется, игнорирует факт, что это зарегистрировано как маршрут области, и я получаю желтую страницу ошибки, которая говорит:

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 ответ

Решение

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

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

route.DataTokens["Area"] = context.AreaName;
Другие вопросы по тегам