如何在使用ASP.NET友好URL时忽略某些路由?

时间:2014-08-23 10:08:44

标签: asp.net routes friendly-url

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

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

Page_Load()

要忽略到routes.Ignore("{*allaspx}", new {allaspx=@".*\.aspx(/.*)?"}); 的路由,代码看起来应该是这样,不是吗?

Foo.aspx

routes.Ignore("{*fooaspx}", new { fooaspx = @"(.*/)?foo.aspx(/.*)?" }); 代码如下:

Global.asax

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

感谢您的帮助:)

2 个答案:

答案 0 :(得分:10)

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

我只需要从WebFormsFriendlyUrlResolver派生以覆盖方法ConvertToFriendlyUrl(),当网址与我不想重定向的网址匹配时,将其设为no-op:

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);
}

答案 1 :(得分:3)

这很有趣 - 不得不修补:)在上面的评论中,我想说的是"不需要忽视"。

我是"对"和"错误"。

  • 右:无需忽略
  • 错误:不是因为我说的(re:物理文件),而是没有首先调用重定向

这将弹出(重定向将发生,POST数据丢失):

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

这样会很好(您将获得POST数据,不会发生重定向):

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

区别?我要求FriendlyUrls重新路由&#34;第二个选项中的任何内容。在第一个选项中,我要求&#34; aspx&#34;文件,所以FriendlU​​rls将尽职尽责地做到和处理&#34;它(并永久重定向到&#34;友好网址&#34;这是一个GET,并且有所有POSTed数据)。

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

这是一个线索:

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

它完成它所说的,&#34;做永久重定向&#34; (对于&#34;友好的网址&#34;)...当&#34;必要&#34; (如果请求&#34; aspx&#34;文件)。您可以使用WebForms站点中的任何页面修改它

  • 如果您请求foo.aspx,您会看到重定向(至foo
  • 如果您请求foo,请不要重定向

你也可以注释掉

settings.AutoRedirectMode = RedirectMode.Permanent;

并且事情会起作用,但有点会破坏FriendlyUrls的目的......

考虑一下,这很有道理。没有必要重定向&#34;在每个请求(对于性能而言),而不仅仅是在必要时...

H个....