2015-04-01 58 views
1

我希望我的WebControl的构造函数能够访问IsSpecial(来自HTML)的值。但是,它始终是false。我在假设它在构造函数中是false,因为它在构造函数方法结束之后才读取该值。有没有办法让它知道IsSpecial在构造函数中的正确值?WebControl的构造函数没有正确的属性值

C#:

[DefaultProperty("Text")] 
[ToolboxData("<{0}:WebControlExample runat=server></{0}:WebControlExample>")] 
public class WebControlExample: WebControl, INamingContainer 
{ 
    private readonly int[] goodies; 

    public WebControlExample() 
    { 
     if (this.isSpecial) 
     { 
      goodies = new int[24]; 
     } 
     else 
     { 
      //always reaches here 
      goodies = new int[48]; 
     } 
    } 

    private bool isSpecial= false; 
    public bool IsSpecial 
    { 
     set 
     { 
      this.isSpecial= value; 
     } 
    } 
} 

HTML:

<xyz:WebControlExamplerunat="server" id="webControlExample" IsSpecial="true" /> 
+0

你可以在'IsSpecial'的setter中运行代码吗? – 2015-04-01 14:33:36

+0

@DStanley否,因为我根据设置更新构造函数中的'private readonly'变量。更新了问题。 – 2015-04-01 14:34:28

+0

这应该会对你有帮助:http://stackoverflow.com/questions/13420320/access-webcontrols-markable-properties-in-constructor-asp-net – 2015-04-01 14:37:47

回答

1

这并不是一个很好的解决方案,但如果你有有一个只读数组,你可以有只读阵列和在访问他们包裹:

[DefaultProperty("Text")] 
[ToolboxData("<{0}:WebControlExample runat=server></{0}:WebControlExample>")] 
public class WebControlExample: WebControl, INamingContainer 
{ 
    private readonly int[] goodies = new int[48]; 
    private readonly int[] goodiesSpecial = new int[24]; 

    private bool isSpecial= false; 
    public bool IsSpecial 
    { 
     set 
     { 
      this.isSpecial= value; 
     } 
    } 

    private int[] Goodies 
    { 
     get {return isSpecial ? goodiesSpecial : goodies;} 
    } 
} 

但是你的天堂”说明1.为什么你需要两个不同大小的数组或2.你在做什么与他们。

+0

这实际上是一个非常合理的解决方案。如果“好吃的东西”存在许多不同的可能尺寸,那么这是不合理的。它适用于我的情况。 – 2015-04-01 17:12:44

1

在标记中输入的IsSpecial属性的值将不会被分配给该属性的构造函数运行之后,直到。想想看,...你期待的代码等同于以下:

WebControlExample webControlExample = null; 
webControlExample.IsSpecial = true; 
webControlExample = new WebControlExample(); 

什么是实际发生的情况是(简化!):

WebControlExample webControlExample = null; 
webControlExample = new WebControlExample(); 
webControlExample.IsSpecial = true; 

没有办法影响到本作的构造,你可能不应该在WebControl的构造函数中做任何事情。

+0

我认为这是事实,但是没有解决方法吗?有没有一种方法可以将参数从HTML端传递给构造函数? – 2015-04-01 14:48:00

+0

@Cyber​​neticTwerkGuruOrc,我从来没有看到它完成,并且不熟悉任何编写asp.net编译器将调用自定义ctor的自定义控件的方式,恐怕。是否有理由需要在控制器中完成这项工作,并且不能在控制生命周期的另一个阶段完成? – Rob 2015-04-01 14:53:59

+0

Web控件做了很多工作,'readonly'变量必须保持'readonly'。这意味着我也不能“延长”。我想根据这个参数在Web控件上做一个小的变化。我可以创建一个全新的类并将通用代码移到共享类中,但是我认为这对于我认为是一个小改变的东西来说太过分了。 – 2015-04-01 15:02:24