Laden...

[erledigt] MultiSelectList: Selected Values werden nicht markiert!

Erstellt von Steffo vor 10 Jahren Letzter Beitrag vor 10 Jahren 2.989 Views
S
Steffo Themenstarter:in
45 Beiträge seit 2013
vor 10 Jahren
[erledigt] MultiSelectList: Selected Values werden nicht markiert!

Hallo,
ich habe ein unglaublich popliges Problem, dass ich mit der SelectList nicht habe!
Ich will in einer MultiSelectList einfach Einträge markieren!

Hier mein Code dazu:

private void PopulateFields(IEnumerable<int> selMembers = null, IEnumerable<string> selLang = null, IEnumerable<int> selLeaders = null)
        {
            List<int> mem = new List<int> { 1, 2 }; // Test mit Dummy!
            List<String> lang = new List<String> { "DE", "EN" }; // Test mit Dummy!

            ViewBag.Members = new MultiSelectList(db.LoginUsers, "PersonID", "FullName", mem);
            ViewBag.Languages = new MultiSelectList(db.Language, "Abbreviation", "Name", lang);
            ViewBag.Teamleaders = new MultiSelectList(db.Teamleader, "PersonID", "FullName", selLeaders);
        }

Damit ihr seht, dass die Values tatsächlich richtig sind, habe ich vom Firefox-CodeInspector für Language ein paar Options rauskopiert. Hier sollte bei "DE" z. B. ein "selected" stehen. Tut es aber nicht!

<select id="Languages" name="Languages" multiple="multiple">
    <option value="AF"> … </option>
    <option value="AR"> … </option>
    <option value="DA"> … </option>
    <option value="DE"> … </option>
</select>

Jemand eine Idee, weshalb das nicht klappt?

Danke im Voraus!

Liebe Grüße
Steffo

S
Steffo Themenstarter:in
45 Beiträge seit 2013
vor 10 Jahren

Ich habe meinen Code nun auf das Nötigste reduziert und es wird nun immer noch nichts vorselektiert. Wo kann der Fehler nur sein?!

List<Language> lLang = new List<Language> 
            { 
                new Language { Abbreviation = "DE", Name = "German" }, 
                new Language { Abbreviation = "IT", Name = "Italian" } 
            };

ViewBag.Languages = new MultiSelectList(lLang, "Abbreviation", "Name", new string[] { "DE", "IT" });

Edit.cshtml

<div class="editor-label">
        @Html.LabelFor(model => model.SpokenLanguages)
</div>
<div class="editor-field">
        @Html.ListBox("Languages", ViewBag.Languages as MultiSelectList)
</div>

Danke im Voraus!

L. G.
Steffo

16.806 Beiträge seit 2008
vor 10 Jahren

a) arbeite mit ViewModels
b) lass den ViewBag weg - das ist Mist
c) arbeite mit der SelectList bzw. mit SelectListItem
d) lass die HTML Helper weg und mach das von Hand und sauberem HTML-Code.

S
Steffo Themenstarter:in
45 Beiträge seit 2013
vor 10 Jahren

Ich hätte schon Interesse daran zu wissen wo der Fehler liegt und weniger daran ein Breitband-Antibiotikum um die Ohren geschlagen zu bekommen, wo ich nicht weiß, ob ich den Fehler dann immer noch habe...

EDIT: Zumal SelectList nicht meine Anforderung abdeckt mehrere Einträge markieren zu können!

L. G.
Steffo

5.941 Beiträge seit 2005
vor 10 Jahren

Hallo Steffo

Wenn du die Entwicklung ernst nimmst und dir Qualität und vermeiden von Fehlerquellen lieb ist, nimm die Ratschläge von Abt an.

Den Fehler hast du nicht mehr, wenn du von Hand das HTML aus der Liste erzeugst, ausser du baust den gleichen Fehler von Hand ein, was unwahrscheindlich ist.

Recht hast du sicherlich, das es trotzdem interessant wäre, woran der Fehler liegt.
Ich hatte einmal ein ähnliches Problem. Damals lag es an einer Überladung die nicht passte.

Am besten suchst du dafür einmal Englisch nach deinem Problem. Du findest bestimmt etwas.

Gruss Peter

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

16.806 Beiträge seit 2008
vor 10 Jahren

Doch, die SelectListItem funktioniert.
Schau meine Tipps wenigstens an statt große Töne zu spucken, wenn Du keine Ahnung hast. Sorry, wenns so deutlich ist.

  • Erstelle eine List<SelectListItem>
  • Füge alle Sprachen hinzu
  • Setze von allen Sprachen, die selektiert werden sollen, das Selected-Property auf True
  • In der View iterierst Du über alle Einträge und setzt selcted="selected" bei den entsprechen selektierten Options

Eine Select und eine MultpleSelectList ist auf HTML Seite identisch, außer, dass die zweite Variante eben noch das multiple-Attribut besitzt. Von der Erstellung aber absolut identisch.

@Peter: danke.

S
Steffo Themenstarter:in
45 Beiträge seit 2013
vor 10 Jahren

Hallo,
wie es aussieht, habe ich die API einfach falsch verwendet. So geht's:

<div class="editor-field">
        @Html.ListBox("Languages")
</div>

Ich habe den zweiten Parameter "ViewBag.Languages as MultiSelectList" einfach weg gelassen, da dort selektierte Werte erwartet werden und keine MultiSelectList-Instanz. Die selektierten Werte definiere ich ja schon im Controller, deswegen reicht es hier einfach nur den Key der ViewBag anzugeben.

Warum will ich nicht in Plain-HTML programmieren? Ich denke, wenn man das MVC-Framework erst mal richtig kennt, dann kann man damit effizienter arbeiten und der Code wird auch übersichtlicher. Es graust mir ein wenig in der View über Elemente zu iterieren. Das mache ich zwar vereinzelnd, aber eben nur dort, wo es nicht anders geht.
Ich möchte eure Kompetenzen sicherlich nicht Abrede stellen, sondern denke einfach nur, dass meine Herangehensweise einfach eine andere ist. Aber die Kritik bzgl. ViewModels akzeptiere ich voll und ganz und werde früher oder später wohl darauf zurückgreifen müssen.

Soweit vielen Dank für eure Hilfe!

L. G.
Steffo

16.806 Beiträge seit 2008
vor 10 Jahren

Warum will ich nicht in Plain-HTML programmieren? Ich denke, wenn man das MVC-Framework erst mal richtig kennt, dann kann man damit effizienter arbeiten und der Code wird auch übersichtlicher.

Genau das ist ein riesen Trugschluss und Anfängerfehler.

Warum statischen Code dynamisch ausführen wollen? Warum zwanghaft anonyme Übergaben erzwingen? Warum nicht auf Best Practices hören? Warum Magic Strings verwenden, die unfassbar hohen Wartungsaufwand nach sich ziehen?
Das ist kontraproduktiv für die komplette Performance. Bei einem Request ist das egal; bei hunderten oder gar tausenden aber ein Genickbruch.

Du bist neu im Bereich ASP.NET MVC; ich seit 6 Jahren dabei.
Aber jeder muss die Fehler erst mal selbst machen, bevor ers einsieht 😉 Es ist alles ein gut gemeinter Rat; aber manchmal muss man erst mal auf die Schnauze fallen, um was zu lernen und die Ratschläge der andren anzunehmen.
Die Frage ist hier nicht ob, sondern wann 😉.

A
350 Beiträge seit 2010
vor 10 Jahren

Ich würde gerne wissen ob es Messungen gibt mit Unterschieden zwischen zB Listfor und PlainHTML ?

Ansonsten gebe ich dir mit MagicStrings etc absolut recht 😉
Leider lebt MS es aber einem anders vor 😕

16.806 Beiträge seit 2008
vor 10 Jahren

Ja, ich hatte mir mal die Mühe mit ein paar HTML Helpern gemacht.
Der schlimmste war ActionLink.

Ich hab die zahlen nich im Kopf aber aufgeschrieben; aber es war so "drastisch", dass ich die Dinger verflucht habe und sie seitdem nicht wieder verwende und jedem kategorisch abrate. ASP MVC4 Custom AuthorizeAttribute, wenn AllowMultiple = true ist
Wie gesagt.. so nen einzelner Request ist nicht tragisch. Das merkt keine Sau. Aber bei 15.000 Requests pro Sekunde (und manchmal deutlich weniger) merkste das enorm.

Im mag MS. Ich mag MVC. Das muss also schon richtig beschissen sein, dass ich davon in diesem Umfeld abrate 😉