提问人:Mort 提问时间:11/3/2016 更新时间:11/3/2016 访问量:882
从 C Asp.net 中继器外部的代码隐藏访问 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);
但它每次都返回 null。这是 ASPX 代码:
<div class="slider">
<asp:Repeater ID="rptProjectImages" runat="server" OnItemDataBound="rptProjectImages_ItemDataBound">
<ItemTemplate>
</ItemTemplate>
</asp:Repeater>
</div>
答:
2赞
tym32167
11/3/2016
#1
没有 asp.net 工作太久,但这可能会有所帮助
<div id="myDiv" runat="server">...</div>
在代码隐藏中应该是可访问的。myDiv
1赞
Andrei
11/3/2016
#2
此代码的几个问题。
首先,你的 div 只是客户端的,从服务器端的角度来看,它只是一个字符串。通过以下方式将其转换为服务器端控件:
<div class="slider" runat="server" ID="slider">
其次,仅查找直系子项,在本例中为中继器项的子项。 不是其中之一。此外,它不是中继器项模板的一部分,应该可以像在代码隐藏中一样访问,所以只是FindControl
slider
slider.Controls.Add(...
也就是说,除非您显示的中继器是某个“外部”控件的其他模板的一部分。在这种情况下,请确保使用该“外部”控件进行调用。slider
FindControl
最后,不要惹.我敢打赌,这要么会被 ASP.NET 覆盖,要么会导致页面上出现问题。而是将客户端 ID 模式设置为静态并分配 ID 属性:id
input.ClientIDMode = ClientIDMode.Static;
input.ID = string.Format("projectImage_{0}", item.ProjectImageId);
这最终会以更 ASP.NET 合规的方式输出所需的相同值。但需要注意的是,我将“-”替换为“_”——服务器端控件的 ID 中不能有连字符id
评论
0赞
11/3/2016
我远离静态客户端 ID 模式。没有理由使用它,并且已知它至少会导致更新面板出现问题。而且我不确定为什么你假设他试图在中继器中找到滑块。“e”必须是“滑块”div 的父控件,但也许我假设是错误的。
0赞
Andrei
11/3/2016
@AgapwIesu,我之所以这么假设,是因为它自然地适合提供的代码,仅此而已。我不怎么使用静态 ID,但这是帮助 OP 完全按照预期获得 ID 的第一件事。
0赞
Mort
11/3/2016
@Andrei 谢谢,服务器端控件不能有连字符,或者不应该有连字符?
0赞
Andrei
11/3/2016
@MortezaAghili,不能,会导致 ASP.NET 解析错误
1赞
user4843530
11/3/2016
#3
FindControl 在另一个控件中查找一个控件,但这样做会查找该控件的 ID。“slider”控件没有 id,它使用名为“slider”的类,但没有 id。
您需要将控件定义为
<div runat="server" id="Slider" class="slider">
<asp:Repeater ID="rptProjectImages" runat="server" OnItemDataBound="rptProjectImages_ItemDataBound">
<ItemTemplate>
</ItemTemplate>
</asp:Repeater>
</div>
指示框架在代码隐藏中实例化该控件。id 将是作为该控件的对象的名称。然后在你的代码中,你可以做runat="server"
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);
评论
FindControl
slider.Controls.Add