C# 如何通过标记在ASP.NET WebControl上设置自定义对象属性
我正在努力设置一个自定义属性,该属性应该指向ASP.NET网络控件上自定义类的实例 示例web控件:C# 如何通过标记在ASP.NET WebControl上设置自定义对象属性,c#,asp.net,custom-controls,web-controls,C#,Asp.net,Custom Controls,Web Controls,我正在努力设置一个自定义属性,该属性应该指向ASP.NET网络控件上自定义类的实例 示例web控件: public class CustomControl : System.Web.UI.WebControls.Panel { public IFactory Factory { get; set; } } 代码隐藏: public partial class Main : System.Web.UI.Page { public IFactory GetFactory {
public class CustomControl : System.Web.UI.WebControls.Panel
{
public IFactory Factory { get; set; }
}
代码隐藏:
public partial class Main : System.Web.UI.Page
{
public IFactory GetFactory {
get { return new CustomFactory(); }
}
}
public class CustomFactory : IFactory {}
自定义工厂将根据代码隐藏进行初始化。在我的标记中(不是在代码隐藏中),我需要将CustomControl上的Factory属性设置为代码隐藏中的实例。
我尝试的内联代码的任何变体都不起作用:
<asp:CustomControl ID="MyCustomControl" Factory="<%GetFactory%>" runat="server" />
<asp:CustomControl ID="MyCustomControl" Factory="<%=GetFactory%>" runat="server" />
有人能帮忙吗 您不能在控件标记上分配它,标记标记被呈现为html,并且没有这样做的逻辑,html不会解释
GetFactory
的结果。
您可以做的是在标记上设置if,而不是在control tag属性上,而是在代码括号内,如下所示:
<%MyCustomControl.Factory = this.GetFactory;%>
为什么它必须在标记中?为了让代码更干净。我不确定这是不是一个好的理由——如果试图让代码更干净,你就是在破坏标记。我不一定明白添加一行代码会如何使后面的代码变得混乱。我的思路是,用户将控件放入aspx中,并在那里设置其所有属性,而不必转到后面的代码来执行任何其他操作。我尝试了这一点,但在自定义控件的OnInit上,Factory属性为null。上面的代码是否在OnPreRender上执行?如果Factory
属性为null,则无所谓,因为您正在将其值设置为this.GetFactory
。控件可能为null
。为了更好地理解这一点,请查看在上发生了什么(请参见渲染部分)。我想说的是,我可以按照您的建议执行,但该赋值将在OnPreRender事件之后发生,这对我来说太晚了。