我的问题很简单。这就是我对aspx页面的看法:
<ul>
<asp:Repeater runat="server" ID="linksList" OnItemDataBound="linksList_OnItemDataBound" >
<ItemTemplate>
<li><asp:HyperLink runat="server" ID="link" /></li>
</ItemTemplate>
</asp:Repeater>
</ul>
我正在尝试从SQL服务器到列表中获取超链接列表。这就是我在代码隐藏中所拥有的:
protected void Page_Load(object sender, EventArgs e)
{
DataSet ds = Utilities.RunSelectQuery("SELECT *");
DataTable dt = ds.Tables[0];
linksList.DataSource = dt;
linksList.DataBind();
}
如何在数据绑定到NavigateUrl
后更改Text
中的asp:HyperLink
和Repeater
属性?我想在代码隐藏中执行此操作,如果我在aspx页面中使用<%# Eval("URL") %>
执行此操作,我可以使用它,但这与ASP.NET的内容有关。
编辑:由于womp:
,这个解决方案对我有用protected void linksList_OnItemDataBound(object sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
DataRowView row = (DataRowView)e.Item.DataItem;
HyperLink link = (HyperLink)e.Item.FindControl("link");
link.Text = row["description"].ToString();
link.NavigateUrl = row["URL"].ToString();
}
}
答案 0 :(得分:4)
实际上,在你的模板中使用Databinder syntax是一个很好的方法,我不确定你的意思是“它反对ASP.Net的全部内容”。
但是,如果您真的想在代码中执行此操作,则可以在OnItemDataBound处理程序中执行此操作(它看起来就像您创建的那样)。像这样的东西(读:未经测试)应该可以做到这一点:
void linksList_OnItemDataBound(object Sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Item
|| e.Item.ItemType == ListItemType.AlternatingItem) {
DataRow row = e.Item.DataItem as DataRow;
Hyperlink link = e.Item.FindControl("link"));
link.Text = row["URL"];
link.NavigateUrl = row["URL"];
}
}
}
答案 1 :(得分:1)
这样做的方法就像你说的那样。如果您只想显示URL,那么在后面的代码中执行此操作会增加不必要的工作。您还希望将标记放在HeaderTemplate和FooterTemplate中。
<asp:Repeater runat="server" ID="linksList" OnItemDataBound="linksList_OnItemDataBound" >
<HeaderTemplate><ul></HeaderTemplate>
<ItemTemplate>
<li><asp:HyperLink runat="server" ID="link" NavigateUrl='<%# Eval("url") %>' /></li>
</ItemTemplate>
<FooterTemplate></ul></FooterTemplate>
</asp:Repeater>