2016-12-08 292 views
0

我知道MVC中的路由。我在RouteConfig.cs類的RegisterRoute方法下添加了一個新的MapRoute,併成功調用了我的函數,其URL爲http://localhost:53363/package/PackageDetail/mypackage/5URL路由MVC 5 Asp.net

但是,我的問題是我必須爲每種方法添加不同的地圖路線或有沒有更好的方法?像PackageController類,你可以看到我有兩個方法:一個方法都PackageIdPackageName,另一隻需要PackageId。那麼我是否需要註冊不同的地圖路線?

RouteConfig

 public class RouteConfig 
    { 
     public static void RegisterRoutes(RouteCollection routes) 
     { 
      routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

      routes.MapRoute(
      name: "Package", 
      url: "Package/PackageDetail/{packageName}/{packageId}", 
      defaults: new { controller = "Package", action = "PackageDetail", packageName = UrlParameter.Optional, packageId = UrlParameter.Optional } 

     ); 

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

PackageController.cs:

 [HttpGet] 
     public ActionResult PackageListing(int packageId = 0) 
     { 

      return View(); 
     } 

     [HttpGet] 
     public ActionResult PackageDetail(string packageName = "", int packageId = 0) 
     { 

      return View(); 
     } 
+0

嘗試在MVC 5中使用屬性路由[link](https://blogs.msdn.microsoft.com/webdev/2013/10/17/attribute-routing-in-asp-net-mvc-5/) –

+0

@MuhammedShevilKP偉大的這是我一直在尋找。把它作爲答案,以便我可以接受它。 –

回答

0

如果你不想使用默認的路徑URL和生成自定義網址,那麼你需要註冊在路由配置文件路徑。

您可以像下面那樣傳遞包名和包Id。

http://sitename/Package/PackageListing?packageId=1 

http://sitename/Package/PackageDetail?packageName=packagename&packageId=1 

但是,如果您想生成如下所示的URL,則需要在route.config文件中添加路由。

http://sitename/Package/PackageListing/1 

http://sitename/Package/PackageDetail/packageName/1 
1

儘管穆罕默德的回答會的工作,這是非常重複,特別是如果你使用多種類型的路由相同的風格。

在決定採用單一路由方式之前,有幾件事需要考慮。主要的原因是爲什麼路線中有名字和ID?如果你想要更多的SEO友好的URL結構,不要打擾ID。

如果在同一類型中有多個具有相同名稱的產品,則將該名稱作爲URL的一部分是沒有意義的,因爲這不會讓用戶自己想要去的地方。在這種情況下,只需保留原來的路線。然而,如果你有幾個不同的控制器(或動作),這些控制器(或動作)具有相似的路由名稱/ id結構,那麼使你的自定義路由更加通用,你會得到更好的服務。

routes.MapRoute(
    name: "NameAndId", 
    url: "{controller}/{action}/{name}/{id:int}", 
    defaults: new 
     { 
      controller = "Package", 
      action = "PackageDetail", 
      name = UrlParameter.Optional, 
      id = UrlParameter.Optional 
     }); 

保留此默認路由上面,而這將重定向不只是

/Package/PackageDetail/Deluxe/5 

而且還讓你有這樣的東西:

/Meals/Menu/Dinner/3 

這不一定適用對於你在這個項目中,但是因爲你正在學習MVC,這是一個很好的技巧。您能夠維護路由定義的通用性越高,您需要重複的路由越少。當然,如果這是一次性特殊路線,使用這些屬性沒有任何問題。

同樣爲了回答您的最終問題,您不需要創建另一個自定義路由,因爲您的PackageListing方法將通過創建項目時提供的默認路由進行路由。