【问题标题】:Url.Action generates old route vs new routeUrl.Action 生成旧路由与新路由
【发布时间】:2017-03-09 15:38:03
【问题描述】:

在 ASP.NET MVC 路由中,如果你想支持遗留路由,可以添加如下内容:

routes.MapRoute("SiteDefault", "Default.aspx",  
    new { controller = "Home", action = "Index" });

很好,但是当我使用@Url.Action 为 Home 控制器索引操作生成链接时,如下所示:

<a href="@Url.Action("Index", "Home")">Home</a>

生成的网址是/Default.aspx,而不是/Home。

如何让助手生成/Home 并仍然支持/Default.aspx 的路由映射?

我知道我可以创建物理 Default.aspx 文件并在其中进行永久重定向,但我试图避免添加不必要的文件。

或者有没有办法为UrlHelper 编写扩展来做到这一点?

【问题讨论】:

  • 为什么不将MapPageRoute 用于旧版网络表单文件? MapRoute 方法适用于 MVC 路由,因此适用于 MVC:routes.MapRoute("SiteDefault", "{controller}/{action}", new { controller = "Home", action = "Index" }); 和 webforms:routes.MapPageRoute("DefaultLegacy", "WebForm/Default", "~/WebForm/Default.aspx")

标签: asp.net-mvc url-rewriting routes url-routing asp.net-mvc-routing


【解决方案1】:

您可以通过创建仅匹配传入请求的路由约束来解决此问题。

public class IncomingOnlyConstraint : IRouteConstraint
{
    public bool Match(
        HttpContextBase httpContext, 
        Route route, 
        string parameterName, 
        RouteValueDictionary values, 
        RouteDirection routeDirection)
    {
        return routeDirection == RouteDirection.IncomingRequest;
    }
}

用法

routes.MapRoute("SiteDefault", "Default.aspx", 
    new { controller = "Home", action = "Index" }, 
    new { controller = new IncomingOnlyConstraint() });

注意:上述解决方案不是最好的解决方案。对 SEO 来说,让多个 URL 提供相同的内容通常是不好的。如果您使用上述解决方案,则应确保您的回复设置了canonical tag or header。

更好的解决方案是执行从旧 URL 到新 URL 的 301 重定向。您可以处理 directly through MVC (这将确保所有不尊重 301 响应的浏览器都具有更好的用户体验),或者您可以使用 IIS URL rewrite module 发出 301 重定向,从而将遗留代码整齐地保留在外部您的应用程序。

【讨论】:

  • 大量资源。我会看看哪个对我的情况最有意义。我知道我肯定不想重写模块。
猜你喜欢
  • 2017-10-07
  • 2011-10-12
  • 2013-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多