ASP.NET ListView中的项目ID自动扩展

时间:2016-05-20 18:35:16

标签: asp.net listview

我编写了一个简单的博客页面 - 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?

或者获得它的另一个想法?

6 个答案:

答案 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属性,确定。我这样做,但我发现它在这里不起作用:

screenshot

当我将鼠标指针移到左侧的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)

丹尼尔,

我总是怀疑,但是 "About Visual Studio" window讲述了另一个故事。

通常,in the registry I can find the v4/Full key and the Version information (at the right side) confirms the (installed and activated?) version 4.6.01055

???

或者是框架v4安装但没有“激活”?这存在吗?我在哪里可以看到这个?