Laden...

SelectList Konstruktor 4. Überladung

Erstellt von CoderboyPB vor 10 Jahren Letzter Beitrag vor 10 Jahren 1.637 Views
C
CoderboyPB Themenstarter:in
327 Beiträge seit 2008
vor 10 Jahren
SelectList Konstruktor 4. Überladung

ich habe folgenden Code:


private SelectList getFarben()
{
    List<Object> colours = new List<Object>(){
        new {value="1", text="black"},
        new {value="2", text="white"},
        new {value="3", text="blue"}
    };
            
    return new SelectList(colours, "value", "text", "white");
}

ViewBag.colours = getFarben();

sowie in der View:


@Html.DropDownListFor(model => model.Farbe, (SelectList)ViewBag.colours)

Das Ganze klappt auch soweit, außer, dass der vorbestimmte Wert ('white') nicht selektiert ist.
Aber laut MSDN und Intellisense von VS ist der vierte Wert des Konstruktors in dieser Überladung der 'selected value'.

Irgendjemand ne Ahnung, was hier schief läuft?

T
314 Beiträge seit 2013
vor 10 Jahren

value von white wäre aber 2 !?

mal probiert?

C
CoderboyPB Themenstarter:in
327 Beiträge seit 2008
vor 10 Jahren

Habe es gerade mal probiert.
Er zeigt trotzdem black (das erste Element) an.

Das war also NICHT der Fehler ...

T
314 Beiträge seit 2013
vor 10 Jahren
private SelectList getFarben()
        {
            List<Object> colours = new List<Object>(){
        new {value="1", text="black"},
        new {value="2", text="white"},
        new {value="3", text="blue"}
    };
            return new SelectList(colours, "value", "text", "3");
        }

funktioniert wunderbar und zeigt blue als selected

C
CoderboyPB Themenstarter:in
327 Beiträge seit 2008
vor 10 Jahren

Habe das 1:1 mit copy and paste kopiert. Bei mir zeigt es weiterhin black an ...
Verstehe das nicht ...

T
314 Beiträge seit 2013
vor 10 Jahren

Im View siehts eben so aus (da kein model)

@Html.DropDownList("farben",(SelectList)ViewBag.colours)
C
CoderboyPB Themenstarter:in
327 Beiträge seit 2008
vor 10 Jahren

Ja, es liegt tatsächlich an der Helper Funktion.
Wobei sich mir nun nicht der Unterschied erschließt und das Model wie folgt aussieht, also Farbe durchaus enthält:


public class Verein
    {
        public string Name { get; set; }
        public string Farbe { get; set; }
        [Required(ErrorMessage="You must apply a value")]
        public int Gruendung { get; set; }
    }

Die Idee ist halt, dass ich eine Editier View bekomme, wo die Felder mit den aktuellen Werten vorausgefüllt werden, wofür ja diese ...For Funktionen sind, aber auch, dass eine SelectBox für die Farbauswahl mit dem aktuellen Wert als Voreinstellung.

16.834 Beiträge seit 2008
vor 10 Jahren

Zu aller erst: ich halte nichts von der Art und Weise wie Du versuchst eine SelectList zu erstellen - ich halte aber ehrlich gesagt auch nichts von den Standard HtmlHelpern die MVC mitliefert.
ASP.NET MVC ist dazu gedacht, dass der Entwickler mehr Freiheiten hat und mehr selbst in die Code-Generierung bzw. Html-Generierung eingreifen kann - das ist gut so, auch wenn das an der ein oder anderen Stelle 2-3 Zeilen Code mehr verlangt.
(Natürlich verwende ich Helfer, aber eigene)

ASP.NET WebForms verwendet ListItem
ASP.NET MVC verwendet SelectListItem
Du hast hier offensichtlich MVC, weil Du mit Razor arbeitest.
Dass man Object verwendet - genauso wie den ViewBag - ist faulheit und alles andre als sauber.

Variante 1:
Du baust Dir ein sauberes ViewModel (wird an die View übergeben) und ein sauberes SubmitModel (kommt bei der Action an):

public class MyDummyViewModel
{
    public List<String> Colors {get;set;}
    public MyDummySubmitModel SubmitModel {get;set;}
}

public class MyDummySubmitModel
{
    public String SelectedColorName {get;set;}
}

Die Actions wären nach meinem Stil wie folgt:


public ActionResult Create()
{
    var viewModel = GetMyDummyViewModel();
    return View("blalba.cshtml", viewModel);
}

[HttpPost]
public ActionResult Create(MyDummySubmitModel submitModel)
{
    var viewModel = GetMyDummyViewModel(submitModel);

   // Hier prüfen, ob das SubmitModel überhaupt gültig ist, also eine gültige Farbe etc überliefert wurde.

    return View("blalba.cshtml", viewModel);
}

private MyDummyViewModel GetMyDummyViewModel(MyDummySubmitModel submitModel = null)
{
   var viewModel = new MyDummyViewModel ();
   viewModel.Colors < hier füllen > - wenn Du mehrere Sprachen verwendest, dann arbeite nicht mit List<String> sondern mit Dictionary<Int32, String>()

  viewModel.SubmitModel = submitModel ?? new MyDummySubmitModel();

  return viewModel;
}

Und die View


@model MyDummyViewModel 

- html zeugs hier

<select id="SelectedColorName" name="SelectedColorName">
   <option value=""></option>
   foreach(var entry in Model.Colors)
   {
       if(entry.Equals(SubmitModel.SelectedColorName, StringComparison.OrdinalIgnoreCase))
       {
            <option value="@(entry)">@(entry)</option>
       }
   }
</select>
- weiteres zeugs -


Variante 2:
Du verwendest echte POCO Klassen und lässt den Object-Quatsch weg.
Anschließend dann

Html.DropDownListFor(myModel => myModel.MyColorId, new SelectList(Colors, "ColorName", "ColorName"))

Das Problem ist hier (meiner Menung) aber: Du kannst ViewModel und SubmitModel nicht trennen, sondern arbeitest unsauber nur mit einem ViewModel.

Alles hier im Editor getippt - keine Gewähr, dass das Zeug so kompiliert oder Tippfehler enthalten sind.

C
CoderboyPB Themenstarter:in
327 Beiträge seit 2008
vor 10 Jahren

Danke nochmal für die Antworten 😃