2010-08-27 29 views
5

Làm thế nào để tôi lập bản đồ nhiều của url với hành động tương tự trong asp.net MVCASP.NET MVC nhiều url với cùng hành động

tôi có:

string url1 = "Help/Me"; 
string url2 = "Help/Me/Now"; 
string url3 = "Help/Polemus"; 
string url1 = "Help/Polemus/Tomorow"; 

Trong global.asax.cs của tôi nộp tôi muốn để ánh xạ tất cả những url với hành động sau đây:

public class PageController : Controller 
{ 
    [HttpGet] 
    public ActionResult Index() 
    { 
     return View(); 
    } 
} 
+0

Vì vậy, bất cứ điều gì về chiến lược đều giúp ích cho PageController? – Nix

+0

nhiều hơn trong các dòng ... tôi có một danh sách các url ngẫu nhiên, và tất cả các url ngẫu nhiên phải ánh xạ tới PageController. Lưu ý rằng danh sách đã được xác định ... vì vậy tôi về cơ bản cần lặp qua danh sách và ánh xạ từng url trong danh sách đó đến trang điều khiển –

Trả lời

6

Thêm dòng sau vào bảng định tuyến của bạn:

routes.MapRoute("RouteName", "Help/{Thing}/{OtherThing}", new { controller = "Page" }); 

EDIT:

foreach(string url in urls) 
    routes.MapRoute("RouteName-" + url, url, new { controller = "Page", action = "Index" }); 
+0

điều này gần như chính xác như những gì tôi có ... tôi đã thử ví dụ thứ hai của bạn, tuy nhiên, khi điều hướng đến url đó, tôi nhận được lỗi "tài nguyên không thể tìm thấy" và tôi có liên kết "\ Views \ Page \ Index. –

+0

Hãy thử chỉnh sửa của tôi (Tôi quên tên hành động) – SLaks

+0

hehe, với bản chỉnh sửa, bây giờ chính xác giống như lần thử đầu tiên của tôi :) –

3

Bạn chỉ có thể thêm các tuyến đường vào bảng định tuyến của bạn khi bạn cần đến chúng, giống như bất kỳ con đường khác. Chỉ cần cung cấp cho họ các tên duy nhất, URL được mã hóa cứng và trỏ chúng đến cùng một bộ điều khiển/hành động. Nó sẽ hoạt động tốt.

Nếu bạn sử dụng đối sánh mẫu thay vì URL được mã hóa cứng chỉ cần đảm bảo bạn có được tất cả các tuyến đường của mình theo đúng thứ tự sao cho đúng thứ tự được chọn từ danh sách. Vì vậy,/Help/Me sẽ xuất hiện trước/Help/{Page} nếu con đường được mã hóa cứng đi đến một trang khác với mẫu phù hợp. Nếu bạn đặt/help/{page} trong tab tabel thứ nhất, điều này sẽ khớp với/help/me và hành động được đặt tên mã hóa cứng của bạn cho tuyến đường đó sẽ không bao giờ kích hoạt.

Một lưu ý phụ, nếu đây là trang web công khai và SEO quan trọng, hãy cẩn thận nếu bạn có nhiều URL trả về cùng một dữ liệu, nó sẽ được gắn cờ là trùng lặp. Nếu trường hợp này xảy ra, thì hãy sử dụng thẻ Canonical, điều này sẽ cung cấp cho tất cả các thứ hạng trang từ tất cả các URL đi tới trang đó đến trang bạn đặt tên và loại bỏ vấn đề nội dung trùng lặp cho bạn.

4

Trong trường hợp của tôi, tôi đang tìm cách đơn giản kết hợp hai tuyến đường 'mã hóa cứng' thành một và vấp ngã khi đăng bài này. Tôi muốn làm sạch RouteConfig.cs một chút - bởi vì nó có rất nhiều tuyến đường tương tự.

tôi đã kết thúc bằng một số đơn giản 'hoặc' logic trong một biểu thức chính quy và về cơ bản đã thay đổi:

routes.MapRoute(
    "UniqueHomePage", 
    "Default", 
    new { controller = "Redirector", action = "RedirectToRoot" } 
); 

routes.MapRoute(
    "UniqueHomePage2", 
    "Home", 
    new { controller = "Redirector", action = "RedirectToRoot" } 
); 

Into một con đường duy nhất:

routes.MapRoute(
    "UniqueHomePageGeneric", 
    "{url}", 
     new { controller = "Redirector", action = "RedirectToRoot" }, 
     new { url = "Home|Default" } 
); 

Lưu ý cho SEO-savy hoặc -interested : Lý do để trỏ nhiều URL đến một và cùng một hành động, sau đó chuyển hướng chúng đến một và cùng một trang một lần nữa. Trong trường hợp này là trang chủ. Vì vậy, ý tưởng là để ngăn chặn các vấn đề nội dung trùng lặp. Khi bạn sử dụng phương pháp này để trỏ cho NON chuyển hướng hành động, nhưng hành động hiển thị quan điểm riêng của họ, sau đó bạn có thể gây ra vấn đề nội dung trùng lặp: P.

17

Bây giờ trong MVC 5, điều này có thể đạt được bằng cách sử dụng Thuộc tính tuyến đường.

[Route("Help"/"Me")] 
[Route("Help/Me/Now")] 
[Route("Help/Polemus")] 
[Route("Help/Polemus/Tomorow")] 
public ActionResult Index() 
{ 
    return View(); 
} 
+1

Nếu bạn Sau này, nếu bạn đang tự hỏi làm thế nào để xác định _wh 1_ của nhiều tuyến đường đưa bạn vào phương pháp hành động này, bạn có thể sử dụng 'ControllerContext.RouteData' và so sánh các URL , [như đã giải thích rõ ràng trong câu trả lời stackoverflow khác] (http://stackoverflow.com/a/39626076/325521) – Shiva

+3

Để có được thuộc tính route hoạt động, bạn cũng cần thêm "rout es.MapMvcAttributeRoutes(); "trong tệp RouteConfig.cs của bạn trước bất kỳ tuyến nào khác. [MSDN Blog Post] (https://blogs.msdn.microsoft.com/webdev/2013/10/17/attribute-routing-in-asp-net-mvc-5/) – joeshmoe301

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