Может ли пользовательский элемент управления ASP.NET определить его контекст или родительский файл .aspx - PullRequest
1 голос
/ 09 марта 2010

Может ли пользовательский элемент управления каким-либо образом определить свой "контекст" или родительскую страницу .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>

Ответы [ 3 ]

3 голосов
/ 09 марта 2010

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

1 голос
/ 09 марта 2010

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

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

0 голосов
/ 09 марта 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...