2016-02-29 1 views
0

J'ai une simple classe Category pour créer une table auto-référencée.@ Html.DropdownList pour afficher Catégorie >> Sous-catégorie >> Sous-catégorie en tant que valeur de texte

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;} 
} 

Et créer vue générée par EF a l'extérieur de la zone de la boîte pour le nouveau nom de la catégorie:

@Html.LabelFor(model => model.Name, new {@class = "control-label"}) 
@Html.EditorFor(model => model.Name,"", new{@class="form-control"} 

et une zone qui préremplit la catégorie parente sélection

@Html.LabelFor(model => model.ParentId, "Parent Category", new {@class = "control-label"}) 
@Html.DropdownList("ParentId", null, new {@class ="form-control}) 

Ceci permet des catégories avec un nombre de sous-catégories imbriquées et des sous-catégories supplémentaires imbriquées sous d'autres sous-catégories, etc ... etc ...

La vue de création vous permet de créer une nouvelle catégorie et d'attribuer une catégorie parente à l'aide d'un @Html.DropdownList qui extrait les valeurs de texte de toutes les catégories mais n'indique que la catégorie ou le nom de sous-catégorie réel.

Existe-t-il un moyen de modifier les valeurs d'affichage dans @Html.DropdownList pour afficher l'arborescence hiérarchique au lieu d'une valeur parent unique?

Ainsi, au lieu de @Html.Dropdownlist afficher « piles AAA » (la valeur de la catégorie mère de la nouvelle catégorie), il montre la valeur hiérarchique complète de la catégorie parente:

Electronic Supplies >> Batteries >> AAA Batteries 

Ceci est bien sûr est une catégorie nommée "Fournitures électroniques" avec une sous-catégorie de "Piles" et une sous-catégorie sous celle de "Piles AAA".

+0

Il n'y a rien hors de la boîte qui fera cela. J'ai posté un article sur Code Project [MVC Custom Select Control] (http://www.codeproject.com/Articles/768069/MVC-Custom-Select-Control) avec le code source montrant une possibilité. Les autres options incluent la construction des options avec le texte de la catégorie parent qui est perpendiculaire au texte de la catégorie, ou la construction dynamique de listes déroulantes supplémentaires pour les éléments enfants basés sur la sélection du parent (jquery et ajax) –

+0

@StephenMuecke thanks! L'exemple du projet de code va certainement aider. J'apprécie la patience et l'aide de tout le monde à mesure que je m'intéresse à MVC! – bobbyK12

Répondre

0

Vous avez besoin d'une méthode dans votre modèle qui génère ce nom pour vous. Quelque chose comme:

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); 
    } 
} 

Bien sûr, vous avez également besoin d'une méthode GetParent ...

Edit:

Voici un exemple d'utiliser cette (en faisant l'hypothèse qu'il existe un modèle avec un CategoryId propriété, et un procédé de GetAllCategories):

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

Edit 2: J'ai changé le code ci-dessus pour montrer toute la classe, peut-être que cela aura plus de sens?

+0

Merci @JimG. Je suis un peu sur la façon de structurer la méthode GetParent pour fournir la méthode GetFullCategoryName() ... pourriez-vous nous aider? Je ne peux pas trouver une bonne façon de le faire ... mes excuses, c'est un peu plus compliqué que tout ce que j'ai déjà essayé ... – bobbyK12

+0

Pas de problème, GetParent serait une méthode qui prend un ParentId et renvoie le Catégorie correspondante de EF.Cependant cela fonctionne pour vous je ne peux pas dire avec certitude sans en savoir beaucoup plus sur vos entités et relations, etc. Cette méthode pourrait être dans la catégorie ou une méthode statique séparée quelque part, ou ce que vous préférez. Les méthodes GetParent et GetFullCategoryName sont toutes deux définies dans votre classe Category, mais il y a toujours plusieurs façons de le faire. (J'aurais dû mettre 'this.GetParent (this.ParentId)' alors peut-être que ce serait plus clair.) – JimG

+0

Merci beaucoup. J'apprécie l'aide et aide à donner du sens aux choses à mesure que je m'investis dans un projet qui m'oblige à développer ce que j'ai appris. – bobbyK12