微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我想允许正斜杠进入SENAME

如何解决我想允许正斜杠进入SENAME

我想允许正斜杠进入我的nop项目的SENAME。我该如何使用自定义功能

例如,

  1. 我要使用类似“ / product / htc-one-m8-android-l-50-lollipop”的产品网址,而不是“ / htc-one-m8-android-l-50-lollipop”
  2. 我要使用“ / 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}");

如果您希望正确显示现有链接,则还希望更新默认的ProductCategory路由,并且您的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" });
}

更新

要在产品名称中使用/,您需要进行多项更改。

  1. 允许使用/来命名UrlRecordService具有GetSeName方法,并在okChars变量中添加/作为有效字符之一。

  2. 修复与动态路由有关的呼叫。您的代码中缺少{。它应该是: endpointRouteBuilder.MapDynamicControllerRoute<SlugRouteTransformer>("{SeName}");

  3. 在使用以下方法搜索匹配的网址记录之前,先更新SlugRouteTransformer的{​​{1}}方法以转义URL。 TransformAsync

我相信仅此而已,之后您应该可以在实体名称中允许var urlRecord = _urlRecordService.GetBySlug(Uri.UnescapeDataString(slug));。请注意,这可能会破坏现有页面,并且链接可能无法始终正常运行。另外,如果仔细观察,产品/类别的URL中将包含/,如果要更改,则必须在渲染前取消所有链接的隐藏,例如: %2F但它会破坏很多东西!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。