我有一个简单的asp.net webforms项目,只有很少的页面,我想使用友好的url(不仅用于seo,还用于url的本地化)。我在这个项目中使用了.net 4.5,并尝试使用microsoft.aspnet.friendlyurls nuget包,看起来它可能会有帮助。但有一个问题。
我在环球网找到了这个:

    void Application_Start(object sender, EventArgs e)
    {
        // Code that runs on application startup
        BundleConfig.RegisterBundles(BundleTable.Bundles);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
    }

RouteConfig类如下所示:
public static class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.MapPageRoute("HowItWorks", "ako-to-funguje", "~/HowItWorks.aspx");
        routes.MapPageRoute("AboutUs", "o-nas", "~/AboutUs.aspx");
        routes.MapPageRoute("Contact", "kontakt", "~/Contact.aspx");

        var settings = new FriendlyUrlSettings();
        settings.AutoRedirectMode = RedirectMode.Permanent;
        routes.EnableFriendlyUrls(settings);
    }
}

如果您同时通过/howitworks和/ako to funguje(斯洛伐克语言环境)访问它,我想显示同一页。
现在我已经接近实际问题了。当我使用一个本地化的路由(例如/ako到funguje)访问站点时,request.getFriendlyUrlFileVirtualPath()返回空字符串(但我想获取“~/howitworks.aspx”,我想在母版页中对其执行一些操作)。
 string pageFileName = Request.GetFriendlyUrlFileVirtualPath();
 switch (pageFileName)
 {
      case "~/AboutUs.aspx":
           //do some stuff
           break;
      case "~/HowItWorks.aspx":
           //do some stuff
           break;
      case "~/Contact.aspx":
           //do some stuff
           break;
      default:
           break;
 }

如果我使用/howitworks url访问站点,则request.getfriendlyurlfilevirtualpath()将按预期返回“~/howitworks.aspx”。
在通过/howitworks和/ako访问funguje站点时,知道如何从request.getfriendlyurlfilevirtualpath()获取“~/howitworks.aspx”吗?

最佳答案

最后我提出了自己的解决办法。我为http请求创建了自己的扩展方法,该方法将虚拟文件路径返回到当前执行的页:

 using System.Web;
 using System.Web.Routing;
 using Microsoft.AspNet.FriendlyUrls;

 namespace Utils.Extensions
 {
      public static class HttpRequestExtensions
      {
          public static string GetFileVirtualPathFromFriendlyUrl(this HttpRequest request)
          {
             string ret = string.Empty;

             ret = request.GetFriendlyUrlFileVirtualPath();

             if (ret == string.Empty)
             {
               foreach (RouteBase r in RouteTable.Routes)
               {
                   if (r.GetType() == typeof(Route))
                   {
                       Route route = (Route)r;
                       if ("/" + route.Url == request.Path)
                       {
                           if (route.RouteHandler.GetType() == typeof(PageRouteHandler))
                           {
                               PageRouteHandler handler = (PageRouteHandler)route.RouteHandler;

                               ret = handler.VirtualPath;
                           }
                           break;
                       }
                   }
               }
             }

             return ret;
          }
     }
 }

10-07 14:17