@Html.下拉列表>>将“类别”“子类别”>>“子类别”显示为文本值

本文关键字:子类别 子类 文本 显示 下拉列表 类别 @Html | 更新日期: 2023-09-27 18:36:40

我有一个简单的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中的显示值以显示分层树而不是单个父值?

因此,显示"AAA 电池"(新类别的父类别的值)的@Html.Dropdownlist不是显示,而是显示父类别的完整层次结构值:

Electronic Supplies >> Batteries >> AAA Batteries

这当然是一个名为"电子耗材"的类别,其子类别为"电池",子类别为"AAA电池"。

@Html.下拉列表>>将“类别”“子类别”>>“子类别”显示为文本值

模型中需要一个为你生成此名称的方法。像这样:

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 属性和 GetAllCategory 方法的模型):

@Html.DropDownListFor(x => x.CategoryId, Model.GetAllCategories().Select(c => new SelectListItem() { Text = c.GetFullCategoryName(), Value = c.CategoryId }))

编辑 2:我更改了上面的代码以显示整个类,也许这会更有意义?