views:

203

answers:

3

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>
+1  A: 

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"

http://stackoverflow.com/questions/2366720/can-i-get-the-currently-opened-asp-page-file-name-in-visual-studio-net-in-a-custo/2367237#2367237

David Stratton
+3  A: 

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)

Dave Swersky
That's pretty much what I suggested as the "more standard" approach (with example) in my previous answer that I linked to. in my previous answer. But I'll vote you up because I agree with your approach 100%.
David Stratton
Thank you David and Dave. I edited the question to incorporate my take on your suggestion(s) which work well.
John Galt
A: 

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.

M4N