asp.net UserControl properties

本文关键字:properties UserControl net asp | 更新日期: 2023-09-27 18:21:16

是否可以访问用户控件中未定义的属性?我想添加任何html属性,而不在codebehind中定义它。

例如:

<my:TextBox runat="server" extraproperty="extravalue" />

在用户控制中未定义企业外,但仍生成:

<input type="text" extraproperty="extravalue" />

我需要这个在自定义用户控制。注意文本框前的my:。

ty!

asp.net UserControl properties

是的,这是可能的。试试看!

例如,

<asp:TextBox ID="MyTextBox" runat="server" extraproperty="extravalue" />

渲染为:

<input name="...$MyTextBox" type="text" id="..._MyTextBox" extraproperty="extravalue" />

编辑

来自评论:

asp:textbox不是自定义用户控件

以上内容适用于自定义服务器控件(派生自WebControl),但不适用于UserControl,因为UserControl没有可以放置属性的标记:它只呈现其内容。

因此,您需要UserControl类中的代码来将自定义属性添加到它的一个子控件中。然后,UserControl可以将自定义属性公开为属性,类似于:

// Inside the UserControl
public string ExtraProperty
{
    get { return myTextBox.Attributes["extraproperty"]; }
    set { myTextBox.Attributes["extraproperty"] = value; }
}
// Consumers of the UserControl
<my:CustomUserControl ... ExtraProperty="extravalue" />

实际上,您不必声明属性就可以将它们用作属性。举一个非常简单的例子:

<%@ Page Language="C#" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<%@ Register TagPrefix="uc" TagName="Test" Src="~/UserControls/Test.ascx" %>
<uc:Test runat="server" extraproperty="extravalue" />

在您的用户控件的代码文件中,您可以从以下任何属性中获取值:

protected void Page_Load(object sender, EventArgs e)
{
  string p = Attributes["extraproperty"];
}

正如您所看到的,可以通过Attributes集合读取放置在用户控件上的所有属性,使用属性的名称作为从集合中获取值的键。

您应该能够将属性添加到控件的attributes集合中。

是的,看看IAttributeAccessor接口。ASP.NET UserControl对象显式实现了此接口。这允许将直接添加到标记中控件的任何属性传输到服务器端属性集合。

请注意,UserControl上的默认实现不可重写,而是从其内部属性集合中写入和读取。要在用户控件中将这些属性呈现为HTML,请在标记中执行以下操作:

<div runat="server" ID="pnlOutermostDiv">
// control markup goes here
</div>

然后在用户控件的代码后面做这样的事情:

protected override void OnPreRender(EventArgs e)
{
    foreach (string key in Attributes.Keys)
    {
        pnlOutermostDiv.Attributes.Add(key, Attributes[key]);
    }
    base.OnPreRender(e);
}

现在,当你使用这样的控件时:

<my:TextBox runat="server" extraproperty="extravalue" />

它将呈现如下:

<div id="ctl00_blablabla_blablabla" extraproperty="extravalue">
// rendered control HTML here
</div>