Url.Action生成旧路线与新路线

时间:2017-03-09 15:38:03

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

在ASP.NET MVC路由中,如果要支持旧版路由,可以添加如下内容:

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

这很好,但当我使用@Url.Action生成家庭控制器索引操作的链接时如下:

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

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

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

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

或者有没有办法为UrlHelper编写扩展来执行此操作?

1 个答案:

答案 0 :(得分: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() });
  

注意:以上解决方案并不是最好的解决方案。搜索引擎优化通常不止一个URL提供相同的内容。如果您使用上述解决方案,则应确保您的回复设置为canonical tag or header

     

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