Per*_*ian 4 asp.net-mvc iis-7 asp.net-mvc-routing
我们目前正在IIS6上运行,但希望尽快转移到IIS 7.
我们正在将现有的Web表单站点移动到ASP.Net MVC.我们有很多传统页面需要重定向到新控制器.我看到这篇看起来很有趣的文章:http: //blog.eworldui.net/post/2008/04/ASPNET-MVC---Legacy-Url-Routing.aspx
所以我想我可以编写自己的路由处理程序,或者在控制器中进行重定向.后者略微闻起来.
但是,我不太确定如何处理遗留URL中的查询字符串值,理想情况下我需要传递给我的控制器的Show()方法.例如:
旧版网址:
/Artists/ViewArtist.aspx?Id=4589
我想要这个映射到:
ArtistsController显示动作
实际上我的Show动作采用了艺术家的名字,所以我确实希望将用户从Legacy URL重定向到/ artists/Madonna
谢谢!
小智 6
根据您提到的文章,这些是完成此任务的步骤:
1 - 你的LegacyHandler必须从查询字符串中提取路由值(在这种情况下,它是艺术家的id),这里是执行此操作的代码:
public class LegacyHandler:MvcHandler
{
private RequestContext requestContext;
public LegacyHandler(RequestContext requestContext) : base(requestContext)
{
this.requestContext = requestContext;
}
protected override void ProcessRequest(HttpContextBase httpContext)
{
string redirectActionName = ((LegacyRoute) RequestContext.RouteData.Route).RedirectActionName;
var queryString = requestContext.HttpContext.Request.QueryString;
foreach (var key in queryString.AllKeys)
{
requestContext.RouteData.Values.Add(key, queryString[key]);
}
VirtualPathData path = RouteTable.Routes.GetVirtualPath(requestContext, redirectActionName,
requestContext.RouteData.Values);
httpContext.Response.Status = "301 Moved Permanently";
httpContext.Response.AppendHeader("Location", path.VirtualPath);
}
}
Run Code Online (Sandbox Code Playgroud)
2-你必须将这两个路由添加到RouteTable,在那里你有一个带有ViewArtist动作的ArtistController接受一个int类型的id参数
routes.Add("Legacy", new LegacyRoute("Artists/ViewArtist.aspx", "Artist", new LegacyRouteHandler()));
routes.MapRoute("Artist", "Artist/ViewArtist/{id}", new
{
controller = "Artist",
action = "ViewArtist",
});
Run Code Online (Sandbox Code Playgroud)
现在您可以导航到以下网址:/Artists/ViewArtist.aspx?id=123
并且您将被重定向到:/ Artist/ViewArtist/123
| 归档时间: |
|
| 查看次数: |
5260 次 |
| 最近记录: |