2011-01-20 55 views
4

我有兩個問題。我是相當新的MVC和喜歡控制器和視圖的新方式設置,但我不知道如何做到以下幾點:asp mvc在控制器名稱和路由中使用破折號?

1)使一個像www.homepage.com/coming -soon

這種類型的url什麼是正確的做法呢?你是否創建了一個名爲ComingSoonController的控制器,並通過路由奇蹟般地插入了一條短線?注意我不想下劃線,因爲這不符合SEO的最佳利益。或者即將到來 - 不在URL中的某個其他控制器上的某個操作名稱,並使用[ActionName(「name-with-dash」)]屬性?

2)facebook,linkedin和twitter有像www.facebook.com/[profile name]這樣的網址。 MVC中這將如何完成?顯然[個人資料名稱]是動態的。而且代碼顯然會存在於一個名爲profile的控制器中。所以在我看來,你必須讓MVC足夠聰明,以便知道URL的第二部分何時是配置文件名稱而不是控制器,並將其路由到配置文件控制器上的正確操作?這比聽起來容易嗎?

回答

3

1)它取決於即將來臨 - 是否是動態部分。我假定這是和建議是這樣的:

的Global.asax

public static void RegisterRoutes(RouteCollection routes) 
{ 
routes.MapRoute(
       "Page", // Route name 
       "{pageName}", // URL with parameters 
       new { controller = "Home", action = "Page"} // Parameter defaults 
      ); 

} 

public class HomeController : Controller 
{ 

public ActionResult Page(string pageName) 
{ 
    return View(); 
} 
} 

2)可以解決正如我上面顯示同樣的方式,但請記住,路線的順序很重要。那第一個匹配勝利。如果你想要兩個具有不同邏輯但類似的url結構www.mysite.com/coming-soon和www.mysite.com/{profile name}的動作,假設第一個url有靜態部分,後面的動態可以做類似這樣的:

的Global.asax

public static void RegisterRoutes(RouteCollection routes) 
{ 
routes.MapRoute(
       "Coming-soon", // Route name 
       "coming-soon", // URL with parameters 
       new { controller = "Home", action = "ComingSoon" } // Parameter defaults 
      ); 

routes.MapRoute(
       "Profiles", // Route name 
       "{profileName}", // URL with parameters 
       new { controller = "Home", action = "Profile"} // Parameter defaults 
      ); 
} 

public class HomeController : Controller 
{ 
public ActionResult ComingSoon() 
{ 
    return View(); 
} 

public ActionResult Profile(string profileName) 
{ 
    return View(); 
} 

} 
+0

酷我會嘗試這個。所以這裏的順序很重要,因爲如果存在正確的控制器名稱,您不希望使用動態配置文件操作名稱?例如,當[profilename]碰巧是「controllername」時,www.website.com/controllername將勝過www.website.com/[profilename]。 – mike 2011-01-20 17:44:34

+0

基本上是,更正它的行動名稱不是控制器名稱。 如果這可以解決您的問題,請將其標記爲答案;) – frennky 2011-01-20 19:00:25

3

你可以創建一個自定義路由處理程序被允許的URL連字符:

創建一個新的處理程序

public class HyphenatedRouteHandler : MvcRouteHandler{ 
     protected override IHttpHandler GetHttpHandler(RequestContext requestContext) 
     { 
      requestContext.RouteData.Values["controller"] = requestContext.RouteData.Values["controller"].ToString().Replace("-", "_"); 
      requestContext.RouteData.Values["action"] = requestContext.RouteData.Values["action"].ToString().Replace("-", "_"); 
      return base.GetHttpHandler(requestContext); 
     } 
    } 

...和新航線:

routes.Add(
      new Route("{controller}/{action}/{id}", 
       new RouteValueDictionary(
        new { controller = "Default", action = "Index", id = "" }), 
        new HyphenatedRouteHandler()) 
     ); 

MVC Hyphenated urls

3

我開發的一個開源的NuGet庫爲其EveryMvc/URL隱含轉換爲每-MVC/URL的第一個問題。

虛線的網址是更友好,更容易閱讀。 (More on my blog post

NuGet包:https://www.nuget.org/packages/LowercaseDashedRoute/

要安裝它,只需右鍵打開在Visual Studio中的NuGet窗口單擊項目並選擇NuGet包管理器,在「網上」標籤式「小寫線虛線路線「,它應該彈出。

或者,也可以在Package Manager控制檯運行這段代碼

Install-Package LowercaseDashedRoute

之後,你應該打開App_Start/RouteConfig.cs並註釋掉現有route.MapRoute(...)呼叫並添加此代替:

routes.Add(new LowercaseDashedRoute("{controller}/{action}/{id}", 
    new RouteValueDictionary(
    new { controller = "Home", action = "Index", id = UrlParameter.Optional }), 
    new DashedRouteHandler() 
) 
); 

就是這樣。所有的網址都是小寫字母,虛線,並且隱式轉換,而不需要做更多的事情。

開源項目地址:https://github.com/AtaS/lowercase-dashed-route

當涉及到第二個問題,你可以通過使自己的路線或處理不與自定義錯誤處理機制,發現做到這一點,但路由會更快,如果您可以限制個人資料網址以符合一些規則(比如沒有任何斜線),以便您可以更輕鬆地將其與其他網址區分開來,如來自內容文件網址即.css .js等。

相關問題