在VB ASP.NET MVC Razor中遍历集合

5
我正在使用以下Razor脚本进行循环,但是它给我返回以下错误:
@foreach (var item in ViewBag.Articles)
{
    <div>@item.Title</div>
}

错误:

描述:在编译所需的资源时发生了错误。请查看以下具体错误细节并相应地修改源代码。

编译器错误消息:BC30451:“foreach”未声明。由于其保护级别,可能无法访问它。

源错误:

第29行:文章第30行:第31行:@foreach (var item in ViewBag.Articles) 第32行:{ 第33行:

@(item.index). @item.model.Description

源文件:C:\Users\darchual\documents\visual studio 2010\Projects\Blog\ Blog\Views\Blog\Details.vbhtml 行号:31

我的IDE还显示:“'foreach' 未声明。由于其保护级别,可能无法访问它。”

如何循环遍历集合?感谢您的帮助。

编辑:

这是整个代码:

@ModelType Blog.Blog

@Code ViewData("Title") = ViewBag.Title End Code

Details

Blog

<div class="display-label">name</div>
<div class="display-field">
    @Html.DisplayFor(Function(model) model.name)
</div>

<div class="display-label">description</div>
<div class="display-field">
    @Html.DisplayFor(Function(model) model.description)
</div>

<div class="display-label">dateCreated</div>
<div class="display-field">
    @Html.DisplayFor(Function(model) model.dateCreated)
</div> </fieldset>

Articles

@foreach (var item in ViewBag.Articles)
{
    <div>@item.Title</div>
}

@Html.ActionLink("Edit", "Edit", New With {.id = Model.BlogId}) |
@Html.ActionLink("Back to List", "Index") </p>

以下是 Blog 对象:

Imports System.Data.Entity Imports System.ComponentModel.DataAnnotations

Public Class Blog

Public Property BlogId() As Integer

Public Property Name() As String
Public Property Description() As String
Public Property DateCreated As Date

Public Overridable Property Articles() As ICollection(Of Article)

End Class

Public Class BlogDbContext

Inherits DbContext
Public Property Blogs As DbSet(Of Blog)

End Class

编辑:

终于让它运行起来了。有效的代码是:

@For Each item In ViewBag.Articles
    @<div>@item.Title</div>
Next

哎呀,让我确定一下,你的错误是使用了错误的编程语言?天啊,这真是经典!我会记住这个笑话的 L-O-L :) - Erx_VB.NExT.Coder
哈哈,这只是一个简单的错误 :) - user1477388
1
在任何24小时内使用过多不同类型的编程语言的前10个迹象之一。 :) - Erx_VB.NExT.Coder
4个回答

8
答案是:
@For Each item In ViewBag.Articles
    @<div>@item.Title</div>
Next

2
你的页面代码是VB.Net编写的,但foreach()是C#中的语法结构。你只需要修改代码,使用VB中的For Each循环结构即可。
这个ASP.NET论坛的帖子提供了一个好的答案/代码片段:(链接)
Dim list As New List(Of Article)
list = ViewBag.Articles
If (list.Any()) 
Then     
    For Each item As Article In ViewBag.Articles 
        <div>@item.Title</div>
    Next
End If

我正在尝试在Razor的上下文中使用foreach()。这不行吗?我该如何在我的.vbhtml页面中循环遍历这些记录?我想在这里使用Razor,因为这是惯例(我正在使用MVC+Razor)。 - user1477388
我已经尝试了你的新代码,但它显示“未定义项目”。谢谢。 - user1477388
你可能需要在你的HTML页面中添加一个using语句...例如@using Blog。我不确定你的对象模型是什么样子的。 - MikeTWebb
我尝试使用添加,但它不起作用。我将我的博客对象添加到问题中。 - user1477388
如果Item未定义,您确定ViewBag.Articles中有对象吗?“Item未定义”是编译时错误还是运行时错误? - MikeTWebb

1

如果您已经在剃刀代码块中,则不需要使用@

@if(ViewBag.Articles.Count>0)
{
   foreach (var item in ViewBag.Articles)
   { 
     <div>@item.Title</div>
   }
}

你正在使用 foreachVB.NET 版本 吗?
@For Each item As Article In ViewBag.Articles
  <div>@item.Title</div>
Next

注意:使用 Count 不是高效的,因为代码必须循环遍历每个记录。如果使用 .Any(),代码可以循环遍历一个记录并在第一个记录之后短路,因为您要确定的只是是否至少有一个。(例如,没有必要遍历 100k 条记录,只是为了确定是否至少有一个)。 - The Muffin Man
我不在代码块中。它一直告诉我“foreach未定义!”我已更新问题,并附上了我的整个代码。 - user1477388
我正在使用VB ASP.NET MVC。我提供的代码位于Views / Blogs / Details.vbhtml中。我无法使用您提供的VB代码,因为这是一个.vbhtml页面。所以,我试图使用Razor,但它告诉我foreach不存在! - user1477388
不,据我所知,这是使用Razor渲染的。我不知道如何在vbhtml文档中编写VB代码。我正在尝试让Razor语法正常工作。 - user1477388
我现在明白你们告诉我的了。我已经尝试过你们的VB/Razor代码,但它显示“Type 'Article' is not defined.”。 - user1477388
显示剩余2条评论

1
由于ASP.NET MVC中模型绑定器的工作方式,有很多情况下将列表中每个值的索引作为回传非常有帮助。
因此,我更喜欢使用索引for循环(而不是强类型的for each循环)的简单性:
@For i = 0 To Model.Articles.Count - 1
    Dim curItem = Model.Articles(i)
    @Html.EditorFor(Function(model) curItem)
Next

Further Reading: 使用Razor语法介绍ASP.NET Web编程(Visual Basic) | C#

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接