Search code examples
asp.netuser-controlswebformspage-lifecyclepagemethods

Can an ASP.NET user control determine its context or its parent .aspx file


Is it possible for a user control to determine its "context" or its parent .aspx page in some way?

Right now I have a user control that is declared on a typical .aspx page as follows:

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

The user control currently emits a textbox as follows:

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

The page_load for this .ascx file is currently like this:

Me.txtTitle.Text = SetPageTitle()

While some places in this web app need this (i.e. a textbox where end-user can type a "title"), I have other places where I want to show the "title" information in a "read-only" way. For example, rather than a textbox, I could use a label control or a textbox with Enabled="false" to prevent data entry.

I suppose I could clone this small .ascx file and append a suffix to its name like _RO.ascx or something but I am wondering what the best approach would be.

In short, can a user control get some sort of "context" from the page that declares it or is there an altogether better way to accomplish this sort of thing? Thank you.

-- EDIT UPDATE WITH THE APPROACH SUGGESTED --------------------------

Code added to the 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

Code added to the parent which invokes the UC:

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

Solution

  • If you want to follow common patterns, expose a public property on your .ascx control (in the codebehind) that allows the containing page to set its state programmatically. You could create a State property whose value is an enum of available States (readonly, editable, etc)