2012-05-08 16 views
3

ASP.Net MVC 2を使用していて、DropDownListを適切にバインドするのに問題があります。MVC 2 DropDownListがリストの場合に値を選択しない

強く型付けされたViewModelとHTML.DropDownListForステートメントを使用して、自分のビューにドロップダウンを作成しています。このステートメントは、ViewModelの単純なフィールドにDropDownをバインドする「通常の」シナリオでうまく動作します。 ViewModelに複数のオブジェクトのList(配列)が含まれていて、これらのオブジェクトのそれぞれのフィールドを(個別の)DropDownにバインドする場合、このシナリオを使用する際に問題があります。その場合、DropDownは正しい初期値を取得しません。

例えば、複数の住所を持つことができる人がいる場合。各住所は、ストリート、市、州で構成されています。状態をドロップダウンとして表示したい。 私のモデルは次のとおりです。

public class PersonModel : CommonViewModel 
{ 
    public IList<SelectListItem> AvailableStates { get; set; } 

    public string Name { get; set; } 

    public IList<AddressModel> Addresses { get; set; } 

    public PersonModel() 
    { 
     AvailableStates = GenerateStates(); 
    } 

    private IList<SelectListItem> GenerateStates() 
    { 
     List<SelectListItem> items = new List<SelectListItem>(); 
     items.Add(new SelectListItem() { Text = "WA", Value = "WA" }); 
     items.Add(new SelectListItem() { Text = "NY", Value = "NY" }); 
     items.Add(new SelectListItem() { Text = "IH", Value = "IH" }); 
     items.Add(new SelectListItem() { Text = "FL", Value = "FL" }); 
     items.Add(new SelectListItem() { Text = "CA", Value = "CA" }); 

     return items; 
    } 
} 

public class AddressModel 
{ 
    public string Street { get; set; } 
    public string City { get; set; } 
    public string State { get; set; } 
} 

は今、私の見解で、私のようなものを使用したい:私は国家のためのテキストボックスを使用している場合、これはまた、(正常に動作テキストボックスについて

<% using (Html.BeginForm("SubmitPersonDetails", "Home", new { actionMode = "Person"}, FormMethod.Post, new { id = "SubmitPersonForm" })) 
    {%> 
    <div class="formrow longinput"> 
    <%= Html.LabelFor(person => person.Name)%> 
    <%= Html.TextBoxFor(person => person.Name)%> 
</div> 
<h4>Addresses</h4> 
<% for (int i = 0; i < Model.Addresses.Count; i++) { %> 
<div class="formrow"> 
<%= Html.TextBoxFor(person => person.Addresses[i].Street)%> 
<%= Html.TextBoxFor(person => person.Addresses[i].City)%> 
<%--<%= Html.TextBoxFor(person => person.Addresses[i].State)%>--%> 
<%= Html.DropDownListFor(person => person.Addresses[i].State, Model.AvailableStates) %> 
</div> 
<% } %> 
<input class="button primary" type="submit" value="Submit" name="Submit" /> 
<% } %> 

を、コメントを参照してくださいアウトビット)。 DropDownは正しく生成されますが、正しい値には設定されません。 DropDownsで値を選択してフォームを送信すると、正しい値がモデルに戻されます。

また、UserControlにAddress部分を入れてみましたが、これは複数回レンダリングされました。 Html.RenderPartialを使用してUserControlをレンダリングすると、DropDOwnに正しい値が設定されますが、Postbackにモデルに正しく設定されていません。 EditorForを使用してUserControlをレンダリングすると、上のコードと同じ問題が発生します。ドロップダウンの正しい初期値は取得できませんが、Postbackでは選択した値がモデルに設定されます。私が試した

もう一つは、アドレスではないリストを作成する代わりに、私のビューモデルに(プロパティ:アドレス1、アドレス2、アドレス3)複数のアドレスをハードコーディングされた当時と使用: <% = Html.DropDownListFor(人=>人を。 Address1.State、Model.AvailableStates)%> この場合、DropDownは正しい値を取得します。明らかに、私は柔軟性の欠如に対してこの回避策を使用したくありません。

私は間違っていますか?私はMVCに慣れていないので、多分私の全体的なアプローチが間違っていますか?

答えて

8

これは、使用しているような複合ラムダ式(配列インデックスアクセスを含むラムダ式)から値を抽出できないDropDownListForヘルパーの制限です。一つの可能​​な回避策は以下の通りである。我々は今、SelectListのコンストラクタで同じ値を渡しているが、この時間はDropDownListForヘルパーが適切に対応するオプションを設定することができるようになりますよう

<%= Html.DropDownListFor(
    person => person.Addresses[i].State, 
    new SelectList(
     Model.AvailableStates, 
     "Text", 
     "Value", 
     Model.Addresses[i].State 
    ) 
) %> 

それは少し醜いです。

+2

ありがとう、これはうまくいくようです。あなたが言っているように、私が期待していたほどエレガントではないかもしれないが、確かに受け入れられる。 –

+3

'dataValueField'パラメータは2番目で、' dataTextField'パラメータが3番目であるため、 "Text"と "Value"を切り替えることができます。 –

+0

「複雑な」ラムダから「選択された」値を抽出できないことがこれにはどこに記載されていますか? – Triynko

関連する問題