Результат 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;