2011-02-11 58 views
0

我已经升级了一个旧的php站点到asp.net MVC,我想处理所有的遗留URL。我不需要它们映射到当前页面,因为内容全是新的,但是我确实想要捕获.php页面的所有请求并将它们发送到主页(理想情况下为搜索引擎进行永久重定向)。在MVC中处理任何级别的传统url

这工作,但只有在根级:

routes.MapRoute(
      "LegacySite",             // Route name 
      "{OldPage}.php",       // URL with parameters 
      new { controller = "Home", action = "index" }, // Parameter defaults 
      new string[] { "EatIn.Website.Controllers" } 
     ); 

我想所有.PHP页面,无论他们是在文件夹的

+0

威廉,很高兴这个工作对你 - 感谢“锣”;) – 2011-02-18 12:47:52

回答

4

威廉,

我有在旧的mvc 1网站中也有类似的情况。但是,逻辑可能仍然适合。我有一些已知的页面和各种未知的页面来处理。在那个时候,我处理了它在动作用,而cludgy方法详述如下:

public ActionResult Index() 
{ 
    string routeval = (string)this.RouteData.Values["file"]; 
    var dicT = new Dictionary<string, int>(); 
    // oh deary me - hardcoded values 
    dicT.Add("algarve", 1); 
    dicT.Add("brazil", 5); 
    dicT.Add("colorado", 4); 
    dicT.Add("morocco", 2); 
    dicT.Add("thailand", 6); 
    // what, no test for culture/case :-) 
    if (dicT.ContainsKey(routeval)) 
    { 
     var routeData = new RouteValueDictionary(
      new 
      { 
       controller = "Property", 
       action = "Details", 
       id = dicT[routeval], 
       Lang = "en" 
      }); 
     return RedirectToAction("Details", "Property", routeData); 
    } 
    else 
    { 
     return View(); 
    } 
} 

[编辑] - 发现信息的这一另一个“有用”位从旧MVC1应用。您可以添加以下到您的基本控制器:

public class LegacyUrlRoute : RouteBase 
{ 
    // source: http://www.mikesdotnetting.com/Article/108/Handling-Legacy-URLs-with-ASP.NET-MVC 
    public override RouteData GetRouteData(HttpContextBase httpContext) 
    { 
     const string status = "301 Moved Permanently"; 
     var request = httpContext.Request; 
     var response = httpContext.Response; 
     var legacyUrl = request.Url.ToString(); 
     var newUrl = ""; 

     if (legacyUrl.Contains("/villas/") || legacyUrl.EndsWith("asp")) 
     { 
      if (legacyUrl.Contains("/villas/")) 
       newUrl = "/en/home/Destinations"; 
      else if (legacyUrl.EndsWith("asp")) 
      { 
       newUrl = "/en/home/index"; 
       if (legacyUrl.Contains("about")) 
        newUrl = "/en/home/AboutUs"; 
       if (legacyUrl.Contains("offers")) 
        newUrl = "/en/home/Offers"; 
       if (legacyUrl.Contains("contact")) 
        newUrl = "/en/home/ContactUs"; 
       if (legacyUrl.Contains("destinations")) 
        newUrl = "/en/home/destinations"; 
       if (legacyUrl.Contains("faq")) 
        newUrl = "/en/home/Faq"; 
       if (legacyUrl.Contains("terms")) 
        newUrl = "/en/home/Terms"; 
       if (legacyUrl.Contains("privacy")) 
        newUrl = "/en/home/Privacy"; 
      } 

      response.Status = status; 
      response.RedirectLocation = newUrl; 
      response.End(); 
     } 
     return null; 
    } 
    public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values) 
    { 
     return null; 
    } 
} 

,然后换上新的路线在Global.asax文件:

routes.Add(new LegacyUrlRoute()); 

基本上,我“知道”,我一直在寻找一个途径值包含'文件'的参数沿www.url.com/somepage.asp?file=algarve等行(这是如何旧的ASP经典网站的工作,我知道现在没有这个)。对于我想重定向的“已知”路线,我使用了RedirectToAction的逻辑,其他所有内容都是通过默认的Index() View()进行的。

正如我所说,cludgy,而不是我现在要做的(大约2。5年后),但它是一个例子,我'漂浮在',它实际上工作! :d

好运