Question

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>
Was it helpful?

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)

OTHER TIPS

This is similar to a previous question. My answer there has a link showing how this can be done, as well as an alternate approach that's more "standard"

Can I get the currently opened ASP page file name in Visual Studio.NET in a custom control?

Yes, a control can access its context, e.g. using Me.Page (I hope this is how it's done in VB.NET) to access the page.

The problem with this approach is, that it makes your controls less reusable, because they will only work in contexts which they know. Probably it would be better to switch the dependency, i.e. the page/parent control should call a GetPageTitle() method of your control and do the appropriate things with the return value.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top