2012-05-09 69 views
1

我创建了一个如下所示的视图。viewmodel在HttpPost上返回null

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

下面

是我的视图模型

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

你的控制器是什么样的? – DDiVita

+0

我的控制器只是从数据库中获取记录并显示 – aamankhaan

回答

2

它给你一个null价值,因为你的表单不包含任何对应于Name属性的<input>元素(如果你查看源代码,你可以马上发现它)。原因是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>元素。 (注:我也将DisplayTextFor更改为DisplayFor,这通常是更正确的做法)。

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

+0

感谢乔恩再次帮助了我很多.... – aamankhaan

0

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

+0

嗨,每一件事情都正常工作只有问题是在回发发生。 – aamankhaan