0

我在我的MVC應用程序中有兩個控制器。一個是Home控制器,另一個是User控制器。我正在使用以下RouteConfig設置。如何爲兩個控制器映射相同的路由?

routes.MapRoute(
      "actiononly", 
      "{action}/{id}", 
      new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
     ); 
routes.MapRoute(
      "Default", 
      "{controller}/{action}/{id}", 
      new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
     ); 

我想abc.com/Blog abc.com/Login 而不是abc.com/Home/Blog abc.com/User/Login。 上面的配置在abc.com/Blog下正常工作,但它不適用於abc.com/Login。 如何從兩個控制器的鏈接中刪除控制器名稱? 另外,如何在網站啓動時只顯示abc.com而不是abc.com/index?我在我的網頁中使用以下代碼來訪問特定頁面。

@Html.ActionLink("Home", "Blog", "Home") 
@Html.ActionLink("Login", "Login", "User") 

回答

1

你的默認路由會自動滿足希望資產淨值對abc.com無需URL

你需要確保你的主要途徑是指定爲默認的index部分:

context.MapRoute(
      "Site_Default", 
      "{controller}/{action}/{*id}", 
      defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
     ); 

如果你想映射短路線,你可以做到以上所做的。我用這個輔助函數在我自己的項目,以映射路線短:

void ShortRoute(string action, string controller) 
{ 
    ShortRoute(action, controller, action); 
} 

void ShortRoute(string action, string controller, string route) 
{ 
    _context.MapRoute(route, route, new { action, controller }); 
} 

的使用方式:

ShortRoute("About", "Home"); 

,讓我轉到mywebsite.com/about而不是mywebsite.com/home/about

如果它不工作某些URL可能是路由處理器匹配不同的路由 - 我相信它確實取決於您註冊它們的順序

有一個很好的途徑調試插件,您可以使用

https://www.nuget.org/packages/routedebugger/

它給你的所有路由的總結,哪些匹配當前URL - 非常有用

+0

感謝您的回覆查爾。幾個問題。我在哪裏添加'ShortRoute'方法?在RouteConfig文件中?我也可以在哪裏調用ShortRoute(「關於」,「家」)?我在我的項目中添加了這個幫助器方法,而不是必須對所有操作使用此方法? –

1

沒有帶來額外的軟件包,你只需添加一條附加路線。要創建新路線,您首先必須定義您想要的網址。在這種情況下,您曾表示您希望能夠轉到用戶控制器上的/Login。好的 - 我們來創建一個新路線。這條路線應該位於高於您的默認路線。

routes.MapRoute(
      "UserLogin", 
      "Login/{id}", 
      new { controller = "User", action="Login", id = UrlParameter.Optional } 
    ); 

第一個參數就是路由名稱。第二個參數是我希望此路線匹配的URL的格式。鑑於我們知道我們想要匹配此路線的行動,我們不需要默認路線中的{action}{controller}全方位佔位符。另外請注意,我們可以聲明此路由將命中什麼控制器,而無需在URL中指定控制器。

最後需要注意的是,如果您永遠不會將ID參數傳遞給該函數,則不必將{id}作爲路由的一部分。如果是這種情況,那麼您可以安全地刪除用戶登錄路由中對id的任何引用。

當我重新閱讀您的問題時,您應該也可以爲其他一些示例執行此操作。我們來看看/About的URL,並演示{id}參數的刪除。

routes.MapRoute(
      "AboutUsPage", 
      "About", 
      new { controller = "Home", action="About"} 
    ); 
+0

如果我在兩個控制器中都有多個動作會怎麼樣?而不是「登錄/ {id}」對其他操作無效。我該如何繼續? –

+0

正確,在某些時候,您將在路線中擁有控制器名稱,因爲上述情況會變得不穩定。我相信你也可以使用通配符映射。這真的取決於你爲什麼需要你的網址來尋找你想要的方式。有時,額外的工作可能不值得在URL中保存四個字符。 – Tommy

1

這是非常簡單。您只需要爲每個預期的網址創建一個路由。

請記住,如果您未將控制器或操作作爲URL佔位符傳遞,則需要手動將其作爲默認值提供。

routes.MapRoute(
     "Blog", 
     "Blog/{id}", 
     new { controller = "Home", action = "Blog", id = UrlParameter.Optional } 
    ); 
routes.MapRoute(
     "Login", 
     "Login/{id}", 
     new { controller = "User", action = "Login", id = UrlParameter.Optional } 
    ); 
routes.MapRoute(
     "Default", 
     "{controller}/{action}/{id}", 
     new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
    ); 
相關問題