从 C# 中继器外部的代码隐藏访问 div Asp.net



我知道这可能不寻常,但我想从CodeBehind将htmlGenericControl添加到ItemDataBound中的div(它在中继器之外(。。

HtmlGenericControl slider = (HtmlGenericControl)e.Item.FindControl("slider");
htmlGenericControl input = new HtmlGenericControl("input");
input.Attributes.Add("type", "radio");
input.Attributes.Add("name", "slide_switch");
input.Attributes.Add("id", string.Format("projectImage-{0}", item.ProjectImageId));
slider.Controls.Add(input);

但每次都返回null。这是aspx代码:

  <div class="slider">
      <asp:Repeater ID="rptProjectImages" runat="server" OnItemDataBound="rptProjectImages_ItemDataBound">
           <ItemTemplate>
           </ItemTemplate>
       </asp:Repeater>
   </div>

使用asp.net的时间太长,但这可能有助于

<div id="myDiv" runat="server">...</div>

并且在码尾CCD_ 1应该是可访问的。

此代码的几个问题。

首先,div只是客户端的,从服务器端的角度来看,它只是一个字符串。使用将其转换为服务器端控制

<div class="slider" runat="server" ID="slider">

其次,FindControl只查找直属子项,在您的情况下是中继器项的子项。slider不是其中之一。此外,它不是中继器项目模板的一部分,应该可以在代码背后访问,所以只有

slider.Controls.Add(...

除非slider和您显示的中继器是某个"外部"控件的其他模板的一部分。在这种情况下,请确保使用"外部"控件调用上的FindControl

最后,不要惹id。我打赌这要么会被ASP覆盖。NET,或者会导致页面出现问题。相反,将客户端ID模式设置为静态,并分配ID属性:

input.ClientIDMode = ClientIDMode.Static;
input.ID = string.Format("projectImage_{0}", item.ProjectImageId);

这最终会输出与您需要的id相同的值,但在更多的ASP中。NET兼容的方式。不过需要注意的是,我用"_"替换了"-"-服务器端控件在ID 中不能有连字符

FindControl在另一个控件中查找控件,但查找控件的id。您的"滑块"控件没有id,它使用名为"滑块"的类,但没有id。

您需要将控件定义为

<div runat="server" id="Slider" class="slider">
    <asp:Repeater ID="rptProjectImages" runat="server" OnItemDataBound="rptProjectImages_ItemDataBound">
         <ItemTemplate>
         </ItemTemplate>
     </asp:Repeater>
</div>

runat="server"告诉框架在代码后台实例化该控件。id将是作为该控件的对象的名称。然后在你的代码中,你可以进行

htmlGenericControl input = new HtmlGenericControl("input");
input.Attributes.Add("type", "radio");
input.Attributes.Add("name", "slide_switch");
input.ID = string.Format("projectImage-{0}", item.ProjectImageId);
Slider.Controls.Add(input);

最新更新