从ASP.net页面上收集数据的最佳做法是什么?

从ASP.net页面上收集数据的最佳做法是什么?

问题描述:

我已经从传统的ASP移植到ASP.net的页面。本页面发生的一部分是生成一组自定义类型,然后通过Response.Write()命令显示。我想将业务逻辑分离出来,放到代码背后(也许把这一切都转移到用户控件中),但我似乎无法弄清楚如何在生成集合后真正显示集合。我也想在这里指定一个母版页,所以代码不能保持内联。这是当前代码的一个非常简洁的版本:从ASP.net页面上收集数据的最佳做法是什么?

<% 
Dim objs as ArrayList = New ArrayList() 

For i = 0 To 2 
    Dim obj as Obj = New Obj() 

obj.setProp1("ASDF") 
obj.setProp2("FDSA") 

objs.Add(obj) 
Next i 
%> 

<table> 
<thead> 
    <tr> 
     <th scope="col">Property 1</th> 
     <th scope="col">Property 2</th> 
    </tr> 
</thead> 
<tbody> 
<% 
For Each obj As Obj In objs 
Dim objProp1 As String = obj.getProp1 
Dim objProp2 As String = obj.getProp2 
%>     
    <tr> 
     <td><% Response.Write(objProp1)%></td> 
     <td><% Response.Write(objProp2)%></td> 
    </tr> 
<% 
Next 
%> 
</tbody> 
</table> 

什么是“.net”这样做的方式?

+0

你使用的是什么版本的.NET是? – 2010-04-20 19:25:26

+0

我目前正在使用v2.0 – bshacklett 2010-04-20 19:58:26

+0

不幸的是,你不能使用ListView然后... – 2010-04-20 21:58:09

您还可以查看ListView控制,这是Joe R提到的转发器的更新版本。关于ScottGu's blog上的ListView有什么可以做的很好的教程。

您的代码将基本变成的东西沿着这些路线:

<asp:ListView id="ListView1" runat="server" enableviewstate="false"> 
    <LayouTemplate> 
     <table> 
      <thead> 
       <tr> 
        <th scope="col">Property 1</th> 
        <th scope="col">Property 2</th> 
       </tr> 
      </thead> 
      <tbody> 
       <asp:Placeholder runat="server" id="ItemPlaceholder" /> 
      </tbody> 
     </table> 
    </LayouTemplate> 
    <ItemTemplate> 
     <tr> 
      <td><%# Eval("objProp1")%></td> 
      <td><%# Eval("objProp2")%></td> 
     </tr> 
    </ItemTemplate> 
</asp:ListView> 

These guys考虑使用Eval到不是一个很好的做法,但它使编写的例子更容易。如果您要展示只读数据,请不要忘记关闭ViewState,否则您的页面会变得非常快。

EDIT此处还发现了不同列表样式控件之间的feature comparison chart

+0

这些都在LayoutTemplate中。这没有重复的项目。你缺少ItemTemplate和需要进入LayoutTemplate的itemPlaceholder(在.NET3.5 - .NET4中你不需要;))除此之外,你是对的 - 任何一天在Repeater上的ListView。 – BritishDeveloper 2010-04-20 20:34:59

+0

@BritishDeveloper:你是对的,我的坏。固定。 – R0MANARMY 2010-04-20 20:45:52

+0

downvote被撤销:) – BritishDeveloper 2010-04-20 21:05:39

我会使用类似中继器或数据网格的东西,并将其绑定到您可以在业务逻辑层创建的列表<>。

在.NET2中,你最好的选择就是中继器。事情是这样的:

<asp:Repeater id="rpt1" runat="server" EnableViewState="false"> 
    <HeaderTemplate> 
     <table> 
      <thead> 
       <tr> 
        <th scope="col">Property 1</th> 
        <th scope="col">Property 2</th> 
       </tr> 
      </thead> 
      <tbody> 
    </HeaderTemplate> 
    <ItemTemplate> 
       <tr> 
        <td><%# Eval("objProp1")%></td> 
        <td><%# Eval("objProp2")%></td> 
       </tr> 
    </ItemTemplate> 
    <FooterTemplate> 
      </tbody> 
     </table> 
    </FooterTemplate> 
</asp:Repeater> 

,并在后面的代码绑定的数据是这样的:

rpt1.DataSource = objs; 
rpt1.DataBind(); 

这将是C#,但 - 希望这没关系