C# IEnumerable数据不从视图传回控制器
在我的MVC4项目视图中,我将C# IEnumerable数据不从视图传回控制器,c#,asp.net-mvc-4,C#,Asp.net Mvc 4,在我的MVC4项目视图中,我将IEnumerable模型传递给视图。当我将表单提交回控制器时,控制器方法的参数为IEnumerable data。问题是数据总是空的 查看 @model IEnumerable<Settings> @using (Html.BeginForm("Index", "Layout", FormMethod.Post))) { @foreach (var item in Model) { @Html.CheckBoxFor(m
IEnumerable
模型传递给视图。当我将表单提交回控制器时,控制器方法的参数为IEnumerable 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" />
}
更新:
*呈现HTML*
#碎片
更新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>
#碎片
可能需要将您的输入包装成一个表单:
@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" />
}
@使用(Html.BeginForm()){
@foreach(模型中的var项目)
{
@CheckBoxFor(modelItem=>item.IsActive,新的{@value=item.Id})
@DisplayFor(modelItem=>item.Name)
}
}
您可以发布渲染的html吗
我认为问题在于:
输入的名称(复选框)在html中将是IsActive
。点击submit时,表单将使用键IsActive
提交数据。在控制器中,您当前需要一个名为data
的参数,因此存在不匹配
您可以通过在控制器中添加断点并检查请求[“IsActive”]是否有值来解决此问题
更新:
您可以查看演练:
我想您可以先尝试将输入的名称
更改为数据
。您可以尝试通过以下方式实现:
@Html.CheckBoxFor(modelItem => item.IsActive, new { @value = item.Id, name="data" })
更改后,表单应向控制器提交以逗号分隔的值列表。你能不能也打开firebug并在这里发布发布发布到控制器的内容
@Html.CheckBoxFor(modelItem => item.IsActive, new { @value = item.Id })
不会为输入生成正确的名称。您的表单为所有项目发送相同的令牌项。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" />
}
@model-IList
@使用(Html.BeginForm())
{
@对于(int i=0;i m[i].i活动,新{@value=Model[i].Id})
@DisplayFor(m=>m[i].Name)
}
}
请注意,这至少需要
IList
作为视图类型-否则您无法使用for
遍历集合您的控制器方法命中了吗?@BhushanFirake,是的,命中了,从那里我只分析了即时窗口,数据是索引操作方法的nullpost代码,你是如何从控制器返回结果的?@SanjeevRai,我将以视图模型的形式传递Collection
…我已经添加了,只是添加了部分代码。请参阅我的更新也可以将bool[]IsActive,string[]Name
作为参数+1,有价值的建议,并在即时窗口中选中'Request[“IsActive”],值为null@sTodorov我用呈现的HTML更新了我的问题,你能检查一下吗?+1,你好,这部分有效,现在数据不是空的,但是属性IsActive
始终为false
,is
始终为。我的意思是说,它的所有属性值都是默认的,而不是发布的…@SSS,您对类设置的建模是什么样子的?此外,现在正在为checkbox生成什么HTML?@SSS,出于某种原因,您在那里有两个输入,一个是checkbox,另一个是隐藏的。它们有相同的名称,并且都是发布的(针对每个项目),显然后者是隐藏的,由MVC拾取。由于所有隐藏项的值都设置为false
,因此这就是您得到的结果。我不确定此隐藏输入来自何处,但您需要删除它或为其指定其他名称,以使复选框正常工作。感谢您的时间,我接受您的回答,我刚刚通过从复选框中删除值字段进行了修复,我将其放在另一个隐藏字段中,现在它工作正常。。。
@Html.CheckBoxFor(modelItem => item.IsActive, new { @value = item.Id, name="data" })
@Html.CheckBoxFor(modelItem => item.IsActive, new { @value = item.Id })
@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" />
}