Может ли пользовательский элемент управления ASP.NET определить свой контекст или родительский файл .aspx

Возможно ли, чтобы пользовательский элемент управления каким-то образом определял свой «контекст» или родительскую страницу .aspx?

Прямо сейчас у меня есть пользовательский элемент управления, который объявлен на типичной странице .aspx следующим образом:

<%@ Register TagPrefix="uc1" TagName="ManageTitle" Src="../UserControls/ManageTitle.ascx" %>

Пользовательский элемент управления в настоящее время создает текстовое поле следующим образом:

<asp:textbox id="txtTitle" runat="server" MaxLength="60"
ToolTip="Describe the item with a short pithy title - most important keywords first"/> 

В настоящее время page_load для этого файла .ascx выглядит следующим образом:

Me.txtTitle.Text = SetPageTitle()

Хотя в некоторых местах этого веб-приложения это необходимо (например, текстовое поле, где конечный пользователь может ввести «заголовок»), у меня есть другие места, где я хочу отображать информацию «заголовок» в режиме «только для чтения». Например, вместо текстового поля я мог бы использовать элемент управления меткой или текстовое поле с Enabled="false", чтобы предотвратить ввод данных.

Я полагаю, что мог бы клонировать этот небольшой файл .ascx и добавить суффикс к его имени, например, _RO.ascx или что-то в этом роде, но мне интересно, какой подход будет лучшим.

Короче говоря, может ли пользовательский элемент управления получить какой-то «контекст» со страницы, которая объявляет его, или есть лучший способ добиться такого рода вещей? Спасибо.

-- ИЗМЕНИТЬ ОБНОВЛЕНИЕ С ПРЕДЛАГАЕМЫМ ПОДХОДОМ --------------------------

Код, добавленный в UserControl:

Private mIsReadOnly As Boolean

Public Property IsReadOnly() As Boolean
    Get
        IsReadOnly = mIsReadOnly
    End Get
    Set(ByVal value As Boolean)
        mIsReadOnly = value
    End Set
End Property
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    If Page.IsPostBack Then
        'Leave the textbox alone
    Else
        Me.txtTitle.Text = SetPageTitle()      'This is the original code
        If IsReadOnly Then
            Me.txtTitle.Enabled = False
        Else
            Me.txtTitle.Enabled = True
        End If
    End If
End Sub

Код, добавленный к родителю, который вызывает UC:

<uc1:ManageTitle id="ManageTitle" 
    IsReadOnly="True" runat="server">
</uc1:ManageTitle>

person John Adams    schedule 08.03.2010    source источник


Ответы (3)


Если вы хотите следовать распространенным шаблонам, предоставьте общедоступное свойство элемента управления .ascx (в отделенном коде), которое позволяет содержащей его странице программно устанавливать свое состояние. Вы можете создать свойство State, значение которого представляет собой перечисление доступных состояний (только для чтения, редактируемых и т. д.).

person Dave Swersky    schedule 08.03.2010
comment
Это в значительной степени то, что я предложил в качестве более стандартного подхода (с примером) в моем предыдущем ответе, на который я ссылался. в моем предыдущем ответе. Но я проголосую за вас, потому что я согласен с вашим подходом на 100%. - person David; 09.03.2010
comment
Спасибо, Дэвид и Дэйв. Я отредактировал вопрос, чтобы включить мое мнение о ваших предложениях, которые хорошо работают. - person John Adams; 12.03.2010

Это похоже на предыдущий вопрос. В моем ответе есть ссылка, показывающая, как это можно сделать, а также альтернативный подход, более «стандартный».

Можно ли получить имя файла текущей открытой страницы ASP в Visual Studio.NET в пользовательском элементе управления?

person David    schedule 08.03.2010

Да, элемент управления может получить доступ к своему контексту, например. используя Me.Page (надеюсь, так это делается в VB.NET) для доступа к странице.

Проблема с этим подходом в том, что он делает ваши элементы управления менее пригодными для повторного использования, потому что они будут работать только в известных им контекстах. Вероятно, было бы лучше переключить зависимость, т.е. страница/родительский элемент управления должен вызывать метод GetPageTitle() вашего элемента управления и делать соответствующие действия с возвращаемым значением.

person M4N    schedule 08.03.2010