0

以下のようなクラスがいくつかあります-

public class P
{
    public int Id { get; set; }
    public virtual ICollection<PDetail> PDetails { get; set; }
}

public class PDetail
{
    public int Id { get; set; }
    public int Type { get; set; }
    public double Price { get; set; }
}

今、私のビューでは、それを次のように表示しています-

@foreach (var detail in Model.PDetails)
{
    <div class="row">
        <div class="col-sm-6">
           @Html.DropDownListFor(m => detail.Type, (IEnumerable<SelectListItem>)ViewData["Types"], "--Type--", htmlAttributes: new { @class = "form-control" })
        </div>
        <div class="col-sm-6">
            @Html.TextBoxFor(m => detail.Price, "", htmlAttributes: new { @class = "form-control", placeholder = "Price" })
        </div>
    </div>
}

ここでは、detail.Price詳細オブジェクトごとに表示できますが、ドロップダウン リストdetail.Typeから選択されていませんViewData["Types"]

PS: ViewData["Types"]typeIds = {1,2,3...} の単なる辞書です。

情報1

ビューを次のように変更してみました -

@for (int i = 0; i < Model.PDetails.Count(); i++)
{
    <div class="row">
        <div class="col-sm-6">
           @Html.DropDownListFor(m => m.PDetails.ElementAt(i).Type, (IEnumerable<SelectListItem>)ViewData["Types"], "--Type--", htmlAttributes: new { @class = "form-control" })
        </div>
    </div>
}

しかし、それはまだ機能していません。どうすれば修正できますか?

4

1 に答える 1

1

私の質問の弾幕に固執してくれてありがとう。私はあなたの問題を再現することができました.それを機能させるために何度も試みた後、これは4年以上修正されていないMVCフレームワークの単なるバグである可能性があります.

この回答は 2 つの回避策を提供します: https://stackoverflow.com/a/3529347/1945651

1 つは、やや冗長なコードを使用して手動で値を ModelState に追加する方法です。

もう 1 つは、アイテムのリストを角括弧 (配列やIList/など) でインデックス可能にする必要があり、現在の値をHTML ヘルパーに渡されるIList<T>デフォルト値として追加する必要があります。SelectList

@for (int i = 0; i < Model.PDetails.Count(); i++)
{
    <div class="row">
        <div class="col-sm-6">
           @Html.DropDownListFor(m => m.PDetails[i].Type, 
                                 new SelectList(ViewData["Types"] as IEnumerable, 
                                            "Value", "Text", Model.PDetails[i].Text), 
                                 "--Type--", 
                                 htmlAttributes: new { @class = "form-control" })
        </div>
    </div>
}

試してみませんか?

于 2014-12-21T19:19:43.123 に答える