无法将Model属性绑定到SelectListItem

时间:2014-12-18 08:18:59

标签: c# razor

我有几个类如下 -

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

的字典

EDIT1

如下所示,我将视图更改为(已修改为PDetailsICollection) -

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

但它仍然无效。 PDetailsICollection且绑定列表是IEnumerable这一事实是否可能导致此问题?

2 个答案:

答案 0 :(得分:1)

你应该是lambda表达式m =>

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

答案 1 :(得分:-1)

最后通过另一个帖子找到解决方案,所以把它放在这里。这是由于MVC4中的一个错误,其中详细说明了DropDownListFor绑定 - https://stackoverflow.com/questions/3501498

我将视图更改为如下所示,并且工作正常。

@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, new SelectList(ViewData["Types"] as IEnumerable, "Value", "Text", Model.PDetails.ElementAt(i).Type), "--Type--", htmlAttributes: new { @class = "form-control" })
        </div>
    </div>
}