![](/img/trans.png)
[英]Index was out of range. Must be non-negative and less than the size of the collection. Parameter name: index
[英]Index was out of range. Must be non-negative and less than the size of the collection. Parameter name: index
我在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
和Html.EditorFor
?
问题是您正在尝试从集合中检索不存在的项目。 例如,尝试从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);
这种情况有点奇怪:
i2 < (Model.Count() <= 0 ? 5 : Model.Count());
它所声明的是,如果模型计数小于或等于零,则循环5次,否则循环“模型计数”次。
因此,当模型为空时,它将尝试访问Model
中不存在的前5个元素 - 因此出现错误。
当计数为零时,你需要决定你想要发生什么,并明确地代码:
if (Model.Count() > 0)
{
@for(int i2 = 0; i2 < Model.Count(); i2++)
{
}
}
else
{
Do something else
}
看来你是绑定空模型数据集合。 我想如果你在Action结果中为你的模型集合设置一些默认值并渲染它会更好,而不是发送一个空List。 而且,您只需检查默认值并相应地创建字段,而不是检查您的模型是否为空。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.