[英]@Html.DropdownList to show Category >> Subcategory >> Subcategory as text value
我有一個簡單的Category
類來創建自引用表。
public class Category
{
public int CategoryId{get; set;}
public string Name {get;set;
public int? ParentId {get;set}
public virtual Category Parent {get;set}
public virtual ICollection<Category> Children {get;set;}
}
EF生成的創建視圖具有新類別名稱的開箱即用區域:
@Html.LabelFor(model => model.Name, new {@class = "control-label"})
@Html.EditorFor(model => model.Name,"", new{@class="form-control"}
和一個預先填充父類別選擇的區域
@Html.LabelFor(model => model.ParentId, "Parent Category", new {@class = "control-label"})
@Html.DropdownList("ParentId", null, new {@class ="form-control})
這允許具有許多嵌套子類別的類別以及嵌套在其他子類別之下的其他子類別,等等...等等...
創建視圖允許您使用@Html.DropdownList
創建新類別並分配父類別,該@Html.DropdownList
拉出所有類別的文本值,但僅列出實際類別或子類別名稱。
有沒有一種方法可以更改@Html.DropdownList
的顯示值以顯示層次樹,而不是單個父值?
因此, @Html.Dropdownlist
顯示父類別的完整層次結構值,而不是@Html.Dropdownlist
顯示“ AAA電池”(新類別的父類別的值):
Electronic Supplies >> Batteries >> AAA Batteries
當然,這是一個名為“電子用品”的類別,其子類別為“電池”,而子類別為“ AAA電池”。
您的模型中需要一個為您生成此名稱的方法。 就像是:
public class Category
{
public int CategoryId {get; set;}
public int ParentId {get; set;}
public string Name {get; set;}
public string GetFullCategoryName()
{
string result = this.Name;
// note: I removed the argument because it's class member.
Category parent = this.GetParent(); // null for top level Categories
while (parent != null)
{
result = parent.Name + " >> " + result;
parent = GetParent(parent.ParentId);
}
return result;
}
public Category GetParent()
{
// note: I just made this up, you would use whatever EF method you have...
return EF.GetEntity<Category>(this.ParentId);
}
}
當然,您還需要一個GetParent方法...
編輯:
這是一個使用此示例(假設存在一個具有CategoryId屬性和GetAllCategories方法的模型)的示例:
@Html.DropDownListFor(x => x.CategoryId, Model.GetAllCategories().Select(c => new SelectListItem() { Text = c.GetFullCategoryName(), Value = c.CategoryId }))
編輯2:我更改了上面的代碼以顯示整個類,也許這樣做更有意義?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.