我已经戳了一下,但没有发现什么ViewModel,或TempData或我的对象是如何被持久化为我的表单。
我在asp.net MVC视图中显示了一个自定义视图模型,我在该视图中编辑了一个对象列表,并将它们全部显示在html表单中的动态网格中,然后提交更改。当我回到控制器时,我检查现有对象与表单提交的对象列表并更新对象。
当我重新显示表单时,被删除的对象仍然显示,并且在html元素内的文本框中具有值,因此它是asp填充字段,而不是浏览器缓存。我有一个复选框,显示在行旁边,如果它是一个已经存在的对象,这些复选框被提交给控制器作为值的数组(对象的id要删除)。
所以我删除了对象,从数据库中取出干净的对象,并用新检索到的数据在视图模型中设置列表。但是,表单仍然显示旧对象,但是在它们旁边没有删除复选框,因此它们没有从数据库中检索。
我如何解决这个问题?我试着调整方法输出缓存(不是浏览器问题,因为DB ID键不再存在…没有删除复选框)。我试图使一个新的视图模型显式设置变量发送到视图之前…没有去。我现在的解决方案是在编辑完所有对象(示例中的simpleObject)后重定向到get方法,并完全重新开始。
一个简化的例子如下:
public class CustomViewModel {
List<SimpleObject> objects {get;set;}
}
public class SimpleObect {
public int iA {get;set;}
public int AddonHistID {get;set;}
}
控制器:
[HTTPGet] // get method and displays 2 objects by default
public ActionResult whatever( string something){
CustomViewModel form = new CustomViewModel ();
form.objects = new List<SimpleObject>();
form.objects.Add( new SimpleObect());
form.objects.Add( new SimpleObect());
return View( form)
}
[HttpPost]
public ActionResult whatever( string something, CustomViewModel form){
// adjust objects to show current objects aftering saving changes (reload and rebind to ModelView)
form.objects = getObjectsAfterChange( something); // just gets objects from db after all changes are made in this controller action
return View( form);
}
视图:
<% using( Html.BeginForm()) { %>
<table width="800" id="SearchAddonsResults">
foreach( SimpleObject addonHist in Model.objects )
{
++iOdd;
string cssClass = (iOdd % 2 == 0 ? "rowOdd" : "rowEven");
%>
<tr class="<%= cssClass %>">
<td>
<%if (addonHist.AddonID > 0)
{ %>
<input type="checkbox" name="RemoveAddon" id="RemoveAddon" value="<%= addonHist.AddonID.ToString() %>" />
<% } %>
<%= addonHist.AddonHistID.ToString() %>
</td>
<td><%= addonHist.iA.ToString() %></td>
</tr>
<% } %>
</table>
<% }; //endform %>
我想这可能会帮助你得到你期望的结果。
Phil Haack的博客:http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx
链接到from:
如何模型绑定到一个列表
将复杂模型绑定到列表
ASP。. NET MVC:我如何绑定List
所以我删除对象,从数据库中取出干净的对象并在视图模型中使用新检索到的内容设置列表数据。然而,表单仍然显示旧对象
这没有意义。你确定这一行
的形式。objects = getObjectsAfterChange(某物);
在你的HttpPost方法是检索正确的信息?
我将首先检查getObjectsAfterChange(某物)返回的值。我怀疑它返回的比你想象的要多,这就是问题所在(而不是在视图的渲染上)