繁体   English   中英

指数超出范围。 必须是非负数且小于集合的大小。 参数名称: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.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.DisplayForHtml.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM