2010-02-01 2 views
1

Я хочу динамически добавлять HTML-код в div. Я делаю это с:InnerHTML in Div dynamic - проблема HyperLink в ASP

  newsAllScroller.InnerHtml = newsAllScroller.InnerHtml + "<br><center><b>"; 
      List<DAL.News> newsList = DAL.NewsHandler.GetAllNews(); 
      foreach (DAL.News n in newsList) 
      { 
       newsAllScroller.InnerHtml = newsAllScroller.InnerHtml + "<br>" + n.Betreff + " - (" 
        + "<asp:HyperLink ID=\"news"+n.NewsID+"\" runat=\"server\" NavigateUrl=\"~/News.aspx?id=" + n.NewsID + "\"" 
        + " CssClass=\"newsLink\">" 
        + "..." 
        + "</asp:HyperLink>" 
        + ")"; 
      } 
      newsAllScroller.InnerHtml = newsAllScroller.InnerHtml + "</center></b>"; 

Гиперссылка не работает (вы не можете нажать ее).

Когда я копирую гиперссылку из исходного кода браузера в aspx-страницу, она работает, поэтому кажется, что синтаксис все правильно - но он не работает через код, почему?

ответ

2

Вы не можете добавить контроль на стороне сервера HTML и думать, что это себя нормально, вы должны изменить свой код

newsAllScroller.InnerHtml = newsAllScroller.InnerHtml + "<br>" + n.Betreff + " - (" 
        + "<a href ="/News.aspx?id=" + n.NewsID + "\"" 
        + " class=\"newsLink\">" 
        + "... </a>" 
        + ")"; 
1

Поскольку страница aspx анализируется только один раз перед отправкой вывода в браузер. Вы не можете печатать/выводить что-то и ожидать, что он будет разбираться еще раз.

+0

Хорошо, как решить? – Kovu

+0

Вы должны назвать класс HyperLink кодом, а не asp-разметкой. –

0

Вы должны использовать Repeater вместо добавления текста к InnerHtml. Что-то вроде этого:

<asp:Repeater ID="myRepeater" runat="server" OnItemDataBound="myRepeater_ItemDataBound"> 
    <ItemTemplate> 
     <br/><asp:Literal ID="myText" runat="server"/> - (<asp:HyperLink ID="myLink" runat="server" CssClass="newsLink" Text="..."/>) 
    </ItemTemplate> 
</asp:Repeater> 

..., а затем в код-за:

void Page_Load(object sender, EventArgs e) 
{ 
    if (!IsPostBack) 
    { 
     myRepeater.DataSource = DAL.NewsHandler.GetAllNews(); 
     myRepeater.DataBind(); 
    } 
} 

void myRepeater_ItemDataBound(object sender, RepeaterItemEventArgs e) 
{ 
    if (e.Item.ItemType == ListItemType.Item || 
     e.Item.ItemType == ListItemType.AlternatingItem) 
    { 
     var myText = e.Item.FindControl("myText") as Literal; 
     var myLink = e.Item.FindControl("myLink") as HyperLink; 
     var news = e.Item.DataItem as DAL.News; 
     if (myText != null && myLink != null && news != null) 
     { 
      myText.Text = news.Betreff; 
      myLink.NavigateUrl = "~/News.aspx?id=" + news.NewsID; 
     } 
    } 
} 

Я не пробовал код сам, но он должен направить вас в правильном направлении. Обратитесь к Repeater documentation за дополнительной информацией и примерами.