将选择列表分配给MVC中动态创建的下拉列表

时间:2015-06-22 07:10:16

标签: asp.net-mvc html.dropdownlistfor

我有静态选择列表,如下所示

var listItems = new SelectListItem[] {
                new SelectListItem(){Text="-- Please Select --",Value=""},
                new SelectListItem(){Text="Death",Value="Death"},
                new SelectListItem(){Text="Resignation",Value="Resignation"},
                new SelectListItem(){Text="Retirement",Value="Retirement"},
                new SelectListItem(){Text="Termination",Value="Termination"},
                new SelectListItem(){Text="Transfer",Value="Transfer"},
            };

            ViewBag.DeletionReason = listItems;

并将其分配给ViewBag。

现在,在我的页面中,我必须搜索员工ID。

例如:1234

然后在下一个视图中列出所有员工ID以1234开头的员工。在针对每个员工详细信息列出相同内容时,我需要列出上面的选择列表以选择删除原因。

我按照以下方式完成了

控制器

    public ActionResult DeleteRequest(string[] memberIDs,string[] 
deletion_reason, string[] effective_date)
     {
    foreach (string item in memberIDs)
{

  np_user_requests_dtls userRequest = new np_user_requests_dtls();
  staffid = memberIDs[i];
  effectiveDateValue = effective_date[i];
  userRequest.staffid_id = staffid;
  userRequest.deletion_reason = deletion_reason[i];
userRequest.effective_date = Convert.ToDateTime(effectiveDateValue);

try
 {
   db.SaveChanges();

 }
  catch (exception ex)
                        {

                        }
                    }

                    i++;
                }

            }

查看

<table >
<thead>
<tr>
<th>
Staff ID
<th>
New Effective End Date
</th>
<th>
Deletion Reason
</th>
<th>
<input type="checkbox" name="checkAll" id="checkAll" value="1" style="width: 25px" />
<a href="javascript:void(0);" id="selectAllInResult"> Or  Select all in result</a>
<span id="span_effective_for_all" style="display:none">
<input type="text" name="effective_date_all" id="effective_date_all" value="" placeholder="Effective End Date All" class="datepicker" style="width: 150px" >&nbsp;<input type="button" name="cancelAll" id="cancelAll" value="Cancel" style="width: 60px" />
</span>
<span id="span_deletion_reason_all" style="display:none">
<select name="deletion_reason_all" id="deletion_reason_all" style="width: 150px">&nbsp;</select><input type="button" name="cancelAll" id="cancelAll" value="Cancel" style="width: 60px" />
</span>
</th>
</tr>
</thead>
<tbody>
 @if (Model != null && Model.Count() > 0)
{
foreach (var item in Model)
{
<tr>
<td>
@Html.DisplayFor(modelItem => item.staff_id)
</td>
<td>
<input type="text" name="effective_date[]" id="@("efddate_"+@item.staff_id)"  value="" placeholder="Effective End Date" class="datepicker"></td>
<td>
@Html.DropDownList("deletion_reason[]",(SelectList)@ViewBag.DeletionReason)
</td>
<td>
<input type="checkbox" name="memberIds[]" id="@item.staff_id" value="@item.staff_id_id" />
</td>
</tr>
}
</tbody>
</table>

模型

public string staff_id { get; set; }
public date effective_date { get; set; }
public string deletion_reason { get; set; }

在视图中,如果deletion_reason也与text_date这样的文本类型相同,我可以发布数据。但我需要它才能下拉。 我被困在那里

这给了我一个运行时错误

 There is no ViewData item of type 'IEnumerable<SelectListItem>' 
that has the key 'deletion_reason[]'.

另请注意如何在发布时获得与每位员工相对应的价值。

2 个答案:

答案 0 :(得分:1)

虽然它相当hacky,但我认为你要做的是将你的selectlistitem数组转换为可枚举然后使用它?

@Html.DropDownList("deletion_reason", ((SelectListItem[])@ViewBag.DeletionReason).ToList())

答案 1 :(得分:1)

首先,您可以将SelectList创建简化为

ViewBag.DeletionReason = new SelectList(new List<string>() { "Death", "Resignation", "Retirement", "Termination", "Transfer" });

注意:请勿包含“--Please select--”选项。使用接受DropDownListFor()的{​​{1}}重载(参见下文)。

假设模型名为optionLabel,则视图必须为

Staff

你的POST方法需要

@model List<yourAssembly.Staff>
.....
for(int i = 0; i < Model.Count; i++)
{
  @Html.HiddenFor(m => m[i].staff_id)
  @Html.DisplayForFor(m => m[i].staff_id)
  @Html.TextBoxFor(m => m[i].effective_date, new { @class="datepicker" })
  @Html.DropDownListFor(m => m[i].deletion_reason, (SelectList)ViewBag.DeletionReason, "-- Please Select --")
}

在视图中使用[HttpPost] public ActionResult YourActionName(List<Staff> model) { } 循环与强类型帮助程序一起使用将确保表单控件正确地使用索引器命名,并且可以绑定到POST方法中的集合。

附注:您在编辑中发布的错误是由for ViewBag.DeletionReason的值引起的。也许是因为您在POST方法中返回视图但未重新分配null的值?