2009-09-06 42 views
28

Tôi có một vấn đề nhỏ ở đây. Tôi cần thêm dấu gạch chéo ở cuối mỗi url trong trang web mà tôi đang làm việc. Tôi định nghĩa tất cả các liên kết bên trong các trang web để có một dấu gạch chéo như vậy:
Thêm dấu gạch chéo ở cuối mỗi url?

<a href="/register/">Register</a> 

Trong khi điều này hoạt động tốt vẫn còn một vấn đề nhỏ: đó là với các url tạo đến từ gọi RedirectToAction(). Ví dụ:

return RedirectToAction("Register", "Users"); 

Sẽ làm cho url thay đổi/đăng ký không có dấu gạch chéo. Tôi đã sửa đổi hệ thống định tuyến của mình như sau:

routes.MapRoute("register", 
         "register/", 
         new {controller = "Users", action = "Register"} 
      ); 

Vẫn còn dấu gạch chéo theo yêu cầu không được thêm tự động!
Tôi đã tra cứu số questionquestion nhưng chúng hoàn toàn khác vì tôi không sử dụng bất kỳ thư viện viết lại url nào, tôi chỉ sử dụng hệ thống định tuyến asp.net mvc.
Vì vậy, bạn nói gì?

+0

Đối với bất kỳ ai quan tâm đến cách làm điều này cho ASP.NET Core sử dụng 'services.Configure (routeOptions => {routeOptions.AppendTrailingSlash = true;};' nơi 'services' là một 'IServiceCollection' – Galilyou

Trả lời

46

Lớp RouteCollection bây giờ có một boolean AppendTrailingSlash mà bạn có thể đặt thành true cho hành vi này.

+0

Cảm ơn rất nhiều. Đây là giải pháp tốt nhất cho tôi. – Stuart

+1

Đánh dấu câu trả lời này là chính xác, vui lòng –

+0

Không, không hoạt động với MVC4. – RoninCoder

21

Bạn có thể tạo Tuyến đường mới ghi đè phương thức GetVirtualPath. Trong phương pháp này, bạn thêm dấu gạch chéo vào VirtualPath. Như thế này:

public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values) 
{ 
    VirtualPathData path = base.GetVirtualPath(requestContext, values); 

    if (path != null) 
     path.VirtualPath = path.VirtualPath + "/"; 
    return path; 
} 

Đối với ngắn gọn tôi đăng các whole example on CodePaste.net

Bây giờ tất cả các bạn phải làm là đăng ký các tuyến đường với routes.MapRouteTrailingSlash() thay vì routes.MapRoute().

routes.MapRouteTrailingSlash("register", 
          "register", 
          new {controller = "Users", action = "Register"} 
); 

Tuyến đường sau đó sẽ thêm dấu gạch chéo vào đường dẫn khi số GetVirtualPath() được gọi. Mà RedirectToAction() sẽ làm.

Cập nhật: Bởi vì vào liên kết CodePaste là xuống, đây là mã đầy đủ:

public class TrailingSlashRoute : Route { 
    public TrailingSlashRoute(string url, IRouteHandler routeHandler) 
     : base(url, routeHandler) {} 

    public TrailingSlashRoute(string url, RouteValueDictionary defaults, IRouteHandler routeHandler) 
     : base(url, defaults, routeHandler) {} 

    public TrailingSlashRoute(string url, RouteValueDictionary defaults, RouteValueDictionary constraints, 
          IRouteHandler routeHandler) 
     : base(url, defaults, constraints, routeHandler) {} 

    public TrailingSlashRoute(string url, RouteValueDictionary defaults, RouteValueDictionary constraints, 
          RouteValueDictionary dataTokens, IRouteHandler routeHandler) 
     : base(url, defaults, constraints, dataTokens, routeHandler) {} 

    public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values) { 
     VirtualPathData path = base.GetVirtualPath(requestContext, values); 

     if (path != null) 
      path.VirtualPath = path.VirtualPath + "/"; 
     return path; 
    } 
} 

public static class RouteCollectionExtensions { 
    public static void MapRouteTrailingSlash(this RouteCollection routes, string name, string url, object defaults) { 
     routes.MapRouteTrailingSlash(name, url, defaults, null); 
    } 

    public static void MapRouteTrailingSlash(this RouteCollection routes, string name, string url, object defaults, 
             object constraints) { 
     if (routes == null) 
      throw new ArgumentNullException("routes"); 

     if (url == null) 
      throw new ArgumentNullException("url"); 

     var route = new TrailingSlashRoute(url, new MvcRouteHandler()) 
        { 
         Defaults = new RouteValueDictionary(defaults), 
         Constraints = new RouteValueDictionary(constraints) 
        }; 

     if (String.IsNullOrEmpty(name)) 
      routes.Add(route); 
     else 
      routes.Add(name, route); 
    } 
} 
+0

Cảm ơn Manticore , sẽ kiểm tra – Galilyou

+0

CodePaste.net Liên kết bị hỏng – John

+0

Tôi thực sự muốn xem toàn bộ mã ví dụ mà bạn đề cập đến. Thật không may là liên kết của bạn bị hỏng: (Bất kỳ cơ hội nào bạn có thể cung cấp liên kết thay thế để tôi có thể xem mã ví dụ của bạn?) – marcusstarnes

5

giải pháp sạch Nice, codingbug !!

Chỉ vấn đề tôi gặp phải là dấu gạch chéo kép cho trang chủ trong MVC3.

Razor dụ:

@Html.ActionLink("Home", "Index", "Home") 

Liên kết với:
http://mysite.com//

Để sửa lỗi này tôi chỉnh ghi đè GetVirtualPath:

public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values) 
{  
    VirtualPathData path = base.GetVirtualPath(requestContext, values);  

    if (path != null && path.VirtualPath != "")  
     path.VirtualPath = path.VirtualPath + "/";  
    return path;  
} 
3

Các giải pháp trên bằng cách codingbug là rất tốt đẹp. Tôi cần một cái gì đó rất simular, nhưng chỉ cho URL gốc của tôi. Tôi biết có thể có vấn đề với điều này, nhưng đây là những gì tôi đã làm. Dường như nó hoạt động tốt trong mọi môi trường của tôi. Tôi nghĩ rằng nó hoạt động quá, bởi vì nó chỉ là trang chủ của chúng tôi khi họ lần đầu tiên đến và không có slash đào tạo. Đó là trường hợp tôi đang cố gắng tránh. Nếu đó là những gì bạn muốn tránh, điều này sẽ làm việc cho bạn.

public class HomeController : Controller 
    { 
    public ActionResult Index() 
    { 
     if (!Request.RawUrl.Contains("Index") && !Request.RawUrl.EndsWith("/")) 
     return RedirectToAction("Index", "Home", new { Area = "" }); 

Nếu hóa ra tôi cần phải rám nắng hơn. Tôi có thể sẽ sử dụng mã mà mã hóa được cung cấp. Cho đến lúc đó, tôi muốn giữ nó đơn giản.

Lưu ý: Tôi đang tính vào Home \ Index sẽ bị công cụ định tuyến xóa khỏi URL.

1

Tôi biết có nhiều câu trả lời được tán thành hơn, nhưng câu trả lời bình chọn tốt nhất không phù hợp với trường hợp của tôi. Tôi cần nói rằng tôi đã tìm thấy một giải pháp dễ dàng hơn nhiều.

routes.MapRoute(
       name: "Default", 
       url: "{controller}/{action}/{id}/", <-- trailing slash here 
       defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
      ); 

Điều này sẽ hoạt động như dấu gạch chéo "/" trong tất cả các trường hợp.

+1

Không, nó sẽ không. Nếu làm theo cách này và sau đó bạn tạo ra url bằng cách sử dụng RouteUrl ("{tên của một tuyến đường"}, mới RouteValueDictionary ({parameters})), dấu gạch chéo sau được cắt bỏ. – Przemo

0

Có một số câu trả lời thực sự tốt nhưng đây là một số mã điều khiển MVC về cách tôi thực hiện nó trong một nhận rất đơn giản.

public ActionResult Orders() 
    { 
     if (!Request.Path.EndsWith("/")) 
     { 
      return RedirectPermanent(Request.Url.ToString() + "/"); 
     } 
     return View(); 
    } 

Hy vọng điều này sẽ giúp ai đó.

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