我创建了如下视图。
<%for (var i = 0; i < Model.customerCDTO.Count();i++)
{%>
<tr>
<td style="text-align: center; width: 10%;" class="table-content-middle">
<%if (Model.customerCDTO[i].Active == true)
{%>
<%=Html.CheckBoxFor(m=>m.customerCDTO[i].Active)%>
<%}
else
{ %>
<%=Html.CheckBoxFor(m => m.customerCDTO[i].Active)%>
<%} %>
</td>
<td class="table-content-middle" align="center" style="width: 80%;">
<%=Html.DisplayTextFor(m=>m.customerCDTO[i].Name)%>
</td>
</tr>
<%} %>
上述观点的问题在于它为customerCDTO [i] .Name
赋予null值下面是我的视图模型
public class CustomerVM
{
public List<CustomerCDTO> customerCDTO { get; set; }
}
在上面的视图模型中,我创建了一个List属性。 CustomerCDTO类定义如下。
public class CustomerCDTO
{
public string Name { get; set; }
public bool Active { get; set; }
public bool? IsChecked { get; set; }
}
请帮忙。
感谢
答案 0 :(得分:2)
它会为您提供null
值,因为您的表单不包含与<input>
属性相对应的任何Name
元素(如果您查看源,您可以立即发现)。原因是DisplayTextFor
不应该首先创建这样的元素。
几乎总是坏主意也会调用Html.HiddenFor
, 创建输入元素:
<td class="table-content-middle" align="center" style="width: 80%;">
<%=Html.DisplayFor(m=>m.customerCDTO[i].Name)%>
<%=Html.HiddenFor(m=>m.customerCDTO[i].Name)%>
</td>
这可以解决您的问题,但是用户可以使用像Firebug这样的工具简单地编辑值并更改Name
的值,这显然是您不想要的,否则您已经提交了{{ 1}}元素。 (注意:我还将<input>
更改为DisplayTextFor
,这通常是更正确的做事方式。)
但那该怎么办?嗯,这里没有神奇的解决方案。如果表单不包含DisplayFor
,那么它将是Name
,但如果 包含null
(甚至隐藏),那么用户可以在将。如果这是一个问题,唯一的选择是修改后端代码以从数据存储中填充Name
。
答案 1 :(得分:0)
在针对数据库运行查询后,您是否可以确保列表中填充了您的预期数据。事实上,您的数据似乎没有正确填充。