2016-05-20 2 views
0

Я запрограммировал простую страницу блога - http://www.3don.net.br/Blog.aspx (другой язык, здесь только для отображения структуры). Я хочу использовать hashtags для указания на темы. Например, http://www.3don.net.br/Blog.aspx#19/04/16 должен прокрутить страницу до темы, созданной в 19/04/16.ID элементов в ASP.NET ListView автоматически расширяется

Однако я не могу это получить!

Темы блога - ItemTemplates элемента управления ListView. Когда я определяю ID = «lblDatum» для управления меткой данных каждой темы (которая является первым элементом управления каждой темой), тогда этот идентификатор изменяется NET-машиной на 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_-часть?

Или другая идея для его получения?

+0

Возможный дубликат [Как остановить ASP.NET от изменения идентификаторов для использования jQuery] (http://stackoverflow.com/questions/497802/how-to-stop-asp-net-from-changing-ids -in-order-to-use-jquery) –

ответ

0

Используйте в своем ListItem ClientIdMode="Static", который удаляет идентификатор autoGenerate, у вас есть ID = "lblDatum" на клиенте.

+0

Но он будет иметь несколько элементов с одинаковым ID. – ConnorsFan

+0

Даниил, спасибо. Звучит нормально - но не работает. Если есть VisualStudio2015 с .NET Framework 4.6. но свойство ClientIDMode не отображается (автоматически). Никаких изменений, если я буду вводить его вручную в элементе управления ListView или в любом элементе управления listitem. – Jog

+0

ConnorsFan, я могу определить идентификатор для каждого элемента управления в моем коде. Спасибо – Jog

0

ок, я добавил ClientIDMode = «статическое» свойство элемента управления Метка данных:

<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> 

... и, в код-сзади, установить идентификатор этого элемента управления каждой темы IGUAL текстового свойства этого элемента управления (данные):

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 ctl00_ContentPlaceHolder_lstBlog_ctrl0_ctl00_19/05/16, а не только 19/05/16 ???

0

Хорошо, я тестировал здесь, используя reapeater, но с любыми другими функциями управления. Вы должны установить идентификатор отдельно для каждого элемента управления, чтобы сделать уникальным. * Я redid, используя на день.

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>... 

К сожалению, за плохое форматирование, я улучшит мои ответы, если это необходимо.

+0

см. Ниже ........... – Jog

0

Daniel,

благодарит вас за то, что вы посвятили свое время.

Вы определяете свойство ClientIDMode элемента управления Label в коде позади, нормально.Я делаю это так, но я вижу, что он не работает здесь:

screenshot

Когда я иду с указателем мыши над ClientIDMode слева он советует: «ClientIDMode" не является членом «Этикетка « и над ClientIDMode справа, он появляется« ClientIDMode »не объявлен, он может быть недоступен из-за его уровня защиты».

В моей системе отсутствует что-то неопределенное?

0

Хорошо, я понимаю, что вы используете Framework2.0 в своем проекте. Можете ли вы изменить Framework на 4.0 или выше? В противном случае вам нужно использовать подход .js, чтобы прокручивать как желание.

ClientIdMode от .net 4.0, как вы сказали .net4.6, я предположил, что проект был также 4.6.

ЕСЛИ вы не можете изменить версию, вам нужно использовать что-то вроде jquery для прокрутки. Или, может быть более трудно решение создать пункт в вашем ItemTemplate как:

<span id='<%# Eval("data") %>'></span> 

Я не испытал это решение, позже я буду тестирование;

+0

Даниэль, ваша идея HTML делает эту работу! Так просто ..... Спасибо, он уже работает. – Jog

+0

Это работает, но для проверки версии вам нужно перейти к свойствам из проекта. –

+0

Да, я нашел его. Framwork 3.5 был активным (потому что я изначально начал свой проект в более старой версии VStudio, где возможно только FW3.5). Обригадо, Даниэль Сильвейра. – Jog

0

Daniel,

Я всегда подозревал, что, но "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, но не активирован? Это существует? Где я могу это увидеть?

Смежные вопросы