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

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

问题描述:

我有一个简单的Category类来创建自引用表。@ Html.DropdownList显示类别>>子类别>>子类别作为文本值

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电池”子类别的“电子用品”。

+0

没有什么可以做到的。我发布了一篇关于代码项目[MVC自定义选择控件](http://www.codeproject.com/Articles/Article/768069/MVC-Custom-Select-Control)的文章,其源代码显示了一种可能性。其他选项包括构建类别文本中父类别文本的选项,或者根据父类的选择(使用jquery和ajax)为子元素动态构建其他下拉列表。 –

+0

@StephenMuecke谢谢!代码项目的例子肯定会有所帮助。感谢大家的耐心和帮助,因为我深入了解MVC! – bobbyK12

您需要一个模型中为您生成该名称的方法。喜欢的东西:

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

+0

谢谢@JimG。我在如何构建GetParent方法来提供GetFullCategoryName()方法方面有点不知所措......你能帮忙吗?我无法弄清楚这样做的正确方法......我的道歉,这比我之前尝试过的任何事情都要复杂一些...... – bobbyK12

+0

没问题,GetParent会是一些需要ParentId并返回来自EF的相应类别。然而,对你而言,我不能肯定地说不知道更多关于你的实体和关系等等。这个方法可以在类别或单独的静态方法的某处,或任何你喜欢的。我拥有它的方式都是方法GetParent和GetFullCategoryName都将在你的Category类中定义,但总有很多方法可以做到这一点。 (我应该把'this.GetParent(this.ParentId)''那么也许它会更清晰。) – JimG

+0

谢谢一堆。感谢帮助,帮助我理解事情,因为我深入了解一个项目,需要我扩展我所学到的内容。 – bobbyK12