我有一张表格,列出了特定客户的活动注册清单。我在每一行都有下拉列表,允许更改该行中给定事件的客户注册状态。但是,它们的当前状态未在列表中设置;每个列表中都会选择第一个项目。
视图模型:
public class EditRegistrationViewModel
{
public int SiteMemberId { get; set; }
public string Name { get; set; }
public List<EditParticipantViewModel> Participants { get; set; }
}
public class EditParticipantViewModel
{
public int ParticipantId { get; set; }
[Display(Name = "Event ID")]
public int EventId { get; set; }
[Display(Name = "Name")]
public string Name { get; set; }
[Display(Name = "Start Date")]
public string StartDateTime { get; set; }
[Display(Name = "Participation Status")]
public int SelectedParticipationStatus { get; set; }
public List<SelectListItem> ParticipationStatusList { get; set; }
}
查看(只是循环块的C#)
@for (int i = 0; i < Model.Participants.Count; i++)
{
<tr>
@Html.HiddenFor(m => m.Participants[i].ParticipantId)
<td class="text-right">@Model.Participants[i].EventId</td>
<td>@Model.Participants[i].Name</td>
<td>@Model.Participants[i].StartDateTime</td>
<td>@Html.DropDownListFor(
m => m.Participants[i].SelectedParticipationStatus,
Model.Participants[i].ParticipationStatusList,
new { @class = "form-control" })</td>
</tr>
}
控制器(填充初始值,但下拉列表未设置为它)
foreach (var i in participantQuery)
{
EditParticipantViewModel theItem = new EditParticipantViewModel()
{
ParticipationStatusList = tblEnum.GetSelectListForConstraintId(CRConstants.PARTICIPATION_STATUS_CONSTRAINT_ID),
ParticipantId = i.a.aID,
EventId = i.c.aID,
Name = i.c.tName,
SelectedParticipationStatus = i.b.nParticipationStatus ?? 0
};
DateTime? startDate = i.d.GetStartDateTime();
theItem.StartDateTime = startDate.HasValue ? startDate.Value.ToString() : "-";
theViewModel.Participants.Add(theItem);
}
以下是获取选择列表的代码:
public static List<SelectListItem> GetSelectListForConstraintId(int constraintId)
{
CCSContext db = new CCSContext();
List<SelectListItem> theList = new List<SelectListItem>();
List<tblEnum> enumList = db.Enum.Where(x=>x.nConstraintID == constraintId).OrderBy(x=>x.nOrder).ToList();
foreach (var i in enumList)
{
SelectListItem theItem = new SelectListItem()
{
Text = i.tDisplayName,
Value = i.nIndex.ToString()
};
theList.Add(theItem);
}
return theList;
}
答案 0 :(得分:1)
当你必须在循环中使用html辅助方法来渲染输入元素并且你希望模型绑定能够完美地工作时,最好使用 EditorTemplates 。因此,您不需要编写大量代码来循环/操作输入元素名称等。
只需在EditorTemplates
或~\Views\Shared\
下创建一个名为~\Views\YourControllerName
的新文件夹,然后创建一个与您用作集合项类型的类名同名的视图({ {1}})
在那里有以下代码来呈现每一行
EditParticipantViewModel.cshtml
现在在强烈输入@model EditParticipantViewModel
<tr>
<td class="text-right">@Model.EventId @Html.HiddenFor(m => m.ParticipantId)</td>
<td>@Model.Name</td>
<td>
@Html.DropDownListFor(
m => m.SelectedParticipationStatus,
Model.ParticipationStatusList, new { @class = "form-control" })
</td>
</tr>
的主视图中,调用EditRegistrationViewModel
辅助方法
Html.EditorFor
这将为您的视图模型的@model EditRegistrationViewModel
<h2>Form using Editor template</h2>
@using (Html.BeginForm("Index", "Home"))
{
<table>
@Html.EditorFor(f=>f.Participants)
</table>
<input type="submit" />
}
集合中的每个项目呈现表格行,并且对于每一行,将预先选择所需的选项(假设您要为其设置正确的Participants
属性值GET操作中的每个项目,它与选项的SelectedParticipationStatus
属性值之一匹配。)
提交表单时,模型绑定也会起作用。
答案 1 :(得分:0)
在循环中绑定DropDownListFor
存在问题。你可以使用EditorTemplates
,也可以尝试这样的事情:
@Html.DropDownListFor(
m => m.Participants[i].SelectedParticipationStatus,
new SelectList(Model.Participants[i].ParticipationStatusList, "Value","Text",
Model.Participants[i].SelectedParticipationStatus),
new { @class = "form-control" })