2012-01-22 154 views
9

是否可以访问未在用户控件中定义的属性?我想添加任何html属性,而不用在代码隐藏中定义它。asp.net UserControl属性

例如:

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

凡在用户控件没有定义extraporperty,但仍然会产生:

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

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

ty!

+0

你的.ascx看起来像什么? –

回答

7

是的,这是可能的。去尝试一下!

例如,

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

呈现为:

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

编辑

从评论:

ASP:文本框不是自定义用户控制

以上将适用于自定义服务器控件(派生自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" /> 
+2

asp:文本框不是自定义用户控件 – LZW

+0

LZW所以呢? – Evgeny

4

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

<%@ 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集合使用属性的名称作为从集合中获取值的关键字来读取。

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>