我编写了一个简单的博客页面 - http://www.3don.net.br/Blog.aspx(另一种语言,此处仅显示结构)。我想使用hashtags指向主题。例如,http://www.3don.net.br/Blog.aspx#19/04/16应该将页面滚动到19/04/16创建的主题。
然而,我无法得到它!
博客的主题是ListView控件的ItemTemplates。当我为每个主题的数据(这是每个主题的第一个控件)的标签控件定义ID =“lblDatum”时,NET机器将此ID修改为 id =“ctl00_ContentPlaceHolder_lstBlog_ctrl0_ctl01_lblDatum”(例如,您可以在第二个主题的页面源代码中看到它。)
所以,如果我在浏览器中访问www.3don.net.br/Blog.aspx#ctl00_ContentPlaceHolder_lstBlog_ctrl0_ctl01_lblDatum 页面确实会正确滚动。我还可以以不同方式以编程方式更改每个主题的ID,它仍适用于每个主题。
然而,hashtag-name“ctl00_ContentPlaceHolder_lstBlog_ctrl0_ctl01_lblDatum”并不好看!是否有可能抑制ctl00_ContentPlaceHolder_lstBlog_ctrl0_ctl01_-part?
或者获得它的另一个想法?
答案 0 :(得分:0)
在ListItem中使用ClientIdMode="Static"
,删除autoGenerate ID,客户端上有ID =“lblDatum”。
答案 1 :(得分:0)
好的,我添加了clientIDMode ="静态"属性的Label控件的数据:
<table id="table_intern" runat="server" >
<tr id="tr_intern" runat="server">
<td id="td_intern" runat="server">
<asp:Label ID="lblDatum" runat="server" Text='<%# Eval("data") %>' CssClass="rotfettschrift" clientidmode="static"/>
</td>
</tr>
<tr> ... </tr>
<tr> ... </tr>
</table>
...并且,在代码隐藏中,设置此控件的文本属性的每个主题的控件的ID(数据):
lbl = CType(e.Item.FindControl("lblDatum"), Label)
lbl.ID = lbl.Text
但是,HTML输出是:
<tbody>
<tr id="ctl00_ContentPlaceHolder_lstBlog_ctrl0_ctl00_tr_intern">
<td id="ctl00_ContentPlaceHolder_lstBlog_ctrl0_ctl00_td_intern">
<span id="ctl00_ContentPlaceHolder_lstBlog_ctrl0_ctl00_19/05/16" class="rotfettschrift" clientidmode="static">19/05/16</span>
</td>
</tr>
<tr> ... </tr>
<tr> ... </tr>
</tbody>
为什么span元素的ID为ctl00_ContentPlaceHolder_lstBlog_ctrl0_ctl00_19 / 05/16而不仅仅是19/05/16 ???
答案 2 :(得分:0)
好的,我在这里测试过,使用的是reapeater,但是还有其他任何控制功能。您必须为每个控件单独设置ID,以使其唯一。 *我使用日期重做。
MARKUP:
<table id="table_intern">
<asp:Repeater runat="server" ID="repeater" OnItemDataBound="repeater_ItemDataBound">
<ItemTemplate>
<tr>
<td>
<asp:Label Text="" runat="server" ID="label" />
</td>
</tr>
</ItemTemplate>
</asp:Repeater>
</table>
BACKEND:
protected void Page_Load(object sender, EventArgs e)
{
var list = new List<string>();
for (int i = 0; i < 10; i++)
{
list.Add(string.Format("Item_{0}", i.ToString().PadLeft(2, '0')));
}
repeater.DataSource = list;
repeater.DataBind();
}
protected void repeater_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
var label = (Label)e.Item.FindControl("label");
var item = (DateTime)e.Item.DataItem;
label.ID = item.ToShortDateString();
label.Text = item.ToShortDateString();
label.ClientIDMode = ClientIDMode.Static;
}
}
结果:
<table id="table_intern">
<tbody><tr>
<td>
<span id="23/05/2016">23/05/2016</span>
</td>
</tr>
<tr>
<td>
<span id="24/05/2016">24/05/2016</span>
</td>
</tr>...
抱歉,格式错误,我会在必要时改进答案。
答案 3 :(得分:0)
丹尼尔,
谢谢你花时间。您正在后面的代码中定义Label控件的ClientIDMode属性,确定。我这样做,但我发现它在这里不起作用:
当我将鼠标指针移到左侧的ClientIDMode上时,它建议:“'ClientIDMode'不是'Label'的成员” 并且在右侧的ClientIDMode上弹出“'ClientIDMode'未声明。由于其保护级别,它可能无法访问。”
我的系统中是否有未定义的内容?
答案 4 :(得分:0)
好的,我了解您在项目中使用Framework2.0。你可以将Framework更改为4.0或更高版本吗?否则你需要使用.js方法,像愿望一样滚动。
ClientIdMode来自.net 4.0,您如何安装.net4.6,我认为该项目也是4.6。
如果您无法更改版本,则需要使用类似jquery的内容进行滚动。或者也许是一个更难的解决方案,在你的itemTemplate中创建一个项目,如:
<span id='<%# Eval("data") %>'></span>
我没有测试过这个解决方案,以后我会进行测试;
答案 5 :(得分:0)