2010-08-27 24 views
5

如何將多個URL的相同的動作映射在asp.net mvc的ASP.NET MVC多個網址指向同樣的動作

我:

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

在我的global.asax.cs文件我想所有這些URL映射到了以下行動:

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

那麼,策略什麼幫助去PageController? – Nix 2010-08-27 12:38:45

+0

更多的行...我有一個隨機的URL列表,並且所有隨機的URL必須映射到PageController。請注意,列表已經定義...所以我基本上需要通過列表循環,並將該列表中的每個URL映射到頁面控制器 – 2010-08-27 12:40:39

回答

6

以下行添加到您的路由表:

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

編輯

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

這幾乎完全與我所擁有的一樣......但是,我嘗試了第二個示例,當導航到該網址我得到一個「資源無法找到」的錯誤,我確實有相關的\視圖\網頁\索引。aspx「view。 – 2010-08-27 12:49:15

+0

嘗試我的編輯。(我忘了動作名稱) – SLaks 2010-08-27 13:00:16

+0

呵呵,編輯,現在和我最初的嘗試一模一樣:) – 2010-08-27 13:01:49

3

你可以只添加路由到您的路由表,你需要他們,與任何其他途徑。只要給他們獨特的名字,硬編碼的URL並指向相同的控制器/操作。它會正常工作。

如果您使用模式匹配而不是硬編碼的URL,請確保您按照正確的順序獲取所有路由,以便從列表中選擇正確的路由。所以/ Help/Me應該出現在/ Help/{Page}之前,如果硬編碼的路由進入到與匹配的模式不同的頁面。如果你把/ help/{page}放在路由tabel 1st中,它將匹配/ help/me,並且你的硬編碼的命名動作永遠不會觸發。

請注意,如果這是一個面向公衆的網站,搜索引擎優化很重要,請注意,如果您有多個網址返回相同的數據,它將被標記爲重複。如果是這種情況,請使用Canonical標記,這樣可以將所有轉到該單個頁面的網址的所有網頁排名提供給您指定的網頁併爲您刪除重複的內容問題。

4

在我的情況下,我正在尋找簡單地將兩個「硬編碼」路線合併爲一個,並偶然發現這篇文章。我想稍微清理我的RouteConfig.cs - 因爲它有很多類似的路線。

最後我用一些簡單的「或」邏輯正則表達式,基本上改變了:

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

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

成一個單一的路線:

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

注意的搜索引擎優化薩維或-interested :將多個URL指向同一個動作的原因是將它們重新定向到同一個頁面。在這種情況下,主頁。所以這個想法是爲了防止重複的內容問題。當您使用此方法指向非重定向操作時,但是顯示其自己視圖的操作時,則可能會導致重複的內容問題:P。

17

現在在MVC 5中,這可以通過使用路由屬性來實現。

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

如果你如果你想知道如何確定多個路由中的哪一個到你的Action方法中,你可以使用'ControllerContext.RouteData'來比較這些URLs ,[在這個其他stackoverflow答案中精美地解釋](http://stackoverflow.com/a/39626076/325521) – Shiva 2017-05-21 18:54:02

+3

爲了讓路由屬性工作,你還需要添加「路由es.MapMvcAttributeRoutes();「在RouteConfig.cs文件中的任何其他路由之前。 [MSDN Blog Post](https://blogs.msdn.microsoft.com/webdev/2013/10/17/attribute-routing-in-asp-net-mvc-5/) – joeshmoe301 2017-06-15 17:42:49