是否可以实现自定义UserControl
或Control
,它们的作用类似于PlaceHolder
,但符合我的逻辑?使用示例:
<x:MyControl runat="server">
<Template>
<asp:TextBox runat="server" ID="MyTextBox" />
..... any custom code here ........
</Template>
</x:MyControl>
然后在代码背后:
MyTextBox.Text = "ABC";
我实现了测试控件,但无法访问页面级别的嵌套ASP控件。错误是
The name "MyTextBox" does not exist in the current context
。 最佳答案
您必须在用户控件MyControl中调用函数“ FindControl”。
用和id="mcContainer"
命名您的MyControl,然后在调用((TextBox)mcContainer.FindControl("MyTextBox")).Text = "ABC";
的代码上。
有关此内容的Wiki How to: Create Templated ASP.NET User Controls
为什么当MyTextBox.Text="ABC"
在页面中时可以写,为什么当文本框在用户控件实现的命名容器中时却无法实现?
好吧,当您拖动N放下文本框时,ASP.NET页面设计器在为设计器本身保留的页面部分类中为您声明了一个变量,这是在类的设计器部分中声明了页面中的控件的。
因此,当您拖放用户控件并在其命名容器中创建一个文本框时,您将无法直接访问它,因为您的页面没有保存对该控件的引用,原因是该控件仅如果在用户控件本身的实例化期间可以在运行时使用,则动机部分与ASP.NET页解析器呈现控件的方式有关。
引用resource:
使用复合控件时,熟悉许多属性和方法以及INamingContainer接口非常重要。所有复合控件都应实现INamingContainer接口。实现此接口的控件不需要添加任何方法或属性;而是,已实现的接口仅指示该控件正在用作复合控件。效果是呈现了子控件(即复合控件的Controls集合中的控件),以便其ID带有该控件的命名容器的ID前缀。这样可以确保所有子控件都具有唯一的ID值,即使在窗体上有多个父控件实例也是如此。 WebControl类具有NamingContainer属性,该属性返回控件的父级。
因此,当您编写MyTextBox时,您的文本框名称至少应类似于$ mcContainer $ MyTextBox。因此,因此无法透明地执行您的计划。
关于c# - 访问UserControl的模板项,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21635178/