我在asp.net mvc-4 Web应用程序中的视图中有以下代码: -
@model IList<TS.ViewModels.ACCOUNTLIST>
@for(int i2 = 0; i2 < (Model.Count() <= 0 ? 5 : Model.Count()); i2++) {
<div>
<span >@Html.DisplayFor(m => m[i2].ACCOUNTNAME) </span>@Html.EditorFor(m => m[i2].ACCOUNTNAME) </div>
<div>
<span >@Html.DisplayFor(m => m[i2].PASSWORD) </span>@Html.EditorFor(m => m[i2].PASSWORD) </div>
<div>
<span >@Html.DisplayFor(m => m[i2].NOTES) </span>@Html.EditorFor(m => m[i2].NOTES) </div>
}
现在我想要完成的是如果模型为空,则显示五个空的字段集。如果模型包含显示相关日期的数据..但是当前我渲染视图并且传递的模型为空时我会得到以下异常: -
Index was out of range. Must be non-negative and less than the size of the collection. Parameter name: index
但如果我使用Html.Display
和Html.Editor
如下,我的观点会很好: -
@for(int i2 = 0; i2 < (Model.Count() <= 0 ? 5 : Model.Count()); i2++) {
<div>
<span class="f">@Html.Display("["+i2.ToString()+"].ACCOUNTNAME") </span>@Html.Editor("["+i2.ToString()+"].ACCOUNTNAME")
<span class="f">@Html.Display("["+i2.ToString()+"].PASSWORD") </span>@Html.Editor("["+i2.ToString()+"].PASSWORD") </div>
}
那么有人可以考虑这个吗?为什么我不能使用Html.DisplayFor
&amp;在我的情况下Html.EditorFor
?
答案 0 :(得分:2)
问题是你是否试图从集合中检索一个不存在的项目。例如,尝试从3的集合中访问对象4。
要解决问题,我要从视图中删除条件,然后将其放入控制器中,这样如果您希望将来显示更多空条目,您就不需要了完全修改视图。
使用以下内容替换语句视图:
@for (var i2 = 0; i2 < Model.Count; i2++)
{
<div>
<span>@Html.DisplayFor(m => m[i2].ACCOUNTNAME)</span>@Html.EditorFor(m => m[i2].ACCOUNTNAME)
</div>
<div>
<span>@Html.DisplayFor(m => m[i2].PASSWORD) </span>@Html.EditorFor(m => m[i2].PASSWORD)
</div>
<div>
<span>@Html.DisplayFor(m => m[i2].NOTES) </span>@Html.EditorFor(m => m[i2].NOTES)
</div>
}
然后你的控制器里面有一些东西
// Replace this with your method of retrieving the accounts list
var accounts = new List<ACCOUNTLIST>();
const int maxEntries = 5;
while (accounts.Count < maxEntries)
{
accounts.Add(new ACCOUNTLIST());
}
return View(accounts);
答案 1 :(得分:1)
这种情况有点奇怪:
i2 < (Model.Count() <= 0 ? 5 : Model.Count());
它所声明的是,如果模型计数小于或等于零,则循环5次,否则循环&#34;模型计数&#34;次。
因此,当模型为空时,它将尝试访问不存在的Model
的前5个元素 - 因此出错。
当计数为零时,你需要决定你想要发生什么,并明确地代码:
if (Model.Count() > 0)
{
@for(int i2 = 0; i2 < Model.Count(); i2++)
{
}
}
else
{
Do something else
}
答案 2 :(得分:0)
似乎你正在绑定空模型数据集合。我想如果你在Action结果中为你的模型集合设置一些默认值并渲染它会更好,而不是发送一个空List。而且,您只需检查默认值并相应地创建字段,而不是检查您的模型是否为空。