2017-12-16 19 views
0

私はドロップダウンリストを返すことができるはずのコントローラのアクションに取り組んでいます。そのための引数は、親エンティティタイプ、親エンティティID、子エンティティタイプです。ドロップダウンリストを返す汎用メソッドasp.netの部分ビュー

public ActionResult Dropdown<TParent,TChild>(int id) where TParent : class where TChild:class 
{ 
    var dropdownList = new DropdownList<TParent,TChild>(id); 
    return PartialView(); 
} 

DropdownListクラスは次のようになります。

public class DropdownList<TParentEntity, TChildEntity> where TParentEntity : EntityObject where TChildEntity : EntityObject 
{ 
    public List<SelectListItem> ListItems; 

    public DropdownList(int parentId) 
    { 
     DatabaseEntities db = new DatabaseEntities(); 
     TParentEntity parentEntity = db.Set<TParentEntity>().Find(parentId); 
     DbEntityEntry parentEntityEntry = db.Entry(parentEntity); 

     ListItems.Add(new SelectListItem { Value = "-1", Selected = false, Text = "Select " + typeof(TChildEntity).Name }); 
     //foreach (dynamic entity in childrenEntities) 
     //{ 
     // ListItems.Add(new SelectListItem 
     // { 
     //  Value = Convert.ToString(entity.Id), 
     //  Text = entity.Name, 
     //  Selected = false 
     // }); 
     //} 

    } 
} 

私は進歩する方法がなく、私は立ち往生しています。私もGoogle上の任意のソリューションを見つけることができません。基本的には、親エンティティのID、親エンティティのタイプ、子エンティティのタイプを渡すクラスを作成します。子エンティティのドロップダウンリストを返すようにします。

+0

ParentIdで子データをすぐに選択できるため、Parentの型を知る必要はありません。それはもっと簡単になります。 –

+0

@GertArnoldありがとうございます。しかし、1つの親が複数の子ナビゲーションプロパティを持つことができるため、その親子を指定する必要があります。 –

答えて

0

あなたがドロップダウンリストを表示する必要のあるすべてのエンティティでこのインターフェイスを実装するインタフェース

public interface IDropdownOption 
{ 
     public int Value {get; set;} 
     public int Text {get; set;} 
} 

を導入することができます。

私はNavigationProperty名を使用してそれを得ることができた

/* Change Constraints on Type Parameters to allow only IDropdownOption */ 
public class DropdownList<TParentEntity, TChildEntity> where TParentEntity : EntityObject where TChildEntity : EntityObject, IDropdownOption 
{ 

public List<SelectListItem> ListItems; 
public DropdownList(int parentId) 
{ 
    DatabaseEntities db = new DatabaseEntities(); 
    TParentEntity parentEntity = db.Set<TParentEntity>().Find(parentId); 
    DbEntityEntry parentEntityEntry = db.Entry(parentEntity); 

    ListItems.Add(new SelectListItem { Value = "-1", Selected = false, Text = "Select " + typeof(TChildEntity).Name }); 
    /* assuming you can load child entities as list then you just convert it like below */ 
ListItems.AddRange(childrenEntities.OfType<IDropdownOption>().Select(s => new SelectItem 
{ 
Text = s.Text, Value = s.Value 
})); 

} 
} 
0

以下のようにあなたは、あなたの関数のシグネチャを変更することができます。親と子の型、親Idとナビゲーションプロパティ名を渡さなければなりませんでした。だから、呼び出し元のメソッドが

var dropdownList = new DropdownList<TParent,TChild>(id, navigationProperty); 

のようになります次にDrodownListクラスは

public class DropdownList<TParent,TChild> where TParent : class 
{ 
    public List<SelectListItem> ListItems; 
    public DropdownList(int id, string navigationProperty) 
    { 
     ListItems = new List<SelectListItem>(); 
     DatabaseEntities db = new DatabaseEntities(); 
     TParent parentEntity = db.Set<TParent>().Find(id); 
     DbEntityEntry<TParent> parentEntityEntry = db.Entry(parentEntity); 
     DbCollectionEntry<TParent,TChild> navigationPropertyCollection = parentEntityEntry.Collection(navigationProperty).Cast<TParent, TChild>(); 
     ListItems.Add(new SelectListItem { Value = "-1", Selected = false, Text = "Select " + navigationProperty }); 
     foreach (dynamic entity in navigationPropertyCollection.CurrentValue) 
     { 
      ListItems.Add(new SelectListItem 
      { 
       Value = Convert.ToString(entity.Id), 
       Text = entity.Name, 
       Selected = false 
      }); 
     } 
    } 
} 

のようなものです。このソリューションは、正常に動作しますが、私はまだあなたがナビゲーションプロパティを渡す必要はありませんより良い方法を探しています名。

parentEntityEntry.Collection(navigationProperty) 

上記のメソッドは、ナビゲーションプロパティ名として文字列と子タイプからナビゲーションプロパティ名を派生できるExpressionの両方を受け入れます。

渡す必要がある表現の考え方はありますか?

関連する問題