2013-11-27 21 views
24

私はコントローラに次のようなものを構築しています:SelectListSelectListからASP.NET MVCドロップダウンリスト

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; 

そして、このように私のビューに表示する:

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

私はそれを非常に簡単ドロップダウンリストがどうあるべきかでSelectListItem秒の有効なセットを与え、代わりに取得していますように見えます良好な値とテキストを持つ有効な<option>リスト、私はこれを取得:

<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> 

できますか?私が知る限り、これはうまくいくはずです。

+0

に世界であなたは1 'SelectList'を作成し、それから、別の' SeelctList'を作成する理由。 'SelectListItem'の' Selected'プロパティを設定することは、無意味です - HtmlHelperによって無視される - 何が選択されるかを決定するプロパティ 'UserType'の値(' Selected'プロパティが尊重される唯一の時間は作成時ですあなたのモデルに束縛されていないドロップダウンリスト(例えば '@Html。DropDownList( "NotAProperty"、Model.UserTypeOptions) ') –

答えて

43

テキストの値がのSelectList自体に設定されていません。そのため、リスト内の各オブジェクトに対して.ToString()が実行されます。あなたはそれがSelectListItemのリストであると考えると、これを検出するのに十分スマートでなければならないと思うかもしれませんが、そうではありません。

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); 

ところで、任意のタイプの配列のリストを使用して、テキストと値として機能するプロパティの名前を設定できます。

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"); 

は私が-1の項目を除去し、各項目の設定は、真/偽選択:

は、私はこのようにそれを行う方が良いと思います。

次に、あなたのビューで:(あなたが設定されている場合

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

この方法では、項目「いずれかを選択」、そしてあなたはSelectListの中で選択されたとして、UserTypeはnullになりますつの項目を設定していませんUserTypeint?である必要があります)。

あなたが選択したとしてSelectListの項目のいずれかを設定する必要がある場合は、あなたが使用することができます。

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

本当に本当に本当にそれを理解するには十分スマートでなければなりません。これは、マイクロソフトのようなフレームワークデザイナーの間で、愚かな開発者の議論を引き起こしています。 –

+0

'new SelectList(...)'を使って最初のものから2番目の同じ 'IEnumerable 'を作成するのは無意味な余分なオーバーヘッドです。 –

+0

最後のスニペットは間違っています。 'SelectList'コンストラクタの4番目のオプションは、' DropDownListFor() 'を使ってプロパティにバインドするときに無視されます - それは何が選択されるかを決定するプロパティの値です。 –

1

は、

だけの例を、これを試してみてください:

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

それとも

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

彼のかみそり

@{ 
    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" }) 

または

@Html.DropDownList("ddlDropDownList", selectList, "Default label", new { @class = "css-class" }) 
関連する問題