2017-08-24 1 views
0

Je voudrais passer la liste des objets fortement typés à une liste déroulante qui se trouve sur ma vue.Comment passer une liste d'objets de type fort d'un contrôleur à une liste déroulante sur une vue?

Habituellement pour y parvenir je ViewBags comme dans l'exemple suivant:

public ActionResult ChooseLevel() 
{ 

    List<Levels> LevelList = GetAllLevels(); 

    ViewBag.LevelList = LevelList 

    var model = new Levels(); 
    return View(model); 
} 

Et je voudrais simplement écrire ceci sur une vue, et je recevrais tous mes niveaux énumérés là:

<div class="form-group"> 
    @Html.LabelFor(model => model.LevelId, new { @class = "control-label col-md-3 col-sm-3" }) 
    <div class="col-md-9 col-sm-9"> 
     @Html.DropDownListFor(model => model.LevelId, new SelectList(ViewBag.LevelList, "LevelId", "LevelName"), "", new { @class = "form-control" }) 
    </div> 
</div> 

Mais maintenant, je me demande si je peux simplement passer ma liste de niveaux là-bas, et les choisir dans la liste déroulante, sans les stocker dans un viewbag en premier? Par exemple:

public ActionResult ChooseLevel() 
{ 
    List<Levels> LevelList = GetAllLevels(); 
    return View(LevelList); 
} 

Sur une vue j'accepter plusieurs articles en écrivant IEnumerable sur une vue:

@model IEnumerable<Levels> 

et après que je pourrais en quelque sorte choisir un seul élément et l'afficher à un serveur ?

Comment puis-je résoudre ce problème?

+0

Une précision: Pourquoi utiliser un 'IEnumerable ' la vue si vous attendez un seul élément de 'DropDownList' passé dans viewmodel? Même vous pouvez passer la liste viewmodel avec 'Model.LevelList' comme' @ Html.DropDownListFor (model => model.LevelId, nouvelle SelectList (Model.LevelList, "LevelId", "LevelName"), "", nouvelle {@class = "form-control"}) '. –

+0

La liaison d'une liste déroulante à elle-même n'a aucun sens (votre modèle est 'Level' et les options que vous générez sont' Level'.) Qu'essayez-vous d'accomplir ici? –

+0

@StephenMuecke J'ai besoin d'une vue avec une seule liste déroulante), et cette liste déroulante devrait me permettre de sélectionner l'un des niveaux –

Répondre

2

Vous devez ajouter cette liste à votre modèle existant ou Voir Modèle:

class ModelName 
{ 
public virtual IEnumerable<SelectListItem> lstTypes { get; set; } 
public virtual int intTypeId { get; set; } 
//Other existing properties here 
} 

Sur votre contrôleur, vous pouvez maintenant ajouter cette liste à votre modèle avant de retourner à votre point de vue:

  ModelName objModel = new ModelName(); 
      List<Levels> LevelList = GetAllLevels(); 

      objModel.lstTypes = LevelList.Select(y => new SelectListItem() 
      { 
       Value = y.LevelId.ToString(), 
       Text = y.LevelName.ToString() 
      }); 
     return View(objModel); 

vous pouvez afficher sur votre vue ensuite:

@model ModelName 
//First parameter will be the Id that will be selected by your user when they post it 
//Second parameter will be the enumerable list of dropdown 
//Third parameter is the default option which is optional, and the last is the HTML attributes 
@Html.DropDownListFor(c => c.intTypeId, Model.lstTypes , "Please select an item", new { @class = "form-control" }) 
1

vous pouvez créer viewmodel qui contient mult modèles iple (ancien modèle et modèle LevelList). comme ceci:

public class newViewModel 
{ 
    public IEnumerable<level> levels{ get; set;} 
    public OldModel oldModel {get; set;} 
} 
0

Modèle classe

public class TestViewModel 
{ 
    public List<SelectListItem> EnterpriseList { get; set; } 
} 

Controller:

var model = new TestViewModel() { 
      EnterpriseList = EnterpriseData.Select(p=>new SelectListItem() { Value = p.Value,Text = p.Name}).ToList() 
     }; 
     return View(model); 

Vue:

@Html.DropDownListFor(p => p.Enterprise, Model.EnterpriseList, "Please select a", new { @class = "form-control", @style = "height: auto" }) 
+0

Le modèle ne contient pas le nom de la propriété 'Enterprise', donc votre code ne serait même pas compilé –