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

感谢您坚持我的一连串问题。我能够重现您的问题,并且经过大量尝试使其正常工作后,似乎这可能只是 MVC 框架中的一个错误,在 4 年多的时间里没有得到修复。

这个答案提供了两种解决方法: https ://stackoverflow.com/a/3529347/1945651

一个涉及使用有点冗长的代码来手动将值添加到 ModelState。

另一个要求您的项目列表可以使用方括号(例如数组或IList/ IList<T>)进行索引,然后涉及将当前值作为默认值添加到SelectList传递给 HTML 帮助器中:

@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 回答