2013-11-27 9 views
24

Ich baue die folgenden SelectList in meinem Controller.ASP.NET MVC Dropdown-Liste von SelectList

var u = new NewUser(); 

u.UserTypeOptions = new SelectList(new List<SelectListItem> 
{ 
    new SelectListItem { Selected = true, Text = string.Empty, Value = "-1"}, 
    new SelectListItem { Selected = false, Text = "Homeowner", Value = ((int)UserType.Homeowner).ToString()}, 
    new SelectListItem { Selected = false, Text = "Contractor", Value = ((int)UserType.Contractor).ToString()}, 
}); 

return u; 

Und es auf meiner Ansicht wie diese Anzeige:

@Html.DropDownListFor(m => m.UserType, Model.UserTypeOptions) 

Es sieht aus wie ich es einen gültigen Satz von SelectListItem s in bin zu geben, was eine ziemlich einfache Drop-Down-Liste sein sollte, aber anstatt sich eine gültige <option> Liste mit guten Werten und Text, ich diese:

<select data-val="true" data-val-range="A user type must be selected." data-val-range-max="2" data-val-range-min="1" data-val-required="The UserType field is required." id="UserType" name="UserType" class="input-validation-error"> 
    <option>System.Web.Mvc.SelectListItem</option> 
    <option>System.Web.Mvc.SelectListItem</option> 
    <option>System.Web.Mvc.SelectListItem</option> 
</select> 

Was soll das? Soweit ich das beurteilen kann, sollte das funktionieren.

+0

Warum in aller Welt würden Sie eine 'SelectList' erstellen und dann einen anderen' SeelctList' daraus erstellen. Und die 'Selected' Eigenschaft von' SelectListItem' ist ebenso sinnlos - sie wird vom HtmlHelper ignoriert - ihr Wert der Eigenschaft 'UserType' bestimmt, was ausgewählt ist (das einzige Mal, dass die' Selected' Eigenschaft respektiert wird, ist beim Erstellen eine Dropdownliste, die nicht an Ihr Modell gebunden ist (zB '@Html.DropDownList ("NotAProperty", Model.UserTypeOptions) ') –

Antwort

43

Sie fehlen Einstellung, was Feld ist der Text und Wert im Select selbst. Deshalb gibt es für jedes Objekt in der Liste ein .ToString(). Sie könnten denken, dass es eine Liste von SelectListItem ist, sollte es klug genug sein, dies zu erkennen ... aber es ist nicht.

u.UserTypeOptions = new SelectList(
    new List<SelectListItem> 
    { 
     new SelectListItem { Selected = true, Text = string.Empty, Value = "-1"}, 
     new SelectListItem { Selected = false, Text = "Homeowner", Value = ((int)UserType.Homeowner).ToString()}, 
     new SelectListItem { Selected = false, Text = "Contractor", Value = ((int)UserType.Contractor).ToString()}, 
    }, "Value" , "Text", 1); 

BTW, können Sie eine Liste von Array jeglicher Art verwenden ... und legen Sie einfach den Namen der Eigenschaften, die als Text und Wert handeln.

Ich denke, es ist besser, es so zu tun:

u.UserTypeOptions = new SelectList(
    new List<SelectListItem> 
    { 
     new SelectListItem { Text = "Homeowner", Value = ((int)UserType.Homeowner).ToString()}, 
     new SelectListItem { Text = "Contractor", Value = ((int)UserType.Contractor).ToString()}, 
    }, "Value" , "Text"); 

ich den -1 Punkt entfernt, und die Einstellung der einzelnen Elemente wahr/falsch ausgewählt.

Dann Ihrer Ansicht nach:

@Html.DropDownListFor(m => m.UserType, Model.UserTypeOptions, "Select one") 

Auf diese Weise, wenn Sie setzen die „Wählen Sie eine“ Element, und Sie nicht setzen ein Element, wie in der Select ausgewählt, wird die UserType null sein (die UserType muss int? sein).

Wenn Sie eine der Select Elemente festlegen müssen, wie ausgewählt haben, können Sie verwenden:

u.UserTypeOptions = new SelectList(options, "Value" , "Text", userIdToBeSelected); 
+0

Es sollte wirklich, wirklich, wirklich schlau genug sein, um es herauszufinden. Das riecht wirklich nach einem dummen Entwickler-Argument zwischen den Framework-Designern, für die Microsoft berühmt ist. –

+0

Die Verwendung von 'new SelectList (...)', um ein zweites identisches 'IEnumerable ' aus dem ersten zu erstellen, ist nur sinnlos. –

+0

Und Ihr letzter Ausschnitt ist einfach falsch. Die vierte Option des 'SelectList'-Konstruktors wird ignoriert, wenn mit 'DropDownListFor()' an eine Eigenschaft gebunden wird - dies ist der Wert der Eigenschaft, der bestimmt, was ausgewählt ist. –

1

Try this,

Nur Beispiel:

u.UserTypeOptions = new SelectList(new[] 
              { 
               new {ID="1",Name="name1"}, 
               new{ID="2",Name="name2"}, 
               new{ID="3",Name="name3"}, 
              }, 
          "ID", "Name", 1); 

Oder

u.UserTypeOptions = new SelectList(new List<SelectListItem>{ 
        new SelectListItem { Selected = true, Text = string.Empty, Value = "-1"}, 
       new SelectListItem {Selected = false, Text = "Homeowner", Value = "2"}, 
       new SelectListItem{ Selected = false,Text = "Contractor", Value = "3"}, 
      },"Value","Text"); 
7

Versuchen Sie einfach t seine gestochen

@{ 
    var selectList = new SelectList(
     new List<SelectListItem> 
     { 
      new SelectListItem {Text = "Google", Value = "Google"}, 
      new SelectListItem {Text = "Other", Value = "Other"}, 
     }, "Value", "Text"); 
    } 

@Html.DropDownListFor(m => m.YourFieldName, selectList, "Default label", new { @class = "css-class" }) 

oder

@Html.DropDownList("ddlDropDownList", selectList, "Default label", new { @class = "css-class" }) 
Verwandte Themen