Свойства asp.net UserControl - PullRequest
       4

Свойства asp.net UserControl

9 голосов
/ 22 января 2012

Можно ли получить доступ к свойствам, не определенным в пользовательском элементе управления? Я хочу добавить любой атрибут html, не определяя его в codebehind.

например:

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

где extraporperty не определено в пользовательском элементе управления, но все еще генерирует:

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

Мне нужно это в пользовательском элементе управления. Обратите внимание на my: перед текстовым полем.

ть!

Ответы [ 4 ]

7 голосов
/ 22 января 2012

Да, это возможно.Просто попробуйте!

Например,

<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" />
5 голосов
/ 24 января 2012

На самом деле вам не нужно объявлять свойства, чтобы использовать их в качестве атрибутов. Возьмите этот очень простой пример:

<%@ 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 голосов
/ 22 января 2012

вы должны иметь возможность добавлять атрибуты к элементам управления Коллекция атрибутов .

0 голосов
/ 03 февраля 2014

Да, взгляните на интерфейс 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...