2017-12-07 9 views
0

私はこの製品カテゴリのモデルがあります:ASP.NETコアでカミソリを使用してテーブル内の再帰

親IDを使用して
public class ProductCategory 
{ 
    public int Id { get; set; } 
    public int? ParentId { get; set; } 
    public string Title { get; set; } 
} 

を、私はカテゴリとサブカテゴリ(最大3段階)のリストを表示したいですtabeledリストで、そのよう:

<table> 
    <tr><td colspan="3">Category #1</td></tr> 
    <tr><td></td><td>Category #1.1</td><td></td></tr> 
    <tr><td></td><td>Category #1.2</td><td></td></tr> 
    <tr><td colspan="2"></td><td>Category #1.2.1</td></tr> 
    <tr><td colspan="2"></td><td>Category #1.2.2</td></tr> 
    <tr><td colspan="3">Category #2</td></tr> 
</table> 

私はthis solutionを実装しようとしたが、私は私が部分図にデータを渡すことになってるか理解していません。私のカテゴリには、子どもの参照がなく、親の参照があります。

答えて

1

参照するソリューションを模倣するには、少なくとも1つのナビゲーションプロパティをエンティティに追加する必要があります。この方法で、各ProductCategoryの子を効果的に列挙できます。

以下のエンティティ宣言をお勧めします。これは、データベースに余分な副作用が生じないようにします。あなたはParentCategoryレコードを設定し、うまく満たされたデータベースを持っている場合は、次のように、あなたはアクションメソッドでそれを照会することができ、今

public class ProductCategory 
{ 
    public int Id { get; set; } 
    public string Title { get; set; } 

    [ForeignKey(nameof(ParentCategory))] 
    public int? ParentId { get; set; } 

    public ProductCategory ParentCategory { get; set; } //nav.prop to parent 
    public ICollection<ProductCategory> Children { get; set; } //nav. prop to children 
} 

:それは利便性のための2つのナビゲーションプロパティを持つ

このビューはなりその後、(私は強く、このためのViewModelを作成することをお勧めします)モデルとしてこれらのトップレベルカテゴリを取り、再帰的にすべての子をレンダリングする部分を使用します。

@model IEnumerable<ProductCategory> 

<table> 
    @Html.Partial("CategoryRowPartial", Model) 
</table> 

Finall y CategoryRowPartialは、IEnumerable<ProductCategory>も受信します。それは、すべての子を表示するには、自分自身を再帰的に呼び出します。

@model IEnumerable<ProductCategory> 

@foreach (var category in Model) 
{ 
    <tr><td>@category.Title</td></tr> 
    @Html.Partial("CategoryRowPartial", category.Children) 
} 

、これは考慮に入れ、それぞれの子のレベルでも、空の(そしてかなりずさん)TDの& colspansを負いません。個人的には、<ul>または<ol>を使用します。階層を表示するために使用されます。

<table>を使用することをお勧めする場合は、各表の行の「深さ」を保持できる特殊なビューモデルを作成することをお勧めします。

関連する問題