Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
MVC 3 DropDownListFor
Grumbler85
myCSharp.de - Member



Dabei seit:
Beiträge: 550
Herkunft: Rheingau Taunus

Themenstarter:

MVC 3 DropDownListFor

beantworten | zitieren | melden

Hallo allerseits,

ich habe eine MVC3 DropDown-Liste, die nicht das erwartete Element als "selected" markiert und ich würde mich über einen Ratschlag freuen:

Die Liste wird initialisiert mit:


var displayNamesSelectList = new SelectList((IEnumerable<String>)ViewBag.AvailableDisplayNames, Model.DisplayName);
Prüfe ich während des Debuggens, ist der korrekte Eintrag als "selected" markiert und zwar NUR der korrekte Eintrag, also auch kein weiterer.

Nach dem Ausführen von

@Html.DropDownListFor(model => model.DisplayName, displayNamesSelectList)
ist aber leider der erste Eintrag markiert. Kurz vor der Ausführung, ist die SelectList noch in Ordnung (geprüft mit dem Debugger).

Ein weiteres Feld mit dem Namen "DisplayName" existiert nicht und es wird auch im QueryString kein solcher Name übergeben.
Ein Label, dass den gleichen Inhalt wie die DropDown-Box hat, zeigt den erwarteten Text an.

Vielen Dank für Hinweise :)
Der Vorteil der Klugheit liegt darin, dass man sich dumm stellen kann - umgekehrt ist das schon schwieriger (K. Tucholsky)
Das Problem mit Internet-Zitaten ist, dass sie oftmals zu unrecht als authentisch angenommen werden. (K. Adenauer)
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16149

beantworten | zitieren | melden

* Benutz ViewModels und lass den ViewBag weg
* generiere eine Liste von SelectListItem direkt im Controller und gib dem korrekten Element den Eintrag Selected = true
!!! Die Logik gehört in den Controller - nicht in die View !!!

=> Problem weg
- performance is a feature -

Microsoft MVP - @Website - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers
Grumbler85
myCSharp.de - Member



Dabei seit:
Beiträge: 550
Herkunft: Rheingau Taunus

Themenstarter:

beantworten | zitieren | melden

Leider funktioniert dein Vorschlag so nicht.

Ich habe es mal genauer betrachtet - ein Umbenennen von DisplayName > DisplayedName bringt den gewünschten Erfolg.

Lieber wäre es mir allerdings, wenn ich wüßte, warum das nicht mit "DisplayName" funktioniert.

Das auswählen und generieren einer SelectList aus einer anderen Liste kann man im Übrigen durchaus als "View-Logik" bewerten, weshalb es in der View stehen darf - zumindest hier bei uns.
Der Vorteil der Klugheit liegt darin, dass man sich dumm stellen kann - umgekehrt ist das schon schwieriger (K. Tucholsky)
Das Problem mit Internet-Zitaten ist, dass sie oftmals zu unrecht als authentisch angenommen werden. (K. Adenauer)
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16149

beantworten | zitieren | melden

Der Vorschlag funktioniert - nutz ich auf >100 Seiten :)

Controller:

public ActionResult UserDetails( string userName = null )
{
   var myViewModel = new MyUserDetailsViewModel( );
  
   IEnumerable<MyUserEntity> users;
   using ( var userRepository = new UserRepository ( base.DbContext ) )
   {
       users = userRepository .GetAll( );
   }

   myViewModel.UserList = from user in users
                                       select new SelectListItem
                                       {
                                           Text = user.Name,
                                           Value = user.Name,
                                           Selected = ( userName != null && selectedName.Equals( user.Name, StringComparison.OrdinalIgnoreCase ) )
                                       };

   
return View("~....../UserDetails.cshtml", myViewModel);
}


View:
@Html.DropDownListFor(model => model.UserName, myViewModel.UserList);

Trotzdem ist es nicht mehr ratsam, auf ViewBag und Co zu setzen.
Es ist a) im Verhältnis langsam und b) absolut unsauber, da eben untypisiert und damit fehleranfällig.

Was DisplayedName sein soll seh ich hier nirgens; dmait kann ich Dir auch kein Grund nennen.
- performance is a feature -

Microsoft MVP - @Website - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers
Grumbler85
myCSharp.de - Member



Dabei seit:
Beiträge: 550
Herkunft: Rheingau Taunus

Themenstarter:

beantworten | zitieren | melden

Ich wollte nicht sagen, dass dein Vorschlag blödsinn ist - was aber mein Problem angeht, so liefert es keine Lösung.

Ich nun auch die ViewBags entfernt. Aber es bleibt dabei - model.DisplayName im DropDownListFor führt zum falschen markierten Eintrag.

Die Änderung der Selektion passiert beim Aufruf von DropDownListFor - vorher ist die Selektion ja korrekt. Und wie gesagt - ein anderer Name umgeht das Problem - das ist nicht optimal, aber reicht mir für den Moment.
Ich hätte gerne mit dem Debugger reingeschaut, aber weder der MS Symbol-Server noch Reflector erlauben mir das - und zum eindinden der MVC3 Quellen war ich .. nicht motiviert genug.
Der Vorteil der Klugheit liegt darin, dass man sich dumm stellen kann - umgekehrt ist das schon schwieriger (K. Tucholsky)
Das Problem mit Internet-Zitaten ist, dass sie oftmals zu unrecht als authentisch angenommen werden. (K. Adenauer)
private Nachricht | Beiträge des Benutzers