検索 - c# 文字列 置換




ASP.NET WebForms:Request.GetFriendlyUrlFileVirtualPath()は空の文字列を返します (2)

ほんの数ページしかない単純なASP.NET WebFormsプロジェクトを手に入れました。私はSEOだけでなくURLのローカライゼーションにもフレンドリーなURLを使いたいと思います。 私はこのプロジェクトに.NET 4.5を使用し、Microsoft.AspNet.FriendlyUrls Nugetパッケージを使用しようとしましたが、これは役に立つかもしれません。 しかし、1つの問題があります。

私はGlobal.asaxに入っています:

    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(スロバキア語のロケール)の両方からアクセスすると、同じページを表示したいと思います。

そして今、私は実際の問題に近づいています。 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-to-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;
          }
     }
 }

確認してください

string requestUrl = this.Request.GetFriendlyUrlFileVirtualPath().ToLowerInvariant();
if (String.IsNullOrEmpty(requestUrl)) {
   requestUrl = this.Request.AppRelativeCurrentExecutionFilePath.ToLowerInvariant();
}




friendly-url