c# - 如何在尊重路由配置的同时解析 Kentico Cloud 中的内容项链接?
问题描述
ASP.NET Core 2.2 网站显示来自 Kentico Cloud CMS 的数据。一些项目包含富文本字段。这些字段可能包含指向另一个内容项的链接。这些链接应由网站解析为 url。
该文档建议这是通过实现IContentLinkUrlResolver
接口来完成的。但是,对于我们网站的目的来说,样本太假了。我们的解析器需要知道请求的上下文(例如当前的 UI 文化,因为站点是多语言环境的)和路由定义,因为这是唯一定义 url 应该是什么样子的地方。
事实上,解析器需要能够调用 Url.Action,因为它能够在视图中调用。
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?}");
});
});
});
如何解决有关站点配置中路由的链接?
解决方案
这应该能够解析类似于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 第 44 行。
推荐阅读
- c++ - 复制赋值运算符隐式删除,因为字段具有已删除的复制赋值运算符
- android - 在 Android 上 React Native Invariant Violation
- mongodb - 如何修复由配置属性引起的 Heroku 应用程序错误?
- amazon-web-services - 无法从 Lightsail 上的生产上传到 S3
- java - doReturn 在 spyClass 超类中不起作用
- python - Python Plotly Express 无法在本地网站页面上显示绘图
- rest - 表单元素上的 Vue.js 3 v-model 在 REST 调用中丢失数据时出现未定义类型错误
- powershell - 脚本完成后有两个变量,但是当我通过管道传输到 SELECT-object 时,只有第一个将数据返回到控制台
- html - Boostrap 4 Carousel 未显示在索引页面上
- javascript - 反应 useState 无限循环