1

我创建了如下视图。

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

请帮忙。

谢谢

4

2 回答 2

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,这显然是您不想要的,否则您将<input>为此提供一个元素。(注意:我也改为DisplayTextForDisplayFor这通常是更正确的做事方式)。

但是那该怎么办呢?好吧,这里没有神奇的解决方案。如果表单不包含Name,那么它将是null,但如果它包含Name甚至隐藏),那么用户可以随意更改它。如果这是一个问题,唯一的选择是修改您的后端代码以Name从您的数据存储中填充。

于 2012-05-09T10:50:07.690 回答
0

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

于 2012-05-09T10:44:53.387 回答