【问题标题】:WebControl's constructor does not have correct attribute valueWebControl 的构造函数没有正确的属性值
【发布时间】:2015-04-01 14:30:33
【问题描述】:

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

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" />

【问题讨论】:

  • 你可以在 setter 中为IsSpecial 运行代码吗?
  • @DStanley 否,因为我根据设置在构造函数中更新了 private readonly 变量。更新了问题。
  • 这应该对你有帮助:stackoverflow.com/questions/13420320/…
  • @RickS 由于我的 readonly 变量,这将不起作用。

标签: c# asp.net asp.net-webcontrol


【解决方案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. 您在用它们做什么。

【讨论】:

  • 这实际上是一个非常合理的解决方案。如果goodies 有许多不同的可能大小,那么这是不合理的。不过它适用于我的情况。
【解决方案2】:

IsSpecial 属性的标记中输入的值在构造函数运行之前不会被分配给该属性。想想看,.. 你期望的代码相当于以下内容:

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

实际发生的事情(简化了!)是:

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

对于构造函数没有办法影响这一点,而且你可能不应该在 WebControl 的构造函数中做太多的事情。

【讨论】:

  • 我认为是这种情况,但是没有解决办法吗?有没有办法可以从 HTML 端将参数传递给构造函数?
  • @Cyber​​neticTwerkGuruOrc,我从未见过它完成并且不熟悉任何编写 asp.net 编译器将调用自定义 ctor 的自定义控件的方式,恐怕。是否有理由必须在 ctor 中完成工作,而不能在控件生命周期的另一个阶段完成?
  • 网络控件做了很多工作,readonly 变量必须保持readonly。这意味着我也不能extend。我想根据这个参数对 web 控件进行一些小改动。我可以创建一个全新的类并将通用代码移动到一个共享类,但我认为这对于我认为只是一个小改动的事情来说工作量太大了。
  • @Cyber​​neticTwerkGuruOrc 如果是private,为什么必须是readonly?你害怕其他代码会重新分配数组吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-25
相关资源
最近更新 更多