2017-08-14 9 views
-1

私はループ中で、リスト内の "Selected"アイテムをオンザフライで変更しようとしています。@ Html.DropDownListFor選択したアイテムが機能しない

ただし、デフォルトの項目は選択されていません。ソースhtmlを見ると、「選択された」パラメータはありません。

public List<SelectListItem> buyerDropdown { get; set; } 
public int selectedBuyer { get; set; } 

はここに私のコードです:

はここに私のクラスである

@foreach (American_States state in Model.AmericanStates) 
    { 
     { 
      // change the "selected" buyer to match the buyer Id for this state 
      Model.buyerDropdown.Where(x => x.Value == Convert.ToString(state.Buyer.Id)).FirstOrDefault().Selected = true; 
     } 
     <tr> 
      <td>@state.name</td> 
      <td>@state.Title.OfficerName</td> 
      <td>@Html.DropDownListFor(model => model.selectedBuyer, Model.buyerDropdown, new { @class = "form-control" })</td> 
      <td></td> 
     </tr> 
    } 

私はコードにステップするとき、私はSelectItemListで正しい項目を「選択」するように更新されて見ることができます。

ドロップダウンの正しい項目が選択されていない理由がわかりません。 T-ロイに基づいてUPDATE

私は今、このコードを持っている:

私は、正しい値が選択されたインデックス値に対して計算されているが、ドロップダウンがまだデフォルトを選択していないデバッグする場合値:そのID年代のオフに基づいて値を見つけようとして扱う...それはのでSingle()メソッドを使用するのがベストプラクティスです

@foreach (American_States state in Model.AmericanStates) 
    { 
     { 
      // change the "selected" buyer to match the buyer Id for this state 
      string selectedOption = Model.buyerDropdown.Single(x => x.Value == Convert.ToString(state.HudHomeStore_Buyer.Id)).Value; 
     <tr> 
      <td>@state.name</td> 
      <td>@state.HudHomeStore_Title.OfficerName</td> 
      <td>@Html.DropDownListFor(model => model.selectedBuyer, new SelectList(Model.buyerDropdown, "Value", "Text", selectedOption), new { @class = "form-control" })</td> 
      <td></td> 
     </tr> 
     } 
    } 
+0

あなたのモデルクラスはselectedBuyerをどのように処理しますか?すべてのAmericanStateで同じプロパティを使用しているようですか? –

+0

コードは単純に意味がありません。同じプロパティにバインドするループ内に複数のドロップダウンを作成します。無効なhtml(重複する 'id'属性)を生成するだけでなく、送信時に最初のドロップダウンだけがモデルにバインドされます。実際にここで何をしようとしていますか? –

+0

そしてモデルバインディングはあなたのプロパティの値にバインドするので、選択されたものを決定する 'selectedBuyer'の値になります(' selectedBuyer'の値がオプション値の1つと一致すれば、選択されますが、 –

答えて

0

まず、は一意でなければなりません。 .WhereFirstOrDefaultとタグ付けした場合、同じIDで1つ以上の値が存在する可能性がありますが、Singleは唯一の一意のレコードを見つける責任があります。

@foreach (American_States state in Model.AmericanStates) 
{ 
    { 
     int selectedOptionInt; 
     // change the "selected" buyer to match the buyer Id for this state 
     var selectedOption = Model.buyerDropdown.Single(x => x.Value == Convert.ToString(state.Buyer.Id)).FirstOrDefault().Value; 
     var isNumber = Int32.TryParse(selectedOption, selectedOptionInt); 
    } 
    <tr> 
     <td>@state.name</td> 
     <td>@state.Title.OfficerName</td> 
     <td>@Html.DropDownListFor(model => model.selectedBuyer, new SelectList(Model.buyerDropdown, "Key", "Value", selectedOptionInt), new { @class = "form-control" })</td> 
     <td></td> 
    </tr> 
} 

これが役立つかどうか教えてください。

+0

残念ながらそれはうまくいきませんでした - しかし、ありがとう! –

+0

@TrevorDaniel 'selectedOption'は正しい値を受け取りますか? –

+0

正しいIDが計算されていますが、ドロップダウンはそれでもデフォルト値にすることを拒否します –

0

foreachループの代わりに、単純なforループを使用する必要があります。これは、生成されたドロップダウンリストのname属性がMVCが期待する形式にならないためです。私は、命名には適切なバインディングのためにインデクサーが必要だと思います。これはまた、foreachを使用している間にあなたが潜在的に直面するかもしれないPOSTの問題に役立ちます。

関連する問題