【问题标题】:Inheriting a web server control in a simple fashion?以简单的方式继承 Web 服务器控件?
【发布时间】:2009-06-17 14:30:30
【问题描述】:

我有一个中继器用作一种 Paging TagCloud。为此,我向 Page 的 ViewState 添加了简单的属性,例如 Page、RowCount 等...

我觉得它不属于那里,但我在服务器控制、调试、dll 和部署方面的经历很糟糕。

我是否可以只继承Repeater 类,添加一些ControlState/ViewState 属性,并能够完全像直接从工具箱中拖出的Repeater 一样使用它?

在这里,有以下简单的类:

    public class TagCloud : Repeater
{
    public int selectedIndex;

    public TagCloud()
    {
        selectedIndex = -1;
        //
        // TODO: Add constructor logic here
        //
    }

    public int SelectedIndex
    {
        get { return selectedIndex; }
        set { selectedIndex = value; }
    }
}

如果不创建新的 WebControlLibrary 项目,这个 cs 文件能否位于 App_Code 文件夹中并按预期工作?

谢谢。

【问题讨论】:

    标签: c# asp.net custom-server-controls


    【解决方案1】:

    是的,这样做没有问题。只要你使用控件的属性语法:

    公共 int RowCount
    {

      get { return (int) (ViewState["RowCount"] ?? 0); }
      set { ViewState["RowCount"] = value; }
    

    }

    此外,为了使您的属性看起来与默认属性相同,您可以添加 Description 或 DefaultValue 属性。

    【讨论】:

    • 我知道如何声明使用 ViewState 的属性,如果我缺少属性,它可能是在类级别,因为我的工具箱中没有“TagCloud”。
    • 要将自定义控件放入工具箱中,您需要在新的 dll 项目中创建它,然后通过“选择项目”属性将其添加到工具箱中。
    • 好吧,谢谢+1,有没有办法可以像这样使用它: 没有它在工具箱中并使用默认中继器的设计器。
    • 很遗憾没有,如果要使用自定义控件并以标记方式使用它们,则需要将它们编译为程序集,然后使用 register 指令。有关该指令的更多信息,请参见msdn.microsoft.com/en-us/library/c76dd5k1.aspx 此处。如果您不想处理程序集,可以通过用户控件创建转发器包装器,但这对我来说听起来有点麻烦。
    【解决方案2】:

    这很有效,并且是构建服务器控件的一种建议方式。试试看。

    【讨论】:

    • 我有一个类 TagCloud 继承自具有简单 int 属性的 Repeater。我必须缺少属性,因为控件似乎没有在工具箱中公开。我需要这样做的最低要求。
    【解决方案3】:

    从 ASP 中继器继承是一种完全有效的方法,只要您正在构建的控件是具有附加属性的中继器。

    如果您觉得您需要的控件实际上是“其他东西”,恰好有一个中继器作为其控件集的一部分,那么您可能需要制作一个复合控件,将一个中继器添加到它的控件集合中,以及其他任何东西需要其他控件。

    例如,您可能希望拥有一个包含转发器、搜索结果标签、指向转发器内容顶部和底部的链接等的控件。此复合控件不是转发器,但可以使用中继器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-10
      • 1970-01-01
      • 2018-03-01
      • 2016-03-29
      • 1970-01-01
      • 2011-05-22
      相关资源
      最近更新 更多