是否可以通过ASP.NET服务器控件模板内的数据绑定表达式输出web控件?
我已经在互联网上搜索了两天了,包括这里,但是我找不到任何类似的处理方法。另外,这是我关于堆栈溢出的第一篇文章,请耐心听我说:] 问题是: 这是我第一次真正创建一个模板服务器控件,但是在MSDN的帮助下,我在模板主题上毫无问题地完成了这项工作。我实现了一个控件,可以这样使用:是否可以通过ASP.NET服务器控件模板内的数据绑定表达式输出web控件?,asp.net,custom-server-controls,servercontrols,Asp.net,Custom Server Controls,Servercontrols,我已经在互联网上搜索了两天了,包括这里,但是我找不到任何类似的处理方法。另外,这是我关于堆栈溢出的第一篇文章,请耐心听我说:] 问题是: 这是我第一次真正创建一个模板服务器控件,但是在MSDN的帮助下,我在模板主题上毫无问题地完成了这项工作。我实现了一个控件,可以这样使用: <test:TemplatedControl ID="templatedControl" runat="server"> <Template> Template start:
<test:TemplatedControl ID="templatedControl" runat="server">
<Template>
Template start:
<%# Container.EmailText %>
<%# Container.EmailField %>
Template end.
</Template>
</test:TemplatedControl>
容器类的两个属性都可以正常工作,并且在编写模板时可以通过数据绑定表达式访问,但是EmailField被呈现为System.Web.UI.WebControl.TextBox,这在给定代码中是正常的。控件的输出为:
<div style="border-width:2px;border-style:Outset;">
Template start:
E-mail:
System.Web.UI.WebControls.TextBox
Template end.
</div>
模板开始:
电邮:
System.Web.UI.WebControls.TextBox
模板结束。
现在的问题是:是否可以通过绑定表达式将控件(如此处的文本框)作为实际控件作为其他数据输出回模板?
如果这是可能的,那么可以分离此控件(包括其子控件)的输出,并根据需要通过模板将其放在一起
我担心这可能根本不可能实现,但我希望有人能澄清这一点。如果是这样的话,我也愿意接受其他方法的建议。如果你对我为什么要这么做感兴趣,请阅读下面的内容
采取这种做法的原因是:
我正在构建一个复合服务器控件,客户自己将在其站点上使用它,该站点仍在开发中。因此,还不知道控件输出的最终布局和格式需求。相反,该控件需要在布局和设计方面具有灵活的输出,因此可以对其进行自定义,以便稍后与站点匹配
设计部分可以通过为控件设置一些CSS类属性来实现,尽管为客户配置可能会很麻烦,因为控件的输出将非常复杂
我不确定如何实现可定制的布局要求,例如,在表结构中呈现表单字段,或在div中呈现表单字段,或者可能只是内联而不添加HTML,等等
因此,我没有提供几种预先制作好的输出类型,而是想出了一个主意,我的控件呈现的输出可以模板化,这可以解决布局和设计灵活性问题。客户将声明性地设置一个模板来包装我的模板需要呈现的内容,这也将使他能够根据需要将所有CSS类设置为包装元素。这就引出了前面提到的问题
提前感谢,
Garkin我认为您需要一个抽象类来定义
模板容器所需的内容。例如:
public abstract class TemplateContainer : WebControl, INamingContainer
{
public abstract Literal EmailText { get; }
public abstract TextBox EmailField { get; }
}
然后需要测试:TemplateControl
Template
来实现TemplateContainer
通过这种方式,您可以使用EmailText
和EmailField
来应用MaxLength
等。尽管您可能希望在使用它们之前验证它们是否为null
if(EmailText != null)
{
//use EmailText
}
然后,服务器控件的使用者将创建一个控件UserTemplate.ascx
,类似于:
Template start:
<asp:Literal ID="emailText" runat="server" />
<asp:TextBox ID="emailField" runat="server" />
Template end.
----编辑----
基于所有这些,您包含test:TemplatedControl
的页面将如下所示(假设UserTemplate.ascx
的路径别名为test:UserTemplate
):
我认为您需要一个抽象类来定义TemplateContainer
所需的内容。例如:
public abstract class TemplateContainer : WebControl, INamingContainer
{
public abstract Literal EmailText { get; }
public abstract TextBox EmailField { get; }
}
然后需要测试:TemplateControl
Template
来实现TemplateContainer
通过这种方式,您可以使用EmailText
和EmailField
来应用MaxLength
等。尽管您可能希望在使用它们之前验证它们是否为null
if(EmailText != null)
{
//use EmailText
}
然后,服务器控件的使用者将创建一个控件UserTemplate.ascx
,类似于:
Template start:
<asp:Literal ID="emailText" runat="server" />
<asp:TextBox ID="emailField" runat="server" />
Template end.
----编辑----
基于所有这些,您包含test:TemplatedControl
的页面将如下所示(假设UserTemplate.ascx
的路径别名为test:UserTemplate
):
您的代码与:Template start:Template end有何不同代码>我希望保留对这些控件的控制,因为我以后需要在服务器控件中使用它们。我需要知道哪个字段是哪个,ID等等。它们一起代表一种特定的形式。我只是想让这个服务器控件的使用者能够通过模板决定这些控件的位置。在这些假设下,我可能已经走错了方向。服务器控件的使用者将如何确定这些控件的位置?他们是在ASP.NET中开发的吗?是的,他们将在正在开发的ASP.NET网站中使用控件。因此,他们不仅希望能够自定义样式,还希望能够根据届时网站的结构来自定义HTML布局。您的代码与:Template start:Template end有何不同代码>我希望保留对这些控件的控制,因为我以后需要在服务器控件中使用它们。我需要知道哪个字段是哪个,ID等等。它们一起代表一种特定的形式。我只是想让这个服务器控件的使用者能够通过模板决定这些控件的位置。在这些假设下,我可能已经走错了方向。服务器控件的使用者将如何确定这些控件的位置?他们是在ASP.NET中开发的吗?是的
templatedControl.Template.EmailText.Text = "Email: ";
templatedControl.Template.EmailField.MaxLength = 10;