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

Access to div from codebehind who's outside a repeater Asp.net C#

我知道这可能不寻常,但我想将 htmlGenericControl 添加到 CodeBehind 的 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);

但每次都是 return 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>

并且在代码隐藏中 myDiv 应该可以访问。

这段代码有几个问题。

首先,您的 div 只是客户端,从服务器端的角度来看,它只是一个字符串。将它变成服务器端控件:

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

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

slider.Controls.Add(...

除非 slider 和您显示的转发器是某些 "outer" 控件的其他模板的一部分。在这种情况下,请确保使用 "outer" 控件调用 FindControl on.

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

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

这最终会输出与您需要的 id 相同的值,但会以更符合 ASP.NET 的方式输出。不过需要注意的是,我将“-”替换为“_”——服务器端控件在 ID

中不能有连字符

FindControl 在另一个控件中查找控件,但这样做是为了查找控件的 ID。您的 "slider" 控件没有 ID,它使用名为 "slider" 的 class 但没有 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);