【问题标题】:How to ignore some route while using ASP.NET Friendly URLs?如何在使用 ASP.NET 友好 URL 时忽略某些路由?
【发布时间】:2014-10-17 02:54:38
【问题描述】:

我成功使用了 ASP.NET 友好 URL,但我需要忽略特定 Foo.aspx 页面的路由(因为此页面需要 POST 数据,并且一旦重新路由 POST 数据在 Page_Load() 中不再可用!)。

看起来使用 ASP.NET 友好 URL 会丢弃任何忽略路由的尝试。一旦使用了 ASP.NET 友好 URL 路由,即使是用于忽略路由的 MSDN example 也不起作用:

routes.Ignore("{*allaspx}", new {allaspx=@".*\.aspx(/.*)?"});

忽略到Foo.aspx 的路由,代码应该是这样的,不是吗?

routes.Ignore("{*fooaspx}", new { fooaspx = @"(.*/)?foo.aspx(/.*)?" });

Global.asax 代码如下所示:

public static void RegisterRoutes(RouteCollection routes) {

    // This doesn't work whether I put this code before or after ASP.NET Friendly URLs code.
    routes.Ignore("{*allaspx}", new { allaspx = @".*\.aspx(/.*)?" });

    routes.Canonicalize().Lowercase();

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

void Application_Start(object sender, EventArgs e) {
   RegisterRoutes(RouteTable.Routes);
}

这个问题has been asked on the ASP.NET Friendly URLs codeplex site,但没有得到答案。

感谢您对此的帮助:)

【问题讨论】:

  • 我的理解是如果存在物理文件,那么它优先(高于任何路由配置),那么为什么要“重新路由”/重定向?跨度>
  • ASP.NET 友好 URL 代码对所有存在的物理文件 .aspx 文件(包括 site\Foo.aspx)进行重定向工作。例如 url 'Site.com\Foo-Bar.aspx' 被重定向到 'site.com\foo-bar' 并且 Foo-Bar.aspx 文件存在。这怎么能解释 routes.Ignore() 不起作用?

标签: asp.net routes friendly-url


【解决方案1】:

这很有趣 - 不得不修补 :) 在我上面的评论中,我想说的是“无需忽略”。

我是“对的”和“错的”。

  • 对:不用理会
  • 错误:不是因为我所说的(回复:物理文件),而是一开始没有调用重定向

这会炸掉(会发生重定向,POST数据丢失):

<asp:Button ID="btn1" runat="server" Text="Go" PostBackUrl="~/Target.aspx" />

这会很好(你会得到 POST 数据,不会发生重定向):

 <asp:Button ID="btn1" runat="server" Text="Go" PostBackUrl="~/Target" />

区别?我要求 FriendlyUrls 在第二个选项中“重新路由”任何内容。在第一个选项中,我要求一个“aspx”文件,因此 FriendlU​​rls 将尽职尽责地完成其存在和“处理”它的目的(并永久重定向到一个“友好 url”,它是一个 GET 并且一切顺利POST 数据)。

  • 在第一个选项中检查请求 (target.aspx):
  • 在第二个选项中检查请求(无扩展,目标):

这是一条线索:

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

它会执行它所说的“永久重定向”(到“友好的 url”)......当“必要”时(如果请求“aspx”文件)。您可以在 WebForms 站点中的任何页面上进行修改

  • 如果您请求foo.aspx,您将看到重定向(到foo
  • 如果您请求foo,则无需重定向

你也可以注释掉

settings.AutoRedirectMode = RedirectMode.Permanent;

一切都会奏效,但有点违背 FriendlyUrls 的目的......

仔细想想,这很有意义。没有必要对每个请求进行“重定向”(对于性能来说太糟糕了),而仅在必要时/在必要时...

第……

【讨论】:

  • 谢谢!您的解决方案将是一个不错的 B 计划。回发到 Site.com\Foo.aspx 的源现在具有硬编码的 url。我们可以将源 URL 更改为 Site.com\Foo,但这需要付出代价。仍然为什么 route.Ignore() 不起作用?是否有另一种重定向选择?我还尝试将 Foo.aspx 重定向到 Web.config\system.webServer\rewrite\rules 中的 Foo,但没有成功,POST 数据也会在这里丢失。
  • 忽略路由不起作用,因为我们的重定向逻辑发生在 HTTP 模块中,而不是路由本身。这样我们就可以处理默认文档的重定向(例如 Default.aspx)。至于忽略特定路径,如果您从 WebFormsFriendlyUrlResolver 派生并自定义并覆盖一些方法,使它们在路径匹配您想要忽略的内容时变为无操作,则这可能是可能的。然后将一个实例传递给接受 IFriendlyUrlResolver 作为参数的 EnableFriendlyUrls 的重载。
【解决方案2】:

感谢 Damian Edwards 的评论,我完全解决了这个问题,感谢 Damian。

我只需要从 WebFormsFriendlyUrlResolver 派生来覆盖方法 ConvertToFriendlyUrl() 以使其在 url 与我不想重定向的 url 匹配时变为无操作:

using Microsoft.AspNet.FriendlyUrls.Resolvers;

public class MyWebFormsFriendlyUrlResolver : WebFormsFriendlyUrlResolver {
   public MyWebFormsFriendlyUrlResolver() { }

   public override string ConvertToFriendlyUrl(string path) {
      if (!string.IsNullOrEmpty(path)) {
         if (path.ToLower().Contains("foo")) { // Here the filter code
            return path;
         }
      }
      return base.ConvertToFriendlyUrl(path);
   }
}

然后在Global.asax 中的代码现在看起来像:

public static void RegisterRoutes(RouteCollection routes) {
    routes.Canonicalize().Lowercase();
    var settings = new FriendlyUrlSettings();
    settings.AutoRedirectMode = RedirectMode.Permanent;
    routes.EnableFriendlyUrls(settings, 
                              new IFriendlyUrlResolver[] { 
                                 new MyWebFormsFriendlyUrlResolver() });
}

void Application_Start(object sender, EventArgs e) {
   RegisterRoutes(RouteTable.Routes);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-06
    • 2013-09-03
    • 1970-01-01
    • 2010-09-21
    • 2015-05-01
    • 2010-09-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多