2016-02-29 2 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}) 

Это позволяет использовать категории с несколькими вложенными подкатегориями и дополнительными подкатегориями, вложенными под другие подкатегории и т. Д. И т. Д.

Представление create позволяет вам создать новую категорию и назначить родительскую категорию с помощью @Html.DropdownList, который вытаскивает текстовые значения для всех категорий, но содержит только фактическую категорию или название подкатегории.

Есть ли способ изменить отображаемые значения в @Html.DropdownList, чтобы отобразить иерархическое дерево вместо одного родительского значения?

Так вместо @Html.Dropdownlist отображаются «AAA батарей» (значение новой категории родительской категории) он показывает полное значение иерархического родительской категории:

Electronic Supplies >> Batteries >> AAA Batteries 

Это, конечно, является категорией имени «Электронные принадлежности» с подкатегорией «Батареи» и подкатегорией под «Аккумуляторы AAA».

+0

Нет ничего из этого, что сделает это. Я опубликовал статью о проекте кода [MVC Custom Select Control] (http://www.codeproject.com/Articles/768069/MVC-Custom-Select-Control) с исходным кодом, показывающим одну возможность. Другие варианты включают создание параметров с текстом родительской категории, перенесенным в текст категории, или динамическое создание дополнительных dropdownlists для дочерних элементов на основе выбора родителя (с использованием 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 ...

Edit:

Вот пример, чтобы использовать это (делает предположение о том, что есть модель с 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, которые будут определены в вашем классе категорий, но всегда есть много способов сделать это. (Я должен был поставить 'this.GetParent (this.ParentId)', тогда, может быть, это было бы яснее.) – JimG

+0

Спасибо, кучка. Я ценю помощь и помогаю понять вещи для меня, поскольку я углубляюсь в проект, который требует от меня расширить то, что я узнал. – bobbyK12

Смежные вопросы