代码之家  ›  专栏  ›  技术社区  ›  ScottC

ASP.NET转发器未预期输出HTML

  •  0
  • ScottC  · 技术社区  · 7 年前

    HTML格式

    <div class="col-12 text-center">
        <!-- Advert column -->
        <asp:Panel ID="pnl_Adverts" runat="server">
            <asp:Repeater ID="rpt_Adverts" runat="server" OnItemDataBound="rpt_Adverts_ItemDataBound">
                <ItemTemplate>
                    <div class="row advert_row">
                        <asp:Panel ID="pnlAds" runat="server">
                        </asp:Panel>
                    </div>
                </ItemTemplate>
            </asp:Repeater>
        </asp:Panel>
    </div>
    

    在ItemDataBound上,我想这是检查url是否存在并显示超链接的最佳方法。我尝试用Javascript隐藏超链接,但它也隐藏了图像。

    项数据绑定

    protected void rpt_Adverts_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {
        //Get this data item as a datarow
        DataRowView drv = e.Item.DataItem as DataRowView;
    
        //Get the url
        string url = drv.Row["url"].ToString();
    
        //Check if there is an url
        if (url.Length > 0)
        {
            //Create a hyperlink with an image
            HyperLink hlAdvert = new HyperLink()
            {
                ImageUrl = Resources.Main.Url + "/images/ads/" + drv.Row["img"],
                NavigateUrl = drv.Row["url"].ToString(),
                Target = "_blank",
                ToolTip = "Visit",
            };
    
            //Add nofollow attribute to this hyperlink
            hlAdvert.Attributes.Add("rel", "nofollow");
    
            //Add this image link to the advert panel
            pnl_Adverts.Controls.Add(hlAdvert);
        }
        else
        {
            //Create an image
            Image imgAd = new Image()
            {
                ImageUrl = Resources.Main.Url + "/images/ads/" + drv.Row["img"],
                AlternateText = "Advert"
            };
    
            //Add the image to the advert panel
            pnl_Adverts.Controls.Add(imgAd);
        }
    }
    

    这就是它的输出方式,我不知道为什么,但它没有添加超链接到面板,即使我特别添加了超链接控件到ASP面板。

    <div class="col-12 text-center">
        <!-- Advert column -->
        <div id="pnl_Adverts">
    
            <div class="row advert_row">
                <div id="rpt_Adverts_pnlAds_0">
                </div>
            </div>
    
            <div class="row advert_row">
                <div id="rpt_Adverts_pnlAds_1">
                </div>
            </div>
    
            <a title="Visit" rel="nofollow" href="/advertising" target="_blank">
                <img title="Visit" src="/images/ads/advertise_here.png" alt="" /></a><a title="Visit" rel="nofollow" href="/advertising" target="_blank"><img title="Visit" src="/images/ads/advertise_here.png" alt="" /></a>
        </div>
    </div>
    

    这正是我所期待的。

    <div class="col-12 text-center">
        <!-- Advert column -->
        <div id="pnl_Adverts">
            <div class="row advert_row">
                <div id="rpt_Adverts_pnlAds_0">
                    <a title="Visit" rel="nofollow" href="/advertising" target="_blank">
                        <img title="Visit" src="/images/ads/advertise_here.png" alt="" /></a>
                </div>
            </div>
            <div class="row advert_row">
                <div id="rpt_Adverts_pnlAds_1">
                    <a title="Visit" rel="nofollow" href="/advertising" target="_blank">
                        <img title="Visit" src="/images/ads/advertise_here.png" alt="" /></a>
                </div>
            </div>
        </div>
    </div>
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   VDWWD    7 年前

    看来你找错目标了 Panel 添加超链接。 你需要一个小组 pnlAds . 所以在ItemDataBound事件中使用FindControl并使用正确的方法。

    protected void rpt_Adverts_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {
        Panel pnl = e.Item.FindControl("pnlAds") as Panel;
    
        if (url.Length > 0)
        {
            pnl.Controls.Add(hlAdvert);
        }
        else
        {
            pnl.Controls.Add(imgAd);
        }
    }
    
    推荐文章