ASP.NET WebForms:Request.GetFriendlyUrlFileVirtualPath() 返回空字符串

Posted

技术标签:

【中文标题】ASP.NET WebForms:Request.GetFriendlyUrlFileVirtualPath() 返回空字符串【英文标题】:ASP.NET WebForms: Request.GetFriendlyUrlFileVirtualPath() returns empty string 【发布时间】:2013-09-05 23:00:00 【问题描述】:

我有一个只有几页的简单 ASP.NET WebForms 项目,我想使用友好的 URL(不仅用于 SEO,还用于 URL 的本地化)。我在这个项目中使用 .NET 4.5 并尝试使用 Microsoft.AspNet.FriendlyUrls nuget 包,看起来它可能会有所帮助。但是有一个问题。

我在 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(斯洛伐克语言环境)访问它,我想显示相同的页面。

现在我正在接近实际问题。当我使用本地化路线之一(例如/ako-to-funguje)访问站点时,Request.GetFriendlyUrlFileVirtualPath() 返回空字符串(但我想获得“~/HowItWorks.aspx”,我想在 master 中做一些事情页)。

 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”吗?

【问题讨论】:

【参考方案1】:

最后,我想出了解决此问题的方法。我为 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;
          
     
 

【讨论】:

谢谢Petriq,这是一个很好的解决方案。几天来,我一直在尝试找到解决类似问题的方法(请参阅***.com/q/22577826/236860),并且效果很好。 如果您在 url 中有参数或使用虚拟目录,这将不起作用【参考方案2】:

请确认

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

【讨论】:

【参考方案3】:

我更新了 Petriq 的答案以处理 url 中的参数

public static string GetFileVirtualPathFromFriendlyUrl(this HttpRequest request) 
        string ret = request.GetFriendlyUrlFileVirtualPath();

        if (ret == string.Empty) 
            for(int j = 0, a = RouteTable.Routes.Count; j<a;j++) 
                RouteBase r = RouteTable.Routes[j];
                if (r.GetType() == typeof(Route)) 
                    Route route = (Route)r;

                    StringBuilder newroute = new StringBuilder(route.Url);
                    if (route.Defaults != null && route.Defaults.Count > 1) 
                        string[] keys = route.Defaults.Select(x => x.Key).ToArray();
                        foreach (string k in keys)  
                            newroute = newroute.Replace("" + k + "", k.CheckQueryString()); 
                        
                    

                    if (String.Compare(newroute.ToString(), request.Path.Replace(request.ApplicationPath, ""), true) == 0) 
                        if (route.RouteHandler.GetType() == typeof(PageRouteHandler)) 
                            PageRouteHandler handler = (PageRouteHandler)route.RouteHandler;
                            return handler.VirtualPath;
                        
                    
                
            
        

        return ret;
    

路线现在可以是

RouteValueDictionary contactDefault = new RouteValueDictionary   "person", UrlParameter.Optional  ;

routes.MapPageRoute("Contact", "kontakt/person", "~/Contact.aspx");

【讨论】:

以上是关于ASP.NET WebForms:Request.GetFriendlyUrlFileVirtualPath() 返回空字符串的主要内容,如果未能解决你的问题,请参考以下文章

从 ASP.NET WebForms 迁移到 ASP.NET MVC 的建议?

将 ASP.Net MVC 与 WebForms 相结合

下周要搞大事情(ASP.NET Core & WebForms)!

Asp.net WebForms 概述

ASP.NET WebForms FriendlyUrlSegments 不包含采用 0 个参数的构造函数

在 ASP.NET 4.5 WebForms 中通过 bundle.config 与 BundleConfig.cs 捆绑资源