问题描述
我想允许正斜杠进入我的nop项目的SENAME。我该如何使用自定义功能?
例如,
- 我要使用类似“ / product / htc-one-m8-android-l-50-lollipop”的产品网址,而不是“ / htc-one-m8-android-l-50-lollipop”
- 我要使用“ / category / desktops”之类的类别网址,而不是“ / desktops”
我正在使用nopcommerce 4.3版本。
示例代码
endpointRouteBuilder.MapDynamicControllerRoute<SlugRouteTransformer>("SeName}");
我没有调用此TransformAsync方法。当我在网址中添加“ / product / sename”时,我想在这里打电话
public override ValueTask<RouteValueDictionary> TransformAsync(HttpContext httpContext,RouteValueDictionary values)
{
}
解决方法
您可以在Product/
中为Category/
和GenericUrlRouteProvider
路径注册路由,例如:
endpointRouteBuilder.MapDynamicControllerRoute<SlugRouteTransformer>("Product/{SeName}");
endpointRouteBuilder.MapDynamicControllerRoute<SlugRouteTransformer>("Category/{SeName}");
如果您希望正确显示现有链接,则还希望更新默认的Product
和Category
路由,并且您的register route方法应类似于:
public void RegisterRoutes(IEndpointRouteBuilder endpointRouteBuilder)
{
var pattern = "{SeName}";
var productPattern = "Product/{SeName}";
var catgoryPattern = "Category/{SeName}";
if (DataSettingsManager.DatabaseIsInstalled)
{
var localizationSettings = endpointRouteBuilder.ServiceProvider.GetRequiredService<LocalizationSettings>();
if (localizationSettings.SeoFriendlyUrlsForLanguagesEnabled)
{
var langservice = endpointRouteBuilder.ServiceProvider.GetRequiredService<ILanguageService>();
var languages = langservice.GetAllLanguages().ToList();
pattern = "{language:lang=" + languages.FirstOrDefault().UniqueSeoCode + "}/{SeName}";
productPattern = "{language:lang=" + languages.FirstOrDefault().UniqueSeoCode + "}/{SeName}";
catgoryPattern = "{language:lang=" + languages.FirstOrDefault().UniqueSeoCode + "}/{SeName}";
}
}
endpointRouteBuilder.MapDynamicControllerRoute<SlugRouteTransformer>(pattern);
endpointRouteBuilder.MapDynamicControllerRoute<SlugRouteTransformer>(productPattern);
endpointRouteBuilder.MapDynamicControllerRoute<SlugRouteTransformer>(catgoryPattern);
//and default one
endpointRouteBuilder.MapControllerRoute(
name: "Default",pattern: "{controller=Home}/{action=Index}/{id?}");
//generic URLs
endpointRouteBuilder.MapControllerRoute(
name: "GenericUrl",pattern: "{GenericSeName}",new { controller = "Common",action = "GenericUrl" });
//define this routes to use in UI views (in case if you want to customize some of them later)
endpointRouteBuilder.MapControllerRoute("Product",productPattern,new { controller = "Product",action = "ProductDetails" });
endpointRouteBuilder.MapControllerRoute("Category",catgoryPattern,new { controller = "Catalog",action = "Category" });
endpointRouteBuilder.MapControllerRoute("Manufacturer",pattern,action = "Manufacturer" });
endpointRouteBuilder.MapControllerRoute("Vendor",action = "Vendor" });
endpointRouteBuilder.MapControllerRoute("NewsItem",new { controller = "News",action = "NewsItem" });
endpointRouteBuilder.MapControllerRoute("BlogPost",new { controller = "Blog",action = "BlogPost" });
endpointRouteBuilder.MapControllerRoute("Topic",new { controller = "Topic",action = "TopicDetails" });
//product tags
endpointRouteBuilder.MapControllerRoute("ProductsByTag",action = "ProductsByTag" });
}
更新:
要在产品名称中使用/
,您需要进行多项更改。
-
允许使用/来命名
UrlRecordService
具有GetSeName
方法,并在okChars
变量中添加/
作为有效字符之一。 -
修复与动态路由有关的呼叫。您的代码中缺少
{
。它应该是:endpointRouteBuilder.MapDynamicControllerRoute<SlugRouteTransformer>("{SeName}");
-
在使用以下方法搜索匹配的网址记录之前,先更新
SlugRouteTransformer
的{{1}}方法以转义URL。TransformAsync
我相信仅此而已,之后您应该可以在实体名称中允许var urlRecord = _urlRecordService.GetBySlug(Uri.UnescapeDataString(slug));
。请注意,这可能会破坏现有页面,并且链接可能无法始终正常运行。另外,如果仔细观察,产品/类别的URL中将包含/
,如果要更改,则必须在渲染前取消所有链接的隐藏,例如:
%2F
但它会破坏很多东西!