指数超出范围。必须是非负数且小于集合的大小。参数名称:index

时间:2016-06-02 10:16:09

标签: c# asp.net asp.net-mvc

我在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.DisplayHtml.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

3 个答案:

答案 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。而且,您只需检查默认值并相应地创建字段,而不是检查您的模型是否为空。