маршрутизация устаревших ссылок asp.net в проекте asp.net mvc - PullRequest
7 голосов
/ 18 января 2010

У меня есть следующий URL, который я должен поддерживать в своем проекте asp.net mvc некоторое время.

http://www.example.com/d.aspx?did=1234

Мне нужно сопоставить это с этим URL.

http://www.example.com/Dispute/Detail/1234

Я уже посмотрел следующую информацию.

http://blog.eworldui.net/post/2008/04/ASPNET-MVC---Legacy-Url-Routing.aspx

Устаревшие URL-адреса маршрутизации ASP.Net MVC, передающие идентификаторы строки запроса в действия контроллера

Пытаясь следовать этому, я могу заставить первый URL работать, но затем все другие URL нарушаются. Кто-нибудь может увидеть, где я ошибся?

Вот мои маршруты.

    public static void RegisterRoutes(RouteCollection routes)
    {
        // all my other routes

        // Legacy routes
        routes.Add(
          "Legacy", 
          new LegacyRoute(
            "d.aspx", 
            "LegacyDirectDispute", 
            new LegacyRouteHandler())
        );

        routes.MapRoute(
          "LegacyDirectDispute", 
          "Dispute/Details/{id}",
          new { controller = "Dispute", action = "Details", id = "" }
        );

        routes.MapRoute(
          "Default",                                              // Route name
          "{controller}/{action}/{id}",                       // URL with parameters
          new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
        );
    }

Вот код в моем global.asax.cs, который я использую.

 public class LegacyRoute : Route
 {
  public string RedirectActionName { get; set; }
  public LegacyRoute(string url, string redirectActionName, IRouteHandler routeHandler)
   : base(url, routeHandler)
  {
   RedirectActionName = redirectActionName;
  }
 }

 // 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 request
 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)
   {
    if (key.Equals("did"))
    {
     requestContext.RouteData.Values.Add("id", queryString["did"]);
    }
    else
    {
     requestContext.RouteData.Values.Add(key, queryString[key]);
    }
   }

   VirtualPathData path = RouteTable.Routes.GetVirtualPath(requestContext, redirectActionName,
                 requestContext.RouteData.Values);

   if (path != null)
   {
    httpContext.Response.Status = "301 Moved Permanently";
    httpContext.Response.AppendHeader("Location", path.VirtualPath);
   }
  }
 }

Ответы [ 3 ]

4 голосов
/ 19 января 2010

Вы можете просто создать файл с именем d.aspx в корне вашего сайта с содержимым, подобным следующему:

<script runat="server">
protected void Page_Load(object sender, EventArgs e)
{
    Response.Redirect(string.Format("http://{0}/Dispute/Detail/{1}", Request.Url.Host, Request.QueryString.Get("did")));
}
</script>
2 голосов
/ 19 января 2010

Вот что я сделал, чтобы решить свою проблему, пока не увидел простой ответ @grenade. Я нашел эту технику здесь http://www.mikesdotnetting.com/Article/108/Handling-Legacy-URLs-with-ASP.NET-MVC.

public class LegacyUrlRoute : RouteBase
{
    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 = "";
        var id = request.QueryString.Count != 0 ? request.QueryString[0] : "";

        if (legacyUrl.Contains("d.aspx"))
        {
            newUrl = "Dispute/Details/" + id;
            response.Status = status;
            response.RedirectLocation = newUrl;
            response.End();
        }
        return null;
    }

    public override VirtualPathData GetVirtualPath(RequestContext requestContext,
                RouteValueDictionary values)
    {
        return null;
    }
}

public static void RegisterRoutes(RouteCollection routes)
{
    // all my other routes
    routes.Add(new LegacyUrlRoute());
}
0 голосов
/ 11 марта 2011

Как насчет добавления маршрута на страницу карты:

Routes.MapPageRoute(
            "Legacy", // Route name
            "d.aspx", // URL
            "~/pathfromBaseUrl/d.aspx" // File
            );

Затем, используя это в aspx / view

Html.RouteLink("MyLinkName", "Legacy")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...