【问题标题】:Seems like a bug in MVC 4 Razor "for" loop?看起来像 MVC 4 Razor“for”循环中的错误?
【发布时间】:2013-07-02 04:47:17
【问题描述】:

我正在使用 Microsoft ASP.NET MVC 4 版本 4.0.30.506.0 编写 MVC4,并且我在 razor 页面中有一个 for 循环,它会生成一个愚蠢的运行时错误!

这是我写的代码:

@{
                    if (Model.IsAuction)
                    {
                        <li class="bc49">@Html.ActionLink("ABCD", "Search", "Home", new {city = "all", type = "auction", category = "all", keyword = "all", condition = "all", sort = "asc"})</li>
                    }
                    else
                    {
                        <li class="bc49">@Html.ActionLink("EFGH", "Search", "Home", new {city = "all", type = "product", category = "all", keyword = "all", condition = "all", sort = "asc"})</li>
                    }

                    int crumpsCount = 48;

                    for (int i = 0; i < Model.Categories.Count; i++)
                    {
                        className = "bc" + crumpsCount;

                        if (Model.IsAuction)
                        {
                            <li class="@className">@Html.ActionLink(Model.Categories[i].Title, "Search", "Home", new {city = "all", type = "auction", category = Model.Categories[i].Name, keyword = "all", condition = "all", sort = "asc"})</li>
                        }
                        else
                        {
                            <li class="@className">@Html.ActionLink(Model.Categories[i].Title, "Search", "Home", new {city = "all", type = "product", category = Model.Categories[i].Name, keyword = "all", condition = "all", sort = "asc"})</li>
                        }

                        crumpsCount--;
                    }
                }

这是由 Visual Studio 2012 生成的错误:

错误发生在循环结束并且 i 的值等于 Model.Categories.Count 之后。似乎编译器试图访问 Model.Categories[Model.Categories.Count] 值!

有趣的事实是,当我用 foreach 循环替换这段代码时,或者即使我在 for 循环之后添加一个 foreach 循环,代码也会正确执行并通过 for 循环!

这是有效的代码:

@{
                    if (Model.IsAuction)
                    {
                        <li class="bc49">@Html.ActionLink("ABCD", "Search", "Home", new {city = "all", type = "auction", category = "all", keyword = "all", condition = "all", sort = "asc"})</li>
                    }
                    else
                    {
                        <li class="bc49">@Html.ActionLink("EFGH", "Search", "Home", new {city = "all", type = "product", category = "all", keyword = "all", condition = "all", sort = "asc"})</li>
                    }

                    int crumpsCount = 48;

                    for (int i = 0; i < Model.Categories.Count; i++)
                    {
                        className = "bc" + crumpsCount;

                        if (Model.IsAuction)
                        {
                            <li class="@className">@Html.ActionLink(Model.Categories[i].Title, "Search", "Home", new {city = "all", type = "auction", category = Model.Categories[i].Name, keyword = "all", condition = "all", sort = "asc"})</li>
                        }
                        else
                        {
                            <li class="@className">@Html.ActionLink(Model.Categories[i].Title, "Search", "Home", new {city = "all", type = "product", category = Model.Categories[i].Name, keyword = "all", condition = "all", sort = "asc"})</li>
                        }

                        crumpsCount--;
                    }

                    foreach (CategoryInfo categoryInfo in Model.Categories)
                    {
                        className = "bc" + crumpsCount;

                        if (Model.IsAuction)
                        {
                            <li class="@className">@Html.ActionLink(categoryInfo.Title, "Search", "Home", new {city = "all", type = "auction", category = categoryInfo.Name, keyword = "all", condition = "all", sort = "asc"})</li>
                        }
                        else
                        {
                            <li class="@className">@Html.ActionLink(categoryInfo.Title, "Search", "Home", new {city = "all", type = "product", category = categoryInfo.Name, keyword = "all", condition = "all", sort = "asc"})</li>
                        }

                        crumpsCount--;
                    }
                }

我刚刚分享了这段代码,看看这是否是一个错误,如果它是一个错误,它是否是已知的。

感谢大家。 :)

更新: 太傻了,现在代码也不能用foreach循环了!

foreach 循环内没有索引,但异常提到索引超出范围!

代码如下:

foreach (CategoryInfo categoryInfo in Model.Categories)
                    {
                        className = "bc" + crumpsCount;

                        if (Model.IsAuction)
                        {
                            <li class="@className">@Html.ActionLink(categoryInfo.Title, "Search", "Home", new {city = "all", type = "auction", category = categoryInfo.Name, keyword = "all", condition = "all", sort = "asc"})</li>
                        }
                        else
                        {
                            <li class="@className">@Html.ActionLink(categoryInfo.Title, "Search", "Home", new {city = "all", type = "product", category = categoryInfo.Name, keyword = "all", condition = "all", sort = "asc"})</li>
                        }

                        crumpsCount--;
                    }

我还应该提到 Model.Categories 是一个 IList 对象。

【问题讨论】:

  • 堆栈跟踪是什么?
  • 我认为您的签名方式错误 int i = 0;我 模型.类别.计数;我++
  • 抱歉忽略我的评论我有代码失明:-)
  • 您是否考虑过使用模板而不是使用这些循环来表达您的观点?
  • 该错误几乎肯定实际上来自不同的行。 (可能是涉及数组的一行)

标签: asp.net-mvc asp.net-mvc-4 razor for-loop


【解决方案1】:

问题解决了。 MVC 中没有我看到的错误,但是在 MVC/Razor 运行时中引用了错误的异常,它引用了确切错误位置上方的一行,让我认为框架的运行时中存在错误。 真正的异常是关于一个从数据库返回为空的数组,而我编写的代码试图访问该数组的索引 0,因此我的代码中有一个超出范围的异常,但该异常引用了 10 行以上我写的确切访问代码,所以我认为这将是一个错误。 感谢 cmets 的回复,希望这对以后的人有所帮助。

【讨论】:

  • 哇,同样的事情发生在我身上(7 年后:'),调试器说我的 for 循环是错误的,我不得不开始回滚更改,错误是完全不同的地方,很奇怪。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多