2012-07-17 28 views
5

Dưới đây là tuyến đường mặc định của tôi:MVC chuyển hướng để mặc định đường

routes.MapRouteLowercase(
       "Default", 
       "{country}/{controller}/{action}/{id}", 
       new { 
        country = "uk", 
        controller = "Home", 
        action = "Index", 
        id = UrlParameter.Optional 
       }, 
       new[] { "Presentation.Controllers" } 
       ); 

Như chúng ta đã biết, khi ai đó truy cập www.domain.com/ định tuyến MVC sẽ xác định bộ điều khiển mặc định và hành động để thực hiện dựa trên các tuyến đường trên, nhưng URL sẽ vẫn giữ nguyên. Có cách xây dựng hoặc thanh lịch để thực hiện chuyển hướng 301 từ www.domain.com/ đến www.domain.com/uk/{controller}/{action}/ cho mọi tuyến đường sử dụng giá trị mặc định không?

+0

Bạn có thể thực hiện chuyển hướng từ trình điều khiển mặc định của mình, ví dụ: index action – codingbiz

Trả lời

14

Tôi đã tạo trình xử lý tuyến đường tùy chỉnh thực hiện chuyển hướng ở cấp tuyến đường. Cảm ơn Phil Haack.

Đây là công việc hoàn chỉnh.

handler đường Redirect

public class RedirectRouteHandler : IRouteHandler 
{ 
    private string _redirectUrl; 

    public RedirectRouteHandler(string redirectUrl) 
    { 
     _redirectUrl = redirectUrl; 
    } 

    public IHttpHandler GetHttpHandler(RequestContext requestContext) 
    { 
     if (_redirectUrl.StartsWith("~/")) 
     { 
      string virtualPath = _redirectUrl.Substring(2); 
      Route route = new Route(virtualPath, null); 
      var vpd = route.GetVirtualPath(requestContext, 
       requestContext.RouteData.Values); 
      if (vpd != null) 
      { 
       _redirectUrl = "~/" + vpd.VirtualPath; 
      } 
     } 

     return new RedirectHandler(_redirectUrl, false); 
    } 
} 

Redirect handler http

public class RedirectHandler : IHttpHandler 
{ 
    private readonly string _redirectUrl; 

    public RedirectHandler(string redirectUrl, bool isReusable) 
    { 
     _redirectUrl = redirectUrl; 
     IsReusable = isReusable; 
    } 

    public bool IsReusable { get; private set; } 

    public void ProcessRequest(HttpContext context) 
    { 
     context.Response.Status = "301 Moved Permanently"; 
     context.Response.StatusCode = 301; 
     context.Response.AddHeader("Location", _redirectUrl); 
    } 
} 

Route mở rộng

public static class RouteExtensions 
{ 
    public static void Redirect(this RouteCollection routes, string url, string redirectUrl) 
    { 
     routes.Add(new Route(url, new RedirectRouteHandler(redirectUrl))); 
    } 
} 

Có tất cả những điều này, tôi có thể làm một cái gì đó như thế này trong khi ánh xạ các tuyến đường trong Global.asax.cs.

routes.Redirect("", "/uk/Home/Index"); 

routes.Redirect("uk", "/uk/Home/Index"); 

routes.Redirect("uk/Home", "/uk/Home/Index"); 

.. other routes 
+0

Rất kỹ lưỡng, cảm ơn bạn :) – Spikeh

+1

Các tuyến đường nên đi trước khi tất cả các tuyến đường khác (ví dụ MapRoute)? Điều này có làm việc cho định tuyến trang .aspx cũ không? foo.aspx ->/foo – Seth

6

Trong các dự án của mình, tôi thường có "IndexRedirect" làm hành động mặc định trong tuyến đường của tôi (URL của nó sẽ không bao giờ được hiển thị) mà không chuyển hướng đến trang chỉ mục "thực" (URL của nó sẽ luôn hiển thị).

Bạn có thể tạo hành động này trong một lớp cơ sở của tất cả các lớp điều khiển của bạn.

+0

Đây là giải pháp tốt nhất! – MEMark

+0

Một ý tưởng mới lạ, ước gì tôi đã tự nghĩ về điều đó! – melodiouscode

Các vấn đề liên quan