Я, кажется, получаю GUID в следе Breadcrumb MvcSiteMapProvider, не знаете почему?
Я использую MVC3, C#, Razor, mvcSiteMapProvider V4.
Я использую "Mvc.sitemap"
<mvcSiteMapNode title="Reports" controller="Report" action="Index" preservedRouteParameters="ClientId" route="Report">
<mvcSiteMapNode key="Report_Section" title="Sections" controller="Section" action="FilterByReport" preservedRouteParameters="ClientId,ReportId" route="Report_Section">
<mvcSiteMapNode key="Background" title="Background" controller="Wizard" action="Index" preservedRouteParameters="ClientId,ReportID,SectionID,SectionName" route="Background"/>
Пользовательские маршруты Global.asax выглядят так:
routes.MapRoute("Report", "Report/{ClientId}", new { controller = "Report", action = "Index", ClientId = UrlParameter.Optional });
routes.MapRoute("Report_Section", "Report/{ClientId}/Section/{ReportId}", new { controller = "Section", action = "FilterByReport", ReportId = UrlParameter.Optional });
routes.MapRoute("Background", "Report/{ReportID}/SectionID/{SectionID}/SectionName/{SectionName}", new { controller = "Wizard", action = "Index", ReportID = UrlParameter.Optional, SectionID = UrlParameter.Optional, SectionName = UrlParameter.Optional });
Маршруты "Report" и "Report_Section" работают нормально. Однако, когда я перехожу на "фоновый" маршрут, я теряю всю свою структуру маршрута для маршрутов "Report_Section" и "Report" в URL-адресе mvcSiteMap BreadCrumb. Вместо этого я получаю GUID, т.е.
http://localhost/7ebe9bb9-a663-43fd-9fb1-865866be12b9
Я считаю, что это может быть ключ узла XML, который генерируется автоматически. Однако он выдвигает 404 при нажатии.
Я должен получить что-то вроде:
Отчеты
http://localhost/Report/10
Разделы
http://localhost/Report/10/Section/100
Есть идеи, что может быть причиной этого?
Благодарю.
1 ответ
Вы получите Guid для URL, если распознаватель URL не может найти соответствие. Создание исключения в этом случае вызывало другие проблемы (посмотрите, почему преобразователь URL-адресов вызывает исключение).
Однако я не могу точно сказать, почему он не совпадает, не видя больше вашей конфигурации. Подсказка в том, что мы используем UrlHelper.RouteUrl(string, RouteValueDictionary) для разрешения URL. Вы можете попытаться вызвать его явно со своими значениями маршрута и именем маршрута. Также посмотрите исходный код для других подсказок.
Одна вещь, на которую я обратил внимание, это то, что вы сохраняете параметр маршрута ClientID для Background, когда он даже не используется в этом маршруте. Имейте в виду, что сохранение параметров маршрута только копирует их из текущего HTTP-запроса, и ваши другие узлы, кажется, забудут их.
PreserveRouteParameters обычно используется для операций CRUD, где вы создаете страницы редактирования данных. Если вы хотите, чтобы он "запоминал" путь навигации пользователя, то вам нужно добавить 1 узел для каждой уникальной комбинации значений маршрута в вашей карте сайта.
Если вышеперечисленное не помогает, создайте небольшой демонстрационный проект, в котором обнаружена проблема, и либо загрузите его на GitHub, либо заархивируйте его и сделайте его доступным для загрузки, а затем откройте новый выпуск на GitHub со ссылкой на демонстрационную версию.