2017-01-21 5 views
0

私は、URLリクエストでカテゴリー(属性:IDと名前を持つ)を表示するインデックスページを持っています:http://localhost:62745/home/indexURLルートにモデルデータをマップする方法は?

カテゴリをクリックすると、http://localhost:62745/Home/Products/6になります。

URLをより詳細にして、直前のURLのカテゴリIDプロパティ6を、クリックしたばかりのカテゴリのnameプロパティに置き換えます。

マイルートの設定は、次のようになります。

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

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

      routes.MapRoute(
       name: "Categories", 
       url: "{controller}/{action}/{categoryName}", 
       defaults: new { controller = "Category", action = "Index", categoryName = UrlParameter.Optional } 
      ); 

     } 
    } 

最初MapRoute()メソッドがすでに実装されました。私は問題を解決することを望む2番目を追加しましたが、それはしませんでした。

これは、製品のための私のコントローラアクションである:両方のあなたのルートは、それらがどのように解釈されるかという点で同一である

// GET: Product 
public async Task<ActionResult> Index(int? id, string categoryName) 
{ 

    var products = (await db.Categories.Where(c => c.Id == id) 
            .SelectMany(p => p.Products.Select(x => new ProductViewModel { Id = x.Id, Name = x.Name, ByteImage = x.Image, Price = x.Price})) 
            .ToListAsync()); 

    categoryName = db.Categories.Where(c => c.Id == id).Select(c => c.Name).ToString(); 

    if (products == null) 
    { 
     return HttpNotFound(); 
    } 

    return View(new ProductIndexViewModel{ Products = products, CategoryId = id }); 
} 
+1

私は 'id'が' Category'名の数値識別子であると思いますか?そうであれば、 'id'は一意であると仮定し、' Category'には一意の制約はありません。人間が読める 'Category'をあなたが捨てようとしている値として使うと、問題につながるでしょう。あなたが達成しようとしていることは何ですか?これは単にクエリ文字列に読み取り可能な値を持つことですか? – gmiley

+1

注目すべき点の1つは、常に最上位の特定のものから最も下のものまで移動したいルートをマッピングする場合です。だから、あなたが現在持っているので、デフォルトルートはリストの最後である必要があります。それ以外のルートはチャンスを得ることはありません –

+1

[なぜasp.net mvcの一般的なルートの前に特別なルートを最初にマップするのですか?](http:// stackoverflow。com/a/35674633/181087)を参照してください。 – NightOwl888

答えて

1

- それらは2つのセグメント及び随意3セグメントを受け入れるようHome/Products/6及びHome/Products/CategoryName両方が最初Defaultと一致あなたの質問は2番目のURLのProducts()メソッドを参照していますが、あなたはそのメソッドを表示していないので、あなたのreferrinが明示されていないかどうかは分かりません。 gを製品名またはカテゴリ名に変更しますが、プリンシパルは同じです。あなたはURLがパラメータをしたい場合は、ビュー

@foreach(var item in Model.Products) 
{ 
    // link for each product 
    @Html.ActionLink("Details", "Products", "Home", new { id = item.Name }, null) 

で次にあなたは、単に、別の方法

public ActionResult Products(string id) 
{ 
    // the value of id is the the the product name 
    .... 
} 

を作ることができ、特定の製品を表示するためにHome/Products/ProductNameようにしたいと仮定すると、

string nameではなく、string idとすると、特定のルートを定義し、Defaultルートの前に配置することができます。

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

方法は

public ActionResult Products(string name) 

サイドノートになるように:カテゴリ名を取得するあなたはIndex()方法でクエリを持っているという事実は、あなたも「スラグ」を望むかもしれない示唆この場合、how to implement url rewriting similar to SOを参照してください。

関連する問題