C# 如何通过标记在ASP.NET WebControl上设置自定义对象属性

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 {

我正在努力设置一个自定义属性,该属性应该指向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 { 
    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事件之后发生,这对我来说太晚了。