是否可以访问未在用户控件中定义的属性?我想添加任何html属性而不在codebehind中定义它。
例如:
<my:TextBox runat="server" extraproperty="extravalue" />
其中extraporperty未在用户控件中定义,但仍会生成:
<input type="text" extraproperty="extravalue" />
我需要在自定义用户控件中使用它。请注意my:在文本框之前。
TY!
答案 0 :(得分:7)
是的,这是可能的。试试吧!
例如,
<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" />
答案 1 :(得分:5)
您实际上不必声明属性以将它们用作属性。举一个非常简单的例子:
<%@ 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
集合使用属性名称作为从集合中获取值的键来读取用户控件上的所有属性。
答案 2 :(得分:2)
您应该能够向控件Attributes collection添加属性。
答案 3 :(得分:0)
是的,请查看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>