2016-02-29 131 views
0

我有一個簡單的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

回答

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: 我改變了上面的代碼來顯示整個班級,也許這會更有意義?

+0

謝謝@JimG。我在如何構建GetParent方法來提供GetFullCategoryName()方法方面有點不知所措......你能幫忙嗎?我無法弄清楚這樣做的正確方法......我的道歉,這比我之前嘗試過的任何事情都要複雜一些...... – bobbyK12

+0

沒問題,GetParent會是一些需要ParentId並返回來自EF的相應類別。然而,對你而言,我不能肯定地說不知道更多關於你的實體和關係等等。這個方法可以在類別或單獨的靜態方法的某處,或任何你喜歡的。我擁有它的方式都是方法GetParent和GetFullCategoryName都將在你的Category類中定義,但總有很多方法可以做到這一點。 (我應該把'this.GetParent(this.ParentId)''那麼也許它會更清晰。) – JimG

+0

謝謝一堆。感謝幫助,幫助我理解事情,因爲我深入瞭解一個項目,需要我擴展我所學到的內容。 – bobbyK12