用户控件的行为类似于 asp.net 中的面板

本文关键字:net asp 类似于 控件 用户 | 更新日期: 2023-09-27 17:55:20

我有几个自定义用户控件(100+),它们都涉及一个通用的格式,这基本上要求我们将用户控件包装在目标页面上的面板控件中。 为简单起见,我想创建一个处理此问题的基本控件,因为对于每个自定义控件,几乎所有基本功能都是相同的。

为此,我

所做的是创建一个基类,在该基类中我创建一个私有面板控件,然后重写 Render 以在基类周围生成面板前/后标记。呈现。

现在这很好用,因为我们关心的所有用户控件都继承了这个,并且我们向继承的控件公开的少数格式项按预期工作(宽度、CssClass 等)。

我真正想要的是通过基类将所有面板控件项公开给继承的控件,但不必正确使用属性/方法来公开每个元素。

关于最好的方法是什么的任何想法? 我只是不想手动实现每个面板属性/方法。 我们也使用设计时属性(第一个是CssClass和Width),但我们一直在使用设计时属性的用户...

我们所拥有的工作,只是在寻找一个更容易/更好的解决方案。

using System;
using System.Collections;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public class BaseUserControl : System.Web.UI.UserControl
{
    private Panel _panel;
    private bool _isPanelLoaded;
    public Panel Panel
    {
        get
        {
            if (_panel == null)
            {
                _panel = new Panel();
                _isPanelLoaded = true;
            }
            return _panel;
        }
    }
    public BaseUserControl()
    {
    }
    protected override void Render(HtmlTextWriter writer)
    {
        if (_isPanelLoaded)
        {
            Panel.RenderBeginTag(writer);
            base.Render(writer);
            Panel.RenderEndTag(writer);
        }
        else
        {
            base.Render(writer);
        }
    }
    public Unit Width
    {
        get
        {
            if (Panel.Width.IsEmpty)
            {
                return 0;
            }
            return Panel.Width;
        }
        set
        {
            Panel.Width = value;
        }
    }
    public string CssClass
    {
        get
        {
            return Panel.CssClass;
        }
        set
        {
            Panel.CssClass = value;
        }
    }
}

用户控件的行为类似于 asp.net 中的面板

为了公开所有属性,您必须从 Panel 控件继承。 由于您有一个面板属性,因此您可以设置该属性的属性。 在标记中定义它们是一项挑战...对于大多数简单的对象,如果您为属性提供 <PersistenceMode(PersistenceMode.Attribute)> 的属性,您将能够访问 Panel-CssClass 的 sytnax 中的属性,但我不知道这是否适合您,因为 Panel 是一个控件。 好好试试。

您实质上是在谈论编写一次包装所需属性的属性,因此,如果前一种解决方案不起作用,最好只这样做。