2012-04-13 5 views
0

Ich versuche, meine Html.Listbox mit allen Benutzern meiner ASP.NET-Benutzerdatenbank aufzufüllen.SelectList akzeptiert mein SelectListItem-Objekt nicht

Ich habe ein Ansichtsmodell geschaffen, das wie folgt aussieht:

using System; 
using System.Collections.Generic; 
using System.ComponentModel.DataAnnotations; 
using System.Globalization; 
using System.Web.Mvc; 
using System.Web.Security; 

namespace SkyLearn.Areas.Users.Models 
{ 
public class UsersViewModel 
    { 
     MembershipUserCollection membershipuserscollection { get; set; } 
     public List<MembershipUser> membershipuserslist { get; set; } 
     public List<SelectListItem> AvailableUsers { get; set; } 

     public UsersViewModel() 
     { 
      availableUsers = new List<SelectListItem>(); 
     } 
    } 
} 

Und eine Action, die das wie folgt aussieht:

 public ActionResult Index() 
    { 
     var users = Membership.GetAllUsers().Cast<MembershipUser>(); 

     UsersViewModel model = new UsersViewModel(); 

     foreach (MembershipUser user in users) 
     { 
      SelectListItem selectuser = new SelectListItem(); 

      selectuser.Text = user.UserName; 
      selectuser.Value = user.UserName; 

      model.AvailableUsers.Add(selectuser); 
     } 

     return View(model); 
    } 

Auf meiner Sicht Ich versuche, die Liste wie folgt zu füllen:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<SkyLearn.Areas.Users.Models.UsersViewModel>" %> 


<%= Html.ListBox("AvailableUsers", Model.AvailableUsers)%> 

Wenn ich den Code ausführen, bekomme ich den folgenden Fehler:

CS1579: foreach-Anweisung auf Variablen des Typs nicht arbeiten kann ‚SkyLearn.Areas.Users.Models.UsersViewModel‘ weil ‚SkyLearn.Areas.Users.Models.UsersViewModel‘ keine öffentliche Definition für ‚GetEnumerator‘ enthält

Antwort

1

AvailableUsers ist nicht initialisiert, Sie können dies beispielsweise im Konstruktor Ihres ViewModels tun.

public class UsersViewModel 
    { 
    public UsersViewModel { 
     AvailableUsers = new List<SelectListItem>(); 
    } 
    MembershipUserCollection membershipuserscollection { get; set; } 
    public List<MembershipUser> membershipuserslist { get; set; } 
    public List<SelectListItem> AvailableUsers { get; private set; } 
} 
+0

Es war richtig, dass ich vergessen habe, einen Konstruktor zu machen. leider hat das gerade ein neues problem für mich ergeben xD ich fing an, meine haare auf diesem zu reißen. CS1061: 'System.Collections.Generic.IEnumerable ' enthält keine Definition für 'availableUsers' und keine Erweiterungsmethode 'availableUsers', die ein erstes Argument vom Typ 'System.Collections' akzeptiert .Generic.IEnumerable 'könnte gefunden werden (fehlt eine Verwendungs-Direktive oder eine Assembly-Referenz?) nicht sicher, ob dies für Sie sinnvoll ist? – AronChan

+0

Hmmm, wo passiert das? Woher kommt das IEnmerable , ist das das Modell Ihrer Ansicht? –

+0

Irgendwie scheint es, dass es mein ViewModel-Objekt jetzt als Enumerable ansieht. Ich kann keine der Listen darauf aus meiner Sicht zugreifen: S – AronChan

0

Das Problem ist, dass Sie die gleichen Namen wie das erste Argument des ListBox Helfers als Eigenschaft auf Ihrem View-Modell (AvailableUsers) verwenden. Das ist nicht korrekt. Das erste Argument sollte eine Eigenschaft in Ihrem Ansichtsmodell darstellen, die verwendet wird, um die ausgewählten Werte zurück zu binden. Im Fall eines ListBox-Helpers sollte dies eine Sammlung sein, da der Benutzer mehrere Werte auswählen kann. Im Fall eines DropDownList-Helpers sollte dies eine einfache Skalareigenschaft sein. Das zweite Argument (in beiden Fällen) stellt eine Sammlung von SelectListItem dar, die zum Rendern der verfügbaren Optionen verwendet wird.

Also lassen Sie uns ein Beispiel nehmen, wie Sie die Ansicht Modell verbessern könnte:

public class UsersViewModel 
{ 
    public string[] SelectedUsers { get; set; } 
    public IEnumerable<SelectListItem> AvailableUsers { get; set; } 
} 

und dann die Steuerung:

public ActionResult Index() 
{ 
    var users = Membership.GetAllUsers().Cast<MembershipUser>(); 
    var model = new UsersViewModel 
    { 
     AvailableUsers = users.Select(x => new SelectListItem 
     { 
      Value = x.UserName, 
      Text = x.UserName 
     }) 
    }; 
    return View(model); 
} 

und schließlich die Ansicht:

<%@ Page 
    Title="" 
    Language="C#" 
    MasterPageFile="~/Views/Shared/Site.Master" 
    Inherits="System.Web.Mvc.ViewPage<UsersViewModel>" 
%> 

<%= Html.ListBoxFor(x => x.SelectedUsers, Model.AvailableUsers) %> 

Sie werde feststellen, dass ich die membershipuserscollection und die membershipuserslist Eigenschaft losgeworden bin ie, die Sie ursprünglich in Ihrem Sichtmodell hatten, die in diesem Beispiel keinen Zweck erfüllen. Der erste ist privat und der zweite ist eine Sammlung von einem Domain-Modell (MembershipUser), so dass es absolut keinen Platz in einem Ansichtsmodell hat.

+0

Ich habe nicht viel Erfahrung in der Codierung mvc3 und ich muss sagen, ich kann wirklich nicht meinen Kopf um Ihr Codebeispiel wickeln. Gibt es eine Chance, dass du ein paar Kommentare in den Code schreiben kannst, um mir genau zu sagen, was Schritt für Schritt passiert? offensichtlich möchte ich es richtig machen. aber es ist wichtig für mich zu verstehen, was ich mache, anstatt nur Nudeln zu kopieren :) – AronChan

Verwandte Themen