2016-08-30 1 views
0

Ich habe folgend einen Blick zu machen:Razor: Wie erstellt man ein Dropdown aus einer IEnumerable <string> ViewBag-Eigenschaft?

public ActionResult CreateAlta() 
     { 
      ViewBag.RolesApp = new SQLRolerecord().GetAllRolesInApp(); 
      return View(); 
     } 

Wie ein Dropdown-Menü aus der ViewBag Eigenschaft erzeugen kann RolesApp? GetAllRolesInApp() gibt ein IEnumerable<string> und mein Versuch ist unter:

<div class="form-group"> 
    <label class="col-sm-2 control-label">Role: </label> 
      <div class="col-sm-4"> 
      @Html.DropDownListFor("iroleeid", ViewBag.RolesApp, "--Select Role of User--"); 
      </div> 
</div> 

aber dies erzeugt einen Fehler DropDownListFor sagen, existiert nicht in der Htmlhelper.

Vielen Dank.

+0

Sie könnten Ihre IENumerable in eine SelectList konvertieren. Wie sieht dein Vorbild aus? ID und Name? – Max

+0

Meinst du statt 'string'' SelectList' zu verwenden? Mein Rollenmodell ist AppRole, das auf der IdentityRole-Klasse des Identity-Frameworks basiert. – ITWorker

+0

Ja, ein SelectListItem enthält einen Text und einen Wert, speichert die Zeichenfolge, die in der 'Text'-Eigenschaft angezeigt werden soll, Sie können einen eindeutigen Wert in 'Value' speichern, um zwischen mehreren SelectListItems zu unterscheiden. – Max

Antwort

2

Sie können die Liste von Strings auf eine Liste von SelectListItem ‚s konvertieren

var roles = new SQLRolerecord().GetAllRolesInApp() 
           .Select(f=>new SelectListItem { Value=f, Text = f}).ToList(); 
ViewBag.Roles= roles ; 

nun Ihrer Meinung nach, können Sie die DropDownList Helfer-Methode verwenden.

@Html.DropDownList("Roles") 

wird dies ein select-Element mit name und id Eigenschaftswerte "Roles" gesetzt erzeugen. Wenn Sie möchten, dass diese einen anderen Namen haben, verwenden Sie diese Überladung.

@Html.DropDownList("SelectedRole",ViewBag.Roles as List<SelectListItem>) 

Dies wird einen Drop-Down mit Namen und ID-Eigenschaftswert schafft auf "SelectedRole"

Da wir den Wert und Text von SelectListItem Objekt gleichen String-Wert einstellen, Ihr select-Element Option Wert und Text werden selbe

+0

Wenn ich dies versuche, bekomme ich den Fehler 'Es gibt kein ViewData Element des Typs 'IEnumerable ', das den Schlüssel 'SelectedRole' hat. 'beim Laden der Seite. – ITWorker

+0

Das ist unmöglich! Sind Sie sicher, dass Sie auch den ** zweiten Parameter ** haben? Der zweite Parameter gibt die Optionselemente explizit an – Shyju

+1

Macht nichts, Sie haben Recht. Als ich die Dinge kopiert habe, habe ich den Namen der ViewBag-Eigenschaft vermasselt, weil sie in meinem Code 'RolesApp' hieß. Danke für die Antwort und das ist eine funktionierende Antwort. – ITWorker

2

Sie versuchen, eine DropDownListFor zu verwenden, aber das erwartet, dass Sie ein Ansichtsmodell und eine Eigenschaft anhängen (mit einem Lambda). Ich glaube, Sie suchen ein DropDownList

@Html.DropDownList("iroleeid", 
       new SelectList(ViewBag.RolesApp), 
       "--Select Role of User--", 
       new { @class = "form-control" }) 
+0

Danke, das hat auch funktioniert. – ITWorker

1

Konvertieren Sie Ihre IENumerable<Role> zu einem SelectList.

Controller:

var selectList = new SqlRoleRecord().GetAllRolesInApp().Select(x => new SelectListItem { Value = x.Id, Text = x.Name }).ToList(); 
ViewBag.RolesApp = selectList; 

Ausblick:

@Html.DropDownListFor(x => x.SelectedRoleId, ViewBag.RolesApp, Model.SelectedRoleId) 

Optional:

Wenn Sie zum Speichern der SelectedRoleId zu Ihrem Modell eine Eigenschaft hinzufügen, können Sie es später verwenden auf in deinem Controller. Dies ist nützlich, wenn Sie die Rolle beispielsweise an einen Benutzer in der Datenbank binden müssen.


P.S. Nicht sicher, ob 100% arbeiten, kann in diesem Moment nicht kompilieren.

+0

Ich habe dies versucht, aber ich habe eine Fehlermeldung erhalten, dass die Zeichenfolge keine Definition für ID oder Name enthält. Ich denke, das ist, weil mein GetAllRolesInApp keine Liste von Modellen, sondern eine Liste von Zeichenfolgen zurückgibt. – ITWorker

+1

@ITWorker Id und Name sind Beispiele. Sie sollten die entsprechenden Werte aus Rollen als Text und Wert festlegen. Sie können 'Value = x.Id 'entfernen, wenn Sie nur eine Liste von Zeichenfolgen haben. – Max

+0

Danke, ich sehe jetzt. – ITWorker

Verwandte Themen