Как разрешить ссылки на элементы контента в Kentico Cloud при соблюдении конфигурации маршрутов? - PullRequest
2 голосов
/ 02 апреля 2019

Веб-сайт ASP.NET Core 2.2 показывает данные из Kentico Cloud CMS. Некоторые элементы содержат поле расширенного текста. Эти поля могут содержать ссылки на другие элементы контента. Эти ссылки должны быть преобразованы в URL на веб-сайте.

Это документы предполагают, что это делается путем реализации интерфейса IContentLinkUrlResolver. Тем не менее, образец слишком пустышка для целей нашего сайта. Наш распознаватель должен знать контекст запроса (например, текущую культуру пользовательского интерфейса, поскольку сайт является мультиязычным) и определения маршрутов, поскольку это единственное место, которое определяет, как должны выглядеть URL-адреса.

Фактически, распознаватель должен иметь возможность вызывать Url.Action так, как он мог бы быть внутри представления.

Преобразователь URL должен учитывать маршруты и текущую культуру пользовательского интерфейса. Ожидается, что его логика будет такой:

if (the linked content item type is Page)
{
    Url.Action("Page", "Home", new [] { codename = content item’s codename });
}
else if (the linked content item type is PageFont)
{
    Url.Action("Font", "Home", new [] { codename = content item’s codename });
}
else
{
    throw an error about an unsupported content type.
}

Правила определены как:

var localizationOptions = app.ApplicationServices.GetService<IOptions<RequestLocalizationOptions>>();

app.UseRouter(routes =>
{
    routes.MapMiddlewareRoute("{culture=en-US}/{*mvcRoute}", subApp =>
    {
        subApp.UseRequestLocalization(localizationOptions.Value);

        subApp.UseMvc(mvcRoutes =>
        {
            mvcRoutes.MapRoute(
                name: "areas",
                template: "{culture=en-US}/{area:exists}/{controller=Home}/{action=Index}/{id?}");

            mvcRoutes.MapRoute(
                name: "sitemap",
                defaults: new { controller = "Sitemap", action = "Index" },
                template: "sitemap.xml");

            mvcRoutes.MapRoute(
                name: "font",
                defaults: new { controller = "Home", action = "Font" },
                template: "{culture=en-US}/font/{codename}");

            mvcRoutes.MapRoute(
                name: "page",
                defaults: new { controller = "Home", action = "Page" },
                template: "{culture=en-US}/{codename}");

            mvcRoutes.MapRoute(
                name: "default",
                template: "{culture=en-US}/{controller=Home}/{action=Index}/{id?}");
        });
    });
});

Как разрешить ссылки с учетом маршрутов в конфигурации сайта?

1 Ответ

5 голосов
/ 06 апреля 2019

Это должно быть в состоянии разрешить URL, похожие на Url.Action в представлении:

В Startup.cs:

services
    .TryAddSingleton<IActionContextAccessor, ActionContextAccessor>();

services
    .AddSingleton<IContentLinkUrlResolver, RoutesContentLinkUrlResolver>()
    .AddDeliveryClient( ... )
;

В RoutesContentLinkUrlResolver.cs:

private readonly IUrlHelperFactory urlHelperFactory;
private readonly IActionContextAccessor actionContextAccessor;

public RoutesContentLinkUrlResolver(IUrlHelperFactory urlHelperFactory, IActionContextAccessor actionContextAccessor)
{
    this.urlHelperFactory = urlHelperFactory;
    this.actionContextAccessor = actionContextAccessor;
}

public string ResolveLinkUrl(ContentLink link)
{
    IUrlHelper Url = urlHelperFactory.GetUrlHelper(actionContextAccessor.ActionContext);

    switch (link.ContentTypeCodename)
    {
        case "Page":
            return Url.Action("Page", "Home", new { codename = link.Codename });
    }
}

Экземпляр IUrlHelper извлекается как можно позже, чтобы убедиться, что он имеет самые последние значения времени выполнения.Реализация по умолчанию IUrlHelperFactory использует кэширование для повышения производительности: UrlHelperFactory строка 44 .

...