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

Assign selectlist to dynamically created dropdown in MVC

我有如下静态 select 列表

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 开头的员工。在针对每个员工详细信息列出相同内容时,我需要列出上面的 select 列表以选择删除原因。

我是这样做的

控制器

    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 也与 effective_date 等文本类型相同,我可以 post 数据。但我需要它是下拉菜单。 我被困在那里

这给我一个 运行 时间错误

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

另外请想一想如何在 posting 时获取每个员工对应的值。

虽然这很老套,但我认为您想要做的是将您的 selectlistitem 数组转换为可枚举数组然后使用它?

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

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

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

注意:不要包含“--请select--”选项。使用接受 optionLabelDropDownListFor() 的重载(参见下文)。

假设模型命名为 Staff 那么视图需要是

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

而你 POST 方法需要

[HttpPost]
public ActionResult YourActionName(List<Staff> model)
{
}

在视图中使用 for 循环,结合强类型助手将确保您的表单控件使用索引器正确命名,并且可以绑定到 POST 中的集合方法。

旁注:您在编辑中发布的错误是由 ViewBag.DeletionReason 的值 null 引起的。也许是因为你 return 方法中的视图 POST 但没有重新分配 ViewBag.DeletionReason 的值?