Создание карты сайта MvcSiteMapProvider с маршрутизацией атрибутов MVC

Я работаю над проектом MVC5, где мне нужно создать карту сайта.

Я создал свои маршруты, используя атрибут маршрута в действиях контроллера.

Я использую поставщика динамических узлов, как указано в документации для MvcSiteMapProvider, и он отлично работает для одного из моих контроллеров, однако для другого он отображает параметры строки запроса для каждого сопоставленного маршрута, например

я осознаю

www.url.com?SelectedCulture=ru-ru

когда я ожидаю

www.url.com/ru-ru

Все мои маршруты работают нормально, и если я использую свое приложение, оно также работает нормально ... Он просто не создает карту сайта, которую я ожидаю

Созданный мной динамический провайдер заполняет обязательный атрибут, соответствующий маршруту.

У кого-нибудь есть идеи?

Это мой XML-файл Mvc.sitemap

<mvcSiteMapNode title="ATitle" controller="Parent" action="Index" key="Home">
<mvcSiteMapNode title="ASubTitle" controller="Parent" action="Index" key="CulturePages">
</mvcSiteMapNode>

This is my dynamicNodeProvider

public class SitePagesDynamicProvider : DynamicNodeProviderBase
{
    public override IEnumerable<DynamicNode> GetDynamicNodeCollection(ISiteMapNode node)
    {
        using (var ef = new EntityFrameworkRepository())
        {
            // Create a node for each sites 
            foreach (var obj in ef.GetIDs();
            {
                DynamicNode dynamicNode;

                    dynamicNode = new DynamicNode();
                    dynamicNode.Title = obj.title;
                    dynamicNode.ParentKey = "CulturePages";
                    dynamicNode.RouteValues.Add("SelectedCulture", obj.culture);
                    yield return dynamicNode;
            }
        }
    }
}

А это мое действие контроллера:

[MvcSiteMapNodeAttribute(Title = "Sites", Key = "Sites", ParentKey = "HomePages", DynamicNodeProvider = "TestProject.Models.SitePagesDynamicProvider, TestProject")]
    [Route("{SelectedCulture:regex(^([a-z]|[A-Z]){2}-([a-z]|[A-Z]){2}?$)?}/")]
    public ActionResult Index(string SelectedCulture)
    {
       return View();
    }

Спасибо!


person Bynho    schedule 14.05.2014    source источник


Ответы (2)


Как неловко... Проблема заключалась в неправильном написании идентификатора значения маршрута в поставщике узла!

person Bynho    schedule 14.05.2014

Я никогда не использовал AttributeRouting, но, насколько мне известно, он работает так же, как объявление ваших маршрутов в классе RouteConfig.

Маршрутизация состоит из двух частей: 1) разрешение входящих URL-адресов для соответствия набору RouteValues ​​и 2) разрешение исходящих URL-адресов из набора RouteValues. Это исходящий URL-адрес (иногда называемый исходящим URL-адресом), который необходимо правильно настроить, чтобы MvcSiteMapProvider сгенерировал правильный URL-адрес.

Как описано в разделе Управление поведением URL, URL-адреса разрешаются классом UrlHelper среды MVC. Вы можете использовать следующий код в действии контроллера, чтобы увидеть, можете ли вы сгенерировать правильный URL-адрес с помощью MVC, а затем работать в обратном направлении. Я предлагаю вам сначала настроить свой маршрут с помощью класса RouteConfig, убедиться, что вы получили правильный URL-адрес, а затем попытаться найти эквивалентное выражение для AttributeRouting (возможно, с помощью .

// Using controller and action
var urlHelper = new UrlHelper(new System.Web.Routing.RequestContext(this.HttpContext, this.RouteData));
var url = urlHelper.Action("Index", "Parent", new System.Web.Routing.RouteValueDictionary { { "SelectedCulture", "en-gb" } });

Примечание. Вы можете значительно улучшить масштабирование MvcSiteMapProvider, если будете использовать встроенную локализацию вместе с preserveRouteParameters, а не создавать узлы для каждой культуры, как описано в этот ответ.

person NightOwl888    schedule 14.05.2014
comment
Спасибо за подробный ответ. Это была глупая опечатка с моей стороны! - person Bynho; 14.05.2014