ASP MVC Binding可变数量的dropDownLists

时间:2016-04-01 21:34:09

标签: c# asp.net asp.net-mvc asp.net-mvc-4

我需要绑定可变数量的下拉列表,我该如何实现?

在我的项目中,到目前为止我只需要处理绑定到已知数量的下拉列表。为此,我简单地完成了以下操作:

视图模型

//for staff ddl
public List<Staff> Staff { get; set;     
public int? SelectedStaffId { get; set; }
public IEnumerable<System.Web.Mvc.SelectListItem> StaffItems
{
    get { return new System.Web.Mvc.SelectList(Staff, "StaffID", "FirstName"); }
}//end

视图

@Html.DropDownListFor(m => m.SelectedStaffId, Model.StaffItems, "--Who is taking appointment--", new { @class = "form-control", @id = "ddlValuer" })

现在我想绑定可变数量的下拉列表。我期望实现这个将是一个简单的循环,如下所示:(但是这样做&#39;工作)

视图模型

//for offerState ddl
public List<OfferState> OfferStates { get; set; }
public int? SelectedOfferStateId { get; set; }
public IEnumerable<System.Web.Mvc.SelectListItem> OfferStateItems
{
    get { return new System.Web.Mvc.SelectList(OfferStates, "OfferStateID", "Description"); }
}//end

查看

for (var i = 0; i < Model.Offers.Count; i++)
{
    <div class="row">
        <div class="col-lg-4">@Html.TextBoxFor(m => Model.Offers[i].Offer1, null, new { @class = "form-control", @disabled = "disabled" })</div>
        <div class="col-lg-8">@Html.DropDownListFor(m => Model.Offers[i].OfferStateID, Model.OfferStateItems, "--State--", new { @class = "form-control" })</div>
    </div>
}

从不选择项目 - 始终显示--state--(默认文本)。我已经逐步完成了代码,可以看到有三个带有OfferStateID的项目。

为什么始终选择默认值?还有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

这是在循环中使用DropDownListFor()的已知限制。您需要在每次迭代中构建新的SelectList,或使用EditorTemplate并将SelectList作为AdditionalViewData

传递给模板
for (var i = 0; i < Model.Offers.Count; i++)
{
    @Html.DropDownListFor(m => m.Offers[i].OfferStateID, new SelectList(Model.OfferStateItems, "OfferStateID", "Description", Model.Offers[i].OfferStateID), "--State--", new { @class = "form-control" })
}

其中OfferStateItemsIEnumerable<OfferStates>(不是SelectList

答案 1 :(得分:0)

在你的模型中只需更改:

 public IEnumerable<System.Web.Mvc.SelectListItem> OfferStateItems
{
    get { return new System.Web.Mvc.SelectList(OfferStates, "OfferStateID",     "Description"); }
}//end

到此

public List<OfferStates> OfferStateItems{get;set;}

然后为ModelView

创建一个构造函数
public yourViewModel()
{
      this.OfferStateItems=(place here the method to populate the list)
}

然后您可以将该列表与您需要的项目一起使用,并使用HTML帮助程序来编写项目。