ASP.NET MVC – 舊形式URL的路由

來源:互聯網
上載者:User
文章目錄
  • Final Thoughts

原文地址:ASP.NET MVC - Legacy Url Routing
原文作者:matthaw

本文地址:ASP.NET MVC - 舊形式URL的路由
本文作者:Q.Lee.lulu

最近我們已經將大部分我們ASP.NET Web Form頁面轉換為使用ASP.NET MVC。當這個並不是一個小的工程的時候,使用一個新的URL結構並支援舊的URL是很有需要的。這個想法是,當你點擊一個不存在的頁面的時候,你會被定位到MVC裡面合適的Controller和Action中去。

流程

1. 一個來自你的網站的舊形式的URL請求.例如:http://www.server.com/Users/Login.aspx
2. ASP.NET routing 攔截這個請求並匹配你RouteCollection中的一個Route  
3. 並不是使用 MvcRouteHandler, 而是 LegacyRouteHandler 被調用.
4. 使用 LegacyRouteHandler, 它將會使用你指定的Route重新導向名來產生MVC URL,並發出一個定位到http://www.server.com/site/login的HTTP 301 請求.

Routing

首先,我們需要定義我們的舊版Route類。這是必需的,因為我們需要暴露一個額外的屬性來允許我們的routing處理器來找到正確的MVC route。

// 舊形式URL的route類,暴露一個RedirectActionNamepublic class LegacyRoute : Route {public LegacyRoute(string url, string redirectActionName, IRouteHandler routeHandler): base(url, routeHandler){RedirectActionName = redirectActionName;}public string RedirectActionName { get; set; }}

然後,我們需要定義route handler和關聯的http handler。Route handler繼承自IRouteHandler,而當建立你的舊形式URL routing的時候要使用這個類。Http handler繼承自MvcHandler,因為它會為我們提供一些關鍵的資訊,例如RequestContext。你也許會注意到你需要從request上copy所有的querystring參數(代碼中並沒有寫出來)。這是必需的一步,因為GetVirtualPath方法調用時會需要所有的route data(來自RouteData.Values)並嘗試利用它來建立URL。

// The legacy route handler, used for getting the HttpHandler for the request   public class LegacyRouteHandler : IRouteHandler{public IHttpHandler GetHttpHandler(RequestContext requestContext){return new LegacyHandler(requestContext)}}
// The legacy HttpHandler that handles the requestpublic class LegacyHandler : MvcHandler{public LegacyHandler(RequestContext requestContext) : base(requestContext) { }protected override void ProcessRequest(HttpContextBase httpContext){string redirectActionName = ((LegacyRoute)RequestContext.RouteData.Route).RedirectActionName;// ... copy all of the querystring parameters and put them within RouteContext.RouteData.ValuesVirtualPathData data = RouteTable.Routes.GetVirtualPath(RouteContext, redirectActionName, RouteContext.RouteData.Values);httpContext.Status = "301 Moved Permanently";httpContext.AppendHeader("Location", data.VirtualPath);}}

最後,你需要在Global.asax檔案中建立你的routes。記住,在配置routing的時候這是必需的一步。

public void RegisterRoutes(RouteCollection routes) {routes.MapRoute("Login", "site/login", new {controller = "Users",action = "DisplayLogin"});routes.Add("", new LegacyRoute("Users/Login.aspx","Login",new LegacyRouteHandler()));}

 

就是這樣。當一個請求來到的時候,你會在Fiddler中看到如下的資訊:

  1. A request on "Users/Login.aspx"
  2. A HTTP 301, with a header "Location" and value of "site/login"
  3. A request on "site/login"
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.