如何在WebForms中像MVC一样循环遍历数据

56

我在WebForms中如何像在ASP.NET MVC中一样遍历数据?例如,在MVC中,这就像:

<table>
    @foreach (var myItem in g)
    { 
        @<tr><td>@MyItem.title<td></tr>
    }
</table>

代码的背后会是什么样子呢?

或者,我是否可以将MVC项目添加到WebForms应用程序中,以便我可以使用MVC功能呢?

3个回答

93

与其使用中继器,您可以通过类似MVC的方式使用<% %><%= %>标签循环遍历列表。

<table>
  <% foreach (var myItem in g) { %>
    <tr><td><%= myItem.title %></td></tr>
  <% } %>
</table>
只要您正在循环遍历的属性可以从aspx/ascx页面访问(例如声明为protected或public),您就可以循环遍历它。代码后台中没有其他代码是必需的。 <% %>将评估该代码,而<%= %>将输出结果。
以下是最基本的示例:
在代码后台的类级别上声明此列表:
public List<string> Sites = new List<string> { "StackOverflow", "Super User", "Meta SO" };

那只是一个简单的字符串列表,因此在您的aspx文件中

<% foreach (var site in Sites) { %> <!-- loop through the list -->
  <div>
    <%= site %> <!-- write out the name of the site -->
  </div>
<% } %> <!--End the for loop -->

Brandon,你能给我展示一下类似这样的代码吗?谢谢。 - user1477388
@user1477388,没有代码后台。只要您的列表属性可以被前端访问(例如在代码后台中是公共或受保护的),那么您就可以通过它进行循环。类似于在MVC中设置模型属性。 - Brandon
4
我知道这回答了你的问题,但实际上在Web表单中并不是这样做的。你应该使用一个Repeater或相似的控件,并在代码后端绑定数据。 - MikeSmithDev
2
@JoshNoe,这可能会使格式化变得更加容易(使用备选项、页眉、页脚等模板选项),以及一个OnItemDataBound事件来进行更复杂的数据操作。话虽如此,我更喜欢像这个答案一样的方法(在适当的情况下),并尽可能避免使用Web表单(和相关控件)。 - MikeSmithDev
1
@Brandon:当我使用循环而不是重复器时,如何处理代码后端的数据源和数据绑定?一旦我删除了重复器并使用foreach循环,我的代码后台中的重复器ID会被下划线标记为红色,并显示“当前上下文中不存在xyz名称”。 - toofaced
显示剩余5条评论

14
在WebForm中,您可以使用Repeater控件:
<asp:Repeater id="cdcatalog" runat="server">
   <ItemTemplate>
       <td><%# Eval("title")%></td>
   </ItemTemplate>
</asp:Repeater>
在代码后台:
cdcatalog.DataSource = yourData;
cdcatalog.DataBind();

3
自 .NET 4.5 版本起,Repeater 是有类型的,您不应该使用 Eval()。取而代之,请使用 ItemType 属性。 - Evgeni Nabokov

2
您可以使用任何有效的数据源(SqlDataSourceEntityDataSourceObjectDataSource)对象与Repeater一起使用:

  1. 定义数据源
  2. 在您的 Reperater 中引用数据源

....

 <asp:Repeater id="someRep" runat="server" DataSourceID="YourDataSource">
       <ItemTemplate>
          <tr>
                <td><%# Eval("PropertyName") %></td> 
          </tr>
    </ItemTemplate>
    </asp:Repeater>

...


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