从中继器 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);
我知道这可能不寻常,但我想将 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);