viewmodel在HttpPost上返回null

时间:2012-05-09 10:32:48

标签: asp.net-mvc-3 c#-4.0

我创建了如下视图。

<%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; }
}

请帮忙。

感谢

2 个答案:

答案 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)

在针对数据库运行查询后,您是否可以确保列表中填充了您的预期数据。事实上,您的数据似乎没有正确填充。