如何最好地在ASP.NET中填充HTML表?
时间:2020-03-05 18:47:36 来源:igfitidea点击:
这就是我所拥有的。有用。但是,有没有更简单或者更完善的方法呢?
ASPX页面
<asp:Repeater ID="RepeaterBooks" runat="server"> <HeaderTemplate> <table class="report"> <tr> <th>Published</th> <th>Title</th> <th>Author</th> <th>Price</th> </tr> </HeaderTemplate> <ItemTemplate> <tr> <td><asp:Literal ID="LiteralPublished" runat="server" /></td> <td><asp:Literal ID="LiteralTitle" runat="server" /></td> <td><asp:Literal ID="LiteralAuthor" runat="server" /></td> <td><asp:Literal ID="LiteralPrice" runat="server" /></td> </tr> </ItemTemplate> <FooterTemplate> </table> </FooterTemplate> </asp:Repeater>
背后的ASPX.VB代码
Protected Sub Page_Load( ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load Dim db As New BookstoreDataContext RepeaterBooks.DataSource = From b In db.Books _ Order By b.Published _ Select b RepeaterBooks.DataBind() End Sub Sub RepeaterBooks_ItemDataBound( ByVal sender As Object, ByVal e As System.Web.UI.WebControls.RepeaterItemEventArgs) Handles RepeaterBooks.ItemDataBound If e.Item.ItemType = ListItemType.Item Or e.Item.ItemType = ListItemType.AlternatingItem Then Dim b As Book = DirectCast(e.Item.DataItem, Book) DirectCast(e.Item.FindControl("LiteralPublished"), Literal).Text = "<nobr>" + b.Published.ToShortDateString + "</nobr>" DirectCast(e.Item.FindControl("LiteralTitle"), Literal).Text = "<nobr>" + TryNbsp(HttpContext.Current.Server.HtmlEncode(b.Title)) + "</nobr>" DirectCast(e.Item.FindControl("LiteralAuthor"), Literal).Text = "<nobr>" + TryNbsp(HttpContext.Current.Server.HtmlEncode(b.Author)) + "</nobr>" DirectCast(e.Item.FindControl("LiteralPrice"), Literal).Text = "<nobr>" + Format(b.Price, "c") + "</nobr>" End If End Sub Function TryNbsp(ByVal s As String) As String If s = "" Then Return " " Else Return s End If End Function
解决方案
回答
在.Net 3.0+中,我们可以通过执行以下操作将ItemDataBound替换为asp:Literal:
<ItemTemplate> <tr> <td><%# Eval("published") %></td> ...
其中"已发布"是我们绑定到转发器的数据中的字段名称
编辑:
@Alassek:我认为反思的表现常常被过分强调。显然,我们需要对应用程序的性能进行基准测试,但是评估的命中率很可能以毫秒为单位。除非应用程序同时提供许多并发命中数据,否则这可能不是问题,并且使用Eval简化代码,并很好地分隔了演示文稿,因此是一个不错的解决方案。
回答
我同意Geoff的观点,唯一一次使用Literals的地方就是我们想对数据做一些不同的事情。例如,我们可能希望DueDate字段显示"今天"或者"昨天",而不是实际日期。
回答
@杰夫
这种Eval语句实际上是在2.0中添加的,但是如果性能很重要,则应避免使用Eval,因为它使用了Reflection。
中继器是一种很好的方法,尽管用代码生成表可能会更快:
ASPX页面:
<table class="report" id="bookTable" runat="server"> <tr> <th>Published</th> <th>Title</th> <th>Author</th> <th>Price</th> </tr> </table>
背后的代码:
Protected Sub Page_Load( ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load If Not Page.IsPostback Then BuildTable() End If End Sub Private Sub BuildTable() Dim db As New BookstoreDataContext Dim bookCollection = from b in db.Books _ Order By b.Published _ Select b Dim row As HtmlTableRow Dim cell As HtmlTableCell For Each book As Books In bookCollection row = New HtmlTableRow() cell = New HtmlTableCell With { .InnerText = b.Published.ToShortDateString } row.Controls.Add(cell) cell = New HtmlTableCell With { .InnerText = TryNbsp(HttpContext.Current.Server.HtmlEncode(b.Title)) } row.Controls.Add(cell) cell = New HtmlTableCell With { .InnerText = TryNbsp(HttpContext.Current.Server.HtmlEncode(b.Author)) row.Controls.Add(cell) cell = New HtmlTableCell With { .InnerText = Format(b.Price, "c") } row.Controls.Add(cell) bookTable.Controls.Add(row) Next
我想这取决于速度对我们有多重要。为了简单起见,我想我会选择Repeater。
回答
ALassek wrote: …generate the table in code…
我喜欢那种外观!由于拼写错误或者字段名称更改,似乎不太可能产生运行时异常。
回答
框架3.5引入的ListView控件可能是更好的解决方案。标记如下所示:
<asp:ListView runat="server" ID="ListView1" DataSourceID="SqlDataSource1"> <LayoutTemplate> <table runat="server" id="table1" runat="server" > <tr runat="server" id="itemPlaceholder" ></tr> </table> </LayoutTemplate> <ItemTemplate> <tr runat="server> <td runat="server"> <asp:Label ID="NameLabel" runat="server" Text='<%#Eval("Name") %>' /> </td> </tr> </ItemTemplate> </asp:ListView>
回答
这就是GridView的用途。
<asp:GridView runat="server" DataSourceID="SqlDataSource1"> <Columns> <asp:BoundField HeaderText="Published" DataField="Published" /> <asp:BoundField HeaderText="Author" DataField="Author" /> </Columns> </asp:GridView>
回答
我将使用GridView(或者DataGrid,如果我们使用的是ASP.NET的旧版本)。
<asp:GridView ID="gvBooks" runat="server" AutoGenerateColumns="False"> <Columns> <asp:BoundField HeaderText="Published" DataField="Published" /> <asp:BoundField HeaderText="Title" DataField="Title" /> <asp:BoundField HeaderText="Author" DataField="Author" /> <asp:BoundField HeaderText="Price" DataField="Price" /> </Columns> </asp:GridView>
有一些代码:
Private Sub gvBooksRowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles gvBooks.RowDataBound Select Case e.Row.RowType Case DataControlRowType.DataRow ''' Your code here ''' End Select End Sub
我们可以用类似的方式绑定它。我们需要RowDataBound事件。
回答
如果我们不需要ASP.NET处理的编辑功能,我将远离DataGrid和GridView ...它们提供了不必要的膨胀。