IEnumerable数据未从视图传回控制器
本文关键字:控制器 视图 数据 IEnumerable | 更新日期: 2023-09-27 18:19:26
在我的MVC4 Project视图中,我正在将IEnumerable<Settings>
模型传递给视图。当我将表单提交回我的控制器时,控制器方法的参数为IEnumerable<Settings> data
。问题是data
始终为空。
查看
@model IEnumerable<Settings>
@using (Html.BeginForm("Index", "Layout", FormMethod.Post)))
{
@foreach (var item in Model)
{
@Html.CheckBoxFor(modelItem => item.IsActive, new { @value = item.Id })
@Html.DisplayFor(modelItem => item.Name)
}
<input type="submit" value="Save" />
}
控制器
[HttpPost]
public ActionResult Index(IEnumerable<Settings> data)
{
--actual code goes here
}
型号
[Serializable]
public class Settings
{
public virtual byte Id { get; set; }
public virtual string Name { get; set; }
public virtual bool IsActive { get; set; }
public virtual DataTable DataResult { get; set; }
public virtual int CreatedBy { get; set; }
public virtual DateTime CreatedDate { get; set; }
public virtual int ClientId { get; set; }
public virtual Int16 NoofItems { get; set; }
}
更新:*渲染HTML*
<td>
<input checked="checked" data-val="true" data-val-required="The IsActive field is required." id="item_IsActive" name="item.IsActive" type="checkbox" value="13" class="valid"><input name="item.IsActive" type="hidden" value="false">
# of pieces
</td>
更新1:Andrei 在以下回答后呈现的HTML
<td>
<input checked="checked" data-val="true" data-val-required="The IsActive field is required." name="[0].IsActive" type="checkbox" value="13"><input name="[0].IsActive" type="hidden" value="false">
# of pieces</td>
@Html.CheckBoxFor(modelItem => item.IsActive, new { @value = item.Id })
不会为输入生成正确的名称。您的表单为所有项目发送相同的令牌item.IsActive=true
(或false)。虽然这种方法适用于基元,但不适用于复杂类型。
然而,以下是您可以使用for
而不是foreach
进行的操作:
@model IList<Settings>
@using (Html.BeginForm())
{
@for(int i=0; i<Model.Count; i++)
{
@Html.CheckBoxFor(m => m[i].IsActive, new { @value = Model[i].Id })
@Html.DisplayFor(m => m[i].Name)
}
<input type="submit" value="Save" />
}
请注意,这至少需要IList<>
作为视图类型,否则您无法使用for
遍历集合。
可能需要将您的输入包装在一个表单中:
@using (Html.BeginForm()) {
@foreach (var item in Model)
{
@Html.CheckBoxFor(modelItem => item.IsActive, new { @value = item.Id })
@Html.DisplayFor(modelItem => item.Name)
}
<input type="submit" value="Save" />
}
你能发布renderred html吗?
我认为问题在于:输入的名称(复选框)将是html中的IsActive
。当您点击提交时,表单将提交密钥为IsActive
的数据。在您的控制器中,您当前需要一个名为data
的参数,因此存在不匹配。
您可以通过在控制器中添加断点并检查Request["IsActive"]是否有值来解决此问题。
更新:您可以在这里进行演练:
我认为您可以先尝试将输入的name
更改为data
。你可以试着用来做到这一点
@Html.CheckBoxFor(modelItem => item.IsActive, new { @value = item.Id, name="data" })
更改后,表单应该向控制器提交一个逗号分隔的值列表。你能打开firebug并在这里发布发布到控制器的内容吗?