2016-12-08 30 views
0

私はMVCでルーティングについて知っています。 RouteConfig.csクラスのRegisterRouteメソッドの下に新しいMapRouteを追加し、URL http://localhost:53363/package/PackageDetail/mypackage/5を使用して関数を正常に呼び出しました。URLルーティングMVC 5 Asp.net

しかし、私の質問は、すべての方法に異なるマップルートを追加する必要があるのですか、それとも良い方法がありますか? PackageControllerクラスであなたが見ることができるように私には二つの方法1つの方法を持っている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をオーバーライドし、カスタム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

ムハンマドの答えが動作するという事実にもかかわらず、それはあなたが複数のタイプのためのルートの同じスタイルを使用している場合は特に、非常に繰り返しです。

ルーティングへのアプローチを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を学んでいるので、これは良いスキルです。ルート定義をより一般的に保つことができれば、それを繰り返す必要が少なくなります。もちろん、これが1回限りの特別なルートであれば、属性の使用には何も問題ありません。

PackageListingメソッドは、プロジェクトの作成時に提供されたデフォルトルートを経由してルーティングされるため、最終的な質問に答えるために、別のカスタムルートを作成する必要はありません。

関連する問題