@ Html.DropdownList显示Category>>子类别>>子类别作为文本值

时间:2016-02-29 17:03:59

标签: c# asp.net asp.net-mvc-5 html-select html-helper

我有一个简单的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 Batteries”(新类别的父类别的值)的@Html.Dropdownlist代替显示父类别的完整层次结构值:

Electronic Supplies >> Batteries >> AAA Batteries

这当然是一个名为“电子用品”的类别,其子类别为“电池”,子类别为“AAA电池”。

1 个答案:

答案 0 :(得分:0)

您需要在模型中为您生成此名称的方法。类似的东西:

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: 我改变了上面的代码来显示整个课程,也许这会更有意义吗?