Asp.net mvc如何将多个复选框值传递给控制器​​

时间:2016-04-06 21:47:17

标签: asp.net-mvc

我正在处理可以下载电子邮件的应用程序。在我看来,如果选中复选框/复选框,我想将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; }
    ...
    }

我认为这并不难,但无法找到溶剂。感谢那些可以提供帮助的人!

1 个答案:

答案 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添加到你的模型中。