2011-01-07 17 views
3

私は次の電子商取引サイトにMVCを使用する可能性を模索しています。私が理解できないようなことは、私が通常使っているのと同じURL規約を使うことができるかどうかということです。。未定数のフォルダ(ネストされたカテゴリ構造)のためのネットMVCルート

  • カテゴリ/サブカテゴリ/ Product1.html
  • カテゴリ/サブカテゴリ/ SubSubCategory/Product2.html
  • カテゴリ/サブカテゴリ/ SubSubCategory/Product3:現在、すべての製品のためのURLは、次のいずれかである可能性があります。 HTML
  • カテゴリ/サブカテゴリ/ SubSubCategory/SubSubSubCategory/Product4.html

など

私が持っている問題は、ネストされたカテゴリ構造です。次のようにこれまでのところ、私が作ってみただけの事はある:

routes.MapRoute(
    "Products", 
    "{categories}/{productname}", 
    new { controller = "Product", action = "Details", productname = UrlParameter.Optional }, 
    new { categories = @"\w+/\w+" } 
); 

私は{カテゴリ}が、私はその製品適切なカテゴリを識別するために処理することができ、次のいずれかと一致することができることを期待していました所属:

  • スポーツ/テニス/ラケット/ProductA
  • スポーツ/バドミントン/ラケット/PRODU ctB

しかし、上記の経路は正しく動作しません。

これはどのように実現できるのか、それともできないのか誰にも分かりますか?

答えて

0

URLの個々のセグメントにアクセスする必要があるため、カテゴリセグメントを2つのセグメントに分割する必要があります。それははるかに簡単になります。

は、我々はあなたが、カテゴリ、productClassおよび商品名パラメータにアクセスする方法が必要

製品クラスとしてそれらのカテゴリ内のテニスとバドミントンラケットカテゴリと呼んで言ってみましょう。 「スポーツ」はこの場合には固定されていると仮定すると、私はこのようにそれを行います。)

routes.MapRoute(
"Products", 
"sport/{category}/{productClass}/{productName}", 
new { controller = "Product", action = "Details", productClass = UrlParameter.Optional, productName = UrlParameter.Optional } 

あなたのアクションメソッドは、この

public ActionResult Details(string category, string productClass, string productName){ 
//Do whatever you need to do in order to get the specified product 

}

0

あなたがそう、それは読んでいましMVC2

でエリアを使用することができます。 エリア/コントローラ/ビュー/ ID

だからあなたの場合にはそれがになってしまうでしょう:、領域である

スポーツ テニスコントローラ、 ラケットビュー、 ProductAがIDまたはクエリ文字列である、

http://www.asp.net/mvc/videos/aspnet-mvc-2-areas

これは意味をなさないでしょう。

+0

地のようなものになりますが、おそらく異なるレイアウトと異なるコントローラとビューを持つ小さな管理しやすい部分に大規模なサイトを分割する方法です。しかし、私はこの質問が、単一の製品コントローラ内のフォルダ階層をどのように扱うのかと考えています。 –

+0

ありがとうございました - はいマーティン、それは私が運転しているものにもっと似ています。だから私は、ラケットと呼ばれる2つの異なるカテゴリを持っているかもしれません。現時点では、あなたが言ったように、フォルダ構造を持つカテゴリ構造/階層を表しています。まだ経路を構築する方法が見つかっていません。 –

5

ルーティングシステムではキャッチオールパラメータを定義できます。キャラルパラメータは、スラッシュを無視してURL末尾のすべてをキャプチャします( )。キャッチオールとしてパラメータを指定するには、アスタリスク(*)を の先頭に付けます。

routes.MapRoute(null, "Articles/{*articlePath}", 
    new { controller = "Articles", action = "Show" } 
); 

あなただけのURLパターンで1つのキャッチオールパラメータを持つことができ、それはその時点以降から全体のURLパスをキャプチャするのでそれは、URLの最後の(すなわち、 右端)のものでなければなりません。

ただし、ルートオブジェクトはURLのパス部分のみを調べるため、クエリ文字列からは何もキャプチャしません。

キャッチオールパラメータは、訪問者がコンテンツ管理システム(CMS)など、任意の種類の任意の種類の任意の奥行き階層をナビゲートできるようにする場合に便利です。

RouteDataオブジェクトを使用すると、ルートに関する情報を抽出できます。必要に応じて、ルートデータを解析して正しいコントローラメソッドを呼び出すカスタムルートハンドラを作成します。

関連する問題