c# - 如何在尊重路由配置的同时解析 Kentico Cloud 中的内容项链接?

标签 c# asp.net-core kentico kentico-kontent

ASP.NET Core 2.2 网站显示来自 Kentico Cloud CMS 的数据。有些项目包含富文本字段。这些字段可能包含指向其他内容项的链接。这些链接应由网站解析为 URL。

这个docs建议通过实现 IContentLinkUrlResolver 接口(interface)来完成此操作。然而,该示例对于我们网站的目的来说太虚拟了。我们的解析器需要了解请求的上下文(如当前的 UI 文化,因为该站点是多语言环境)和路由定义,因为这是定义 url 外观的唯一位置。

事实上,解析器需要能够调用 Url.Action,因为它能够在 View 内部进行调用。

url 解析器应该尊重路由和当前的 ui 区域性。其逻辑预计如下:

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?}");
        });
    });
});

如何解析尊重站点配置中的路由的链接?

最佳答案

这应该能够解析 View 中类似于 Url.Action 的 URL:

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 line 44 .

关于c# - 如何在尊重路由配置的同时解析 Kentico Cloud 中的内容项链接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55480990/

相关文章:

c# - LINQ to Entities 无法识别方法 'System.String ToString()' 方法 MVC3

c# - 如何在 c# 中的桌面应用程序和 Web 应用程序之间共享业务层类?

c# - 属性的默认值

c# - 如何使用 OpenIdConnect 中间件设置受众?

asp.net-mvc - 在 ASP.NET MVC Web 应用程序中包含 Shopify 和 Stripe

Kentico - 获取/格式化日期时间

Kentico 所需文件不再存在

c# - Visual Studio 2012 运行 Windows Phone 问题

c# - 如何将因来源而异添加到 asp.net 选项 header

asp.net-core - 将策略应用于 ASP.NET Core 应用程序中的路径