在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
编写扩展来执行此操作?
答案 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重定向,将遗留代码整齐地保存在应用程序之外。