2015-12-22 1 views
-1

Le scénario est le suivant:Remplir une seule liste déroulante à partir de deux tables

Les données sont stockées dans la base de données dans les tables de projet et de voisinage. Maintenant, je veux remplir la liste déroulante avec l'identifiant du projet et le nom du projet et le nom de voisinage et le nom du quartier.

je suis expédions maintenant par ViewBag comme ceci:

ViewBag.NeighbourhoodId = new SelectList(allNeighbourhood(), "Id", "NeighbourhoodName"); 

à la page vue, obtenir la liste déroulante de population comme ceci:

@Html.DropDownList("Locations", ViewBag.NeighbourhoodId as SelectList, "Select a location") 

Maintenant, comment envoyer une autre ViewBag dans ce DROPDOWNLIST.

deuxième ques, mon menu déroulant est en vue partielle, je vous envoie des données à la vue partielle comme ceci:

@Html.Partial("_CommentBoxSection",new Neighbourhood()) 

comment envoyer nouveau projet()) ainsi que le quartier. Y at-il une surcharge de partiel où je peux envoyer les deux. J'ai vu quelques messages relatifs à ce titre, mais ils sont quelque chose de différent J'ai récemment essayé:

public class ProjectAndNeighbourhoodListItemViewModel 
{ 
    public Project Project { get; set; } 
    public Neighbourhood Neighbourhood { get; set; } 
    public string ProjectName { get; set; } 
    public int Id { get; set; } 
    public bool IsSelected { get; set; } 
    // public IEnumerable<SelectListItem> ToSelectListItem { get; set; } 
    public SelectListItem ToSelectListItem() 
    { 
     return new SelectListItem 
     { 
      Text = Project.ProjectName, 
      Value = Neighbourhood.Id.ToString(), 
      Selected = IsSelected 
     }; 
     } 
    } 

et à la page de vue directement,

@model @model IEnumerable<ProjectAndNeighbourhoodListItemViewModel> 
@Html.DropDownList("Locations", Model.Select(m => m.ToSelectListItem()), "Select a location") 

mais obtenir la valeur System.ArgumentNullException ne peut pas être null je n'ai pas de code dans le contrôleur dois-je passer quelque chose dans le contrôleur aussi

+0

Quelqu'un peut-il me dire comment faire ?? toujours en attente d'aide – duke

+0

Votre question n'est pas claire. Vous ne pouvez pas publier deux valeurs distinctes dans une liste de sélection. Si vous souhaitez qu'un utilisateur sélectionne un projet et un voisinage, vous avez besoin de * deux * listes de sélection. Si les voisinages sont limités en fonction de la sélection du projet, vous pouvez configurer un ensemble de listes déroulantes en cascade où la première sélection déclenche une requête AJAX pour filtrer la deuxième liste. –

+0

@ChrisPratt thnks pour votre commentaire et downvote mais je pense qu'il est possible grâce à une liste personnalisée qui contient des données des deux tables, mais ne sais pas comment j'ai posté ma question, j'ai clairement indiqué dans mon titre de la question populate un select Liste de toute façon thnks – duke

Répondre

0

Ne pas utiliser ViewBag pour passer des valeurs à votre vue, utilisez ViewModels à la place, c'est beaucoup plus propre. Le ViewModel est également un bon endroit pour créer vos SelectListItems. Créez ou mappez le ViewModel dans votre contrôleur.

// ViewModel for a single selectable entry 
public class ProjectAndNeighbourhoodListItemViewModel { 

    public string ProjectName { get; set; } 

    public long NeighbourhoodId { get; set; } 

    public bool IsSelected { get; set; } 

    public SelectListItem ToSelectListItem() { 
     return new SelectListItem { 
      Text = ProjectName, 
      Value = NeighbourhoodId.ToString(), 
      Selected = IsSelected 
     } 
    } 
} 

Dans votre vue Razor:

@model IEnumerable<ProjectAndNeighbourhoodListItemViewModel> 
@* Would be even better to use a wrapper model that contains the collection of list items as property! *@ 

@Html.DropDownList("Locations", Model.Select(m => m.ToSelectListItem()) , "Select a location") 
+0

thnks pour votre effort mais dans ce viewmodel il n'y a pas d'Id de Projet. Je veux remplir la liste déroulante des tables de projet et des tables de voisinage à la fois – duke

+0

DropDownList() ne peut prendre qu'une seule collection d'options possibles. Créez une SelectList unique pour vos options, mais remplissez-la avec SelectListItems créé à partir des deux tables. –

+0

thnk je vais essayer dès que possible – duke