[英]How to pass IEnumerable list to controller in MVC including checkbox state?
我有一個mvc應用程序,我使用這樣的模型:
public class BlockedIPViewModel
{
public string IP { get; set; }
public int ID { get; set; }
public bool Checked { get; set; }
}
現在我有一個View來綁定像這樣的列表:
@model IEnumerable<OnlineLotto.Web.Models.BlockedIPViewModel>
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
}
@foreach (var item in Model) {
<tr>
<td>
@Html.HiddenFor(x => item.IP)
@Html.CheckBoxFor(x => item.Checked)
</td>
<td>
@Html.DisplayFor(modelItem => item.IP)
</td>
</tr>
}
<div>
<input type="submit" value="Unblock IPs" />
</div>
現在我有一個控制器來接收來自提交按鈕的動作:
public ActionResult BlockedIPList(IEnumerable<BlockedIPViewModel> lstBlockedIPs)
{
}
但是當我進入控制器動作時,我得到了lstBlockedIPs的空值。我需要在這里獲取復選框狀態。 請幫忙。
改為使用列表並用for
循環替換foreach
循環:
@model IList<BlockedIPViewModel>
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
@for (var i = 0; i < Model.Count; i++)
{
<tr>
<td>
@Html.HiddenFor(x => x[i].IP)
@Html.CheckBoxFor(x => x[i].Checked)
</td>
<td>
@Html.DisplayFor(x => x[i].IP)
</td>
</tr>
}
<div>
<input type="submit" value="Unblock IPs" />
</div>
}
或者,您可以使用編輯器模板:
@model IEnumerable<BlockedIPViewModel>
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
@Html.EditorForModel()
<div>
<input type="submit" value="Unblock IPs" />
</div>
}
然后定義模板~/Views/Shared/EditorTemplates/BlockedIPViewModel.cshtml
,它將自動為集合的每個元素呈現:
@model BlockedIPViewModel
<tr>
<td>
@Html.HiddenFor(x => x.IP)
@Html.CheckBoxFor(x => x.Checked)
</td>
<td>
@Html.DisplayFor(x => x.IP)
</td>
</tr>
您在控制器中獲取null的原因是您不尊重默認模型綁定器期望成功綁定到列表的輸入字段的命名約定。 我邀請您閱讀following article
。
閱讀完畢后,使用我的示例和您的示例查看生成的HTML(更具體地說,輸入字段的名稱)。 然后比較,你會明白為什么你的工作不起作用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.