我正在处理可以下载电子邮件的应用程序。在我看来,如果选中复选框/复选框,我想将ID传递给控制器以下载此消息。我将尝试用代码解释:
@using (Html.BeginForm("DownloadData", "Messages", FormMethod.Post))
{
<table class="table table-bordered table-hover">
@for (int i = 0; i < Model.Count; i++)
{
<tr>
<td><input type="checkbox"
name="selectedIds[@i].messageID"/></td>
<td>@Model[i].messageFrom</td>
<td>@Model[i].messageSubject</td>
<td>@Model[i].messageDate</td>
</tr>
}
</table>
<div class="col-md-offset-2 col-md-10">
<input type="submit" class="btn btn-default" value="Download" />
</div>
}
@i in name =&#34; selectedIds [@i] .messageID&#34;不会好,因为它增加,如果我检查:第一个第2和第4消息,它将只添加前两个元素到我的列表。
控制器:
[HttpPost]
public ActionResult DownloadData(List<MessagesModels> selectedIds)
{
return View(...);
}
模特:
public class MessagesModels
{
public int messageID { get; set; }
public string messageSubject { get; set; }
...
}
我认为这并不难,但无法找到溶剂。感谢那些可以提供帮助的人!
答案 0 :(得分:3)
为了避免仅针对此视图更改消息模型(或者如果您无法开始),我建议为此视图创建一个新模型以处理如下选择:
public class MessageSelectionViewModel
{
public MessagesModels Message { get; set; }
public bool IsSelected { get; set; }
}
您的视图现在将是这些新视图对象的列表,因此看起来更像是这样:
<td>@Html.CheckBoxFor(item => item[i].IsSelected)</td>
<td style="display:none;">@Html.HiddenFor(item => item[i].Message.Id)</td>
<td>@Model[i].Message.messageFrom</td>
<td>@Model[i].Message.messageSubject</td>
<td>@Model[i].Message.messageDate</td>
您的帖子方法将变为:
[HttpPost]
public ActionResult DownloadData(IEnumerable<MessageSelectionViewModel> selectedMessages)
{
foreach (int messageId in selectedMessages.Where(m => m.IsSelected == true).Select(m => m.Message.Id))
{
}
return View(...);
}
当然,如果这不是什么大问题,你可以节省一些时间和精力,只需像Stephen建议的那样将IsSelected
添加到你的模型中。