[英]Generic method to return DropdownList Partial View in asp.net
我正在做一個控制器的動作,它應該能夠返回一個下拉列表。 其參數為父實體類型,父實體ID和子實體類型。
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,父實體的類型和子實體的類型。 我希望它返回子實體的下拉列表。
您可以介紹界面
public interface IDropdownOption
{
public int Value {get; set;}
public int Text {get; set;}
}
在您需要為其顯示下拉列表的所有實體上實現此接口。
然后您可以如下更改函數的簽名
/* 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
}));
}
}
我可以通過使用NavigationProperty名稱來獲取它。 我必須傳遞父代和子代類型,父代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)
上面的方法既接受字符串作為導航屬性名稱,又接受可以從子類型派生導航屬性名稱的表達式。
任何需要表達的想法?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.