ASP.NET用户控件是否可以确定其上下文或其父.aspx文件

时间:2010-03-08 23:12:43

标签: asp.net user-controls webforms page-lifecycle pagemethods

用户控件是否有可能以某种方式确定其“上下文”或其父.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"/> 

此.ascx文件的page_load目前是这样的:

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 个答案:

答案 0 :(得分:3)

如果要遵循常见模式,请在.ascx控件(在代码隐藏中)公开一个公共属性,该控件允许包含页面以编程方式设置其状态。您可以创建一个State属性,其值是可用状态的枚举(只读,可编辑等)

答案 1 :(得分:1)

这与之前的问题类似。我的答案有一个链接显示如何做到这一点,以及一个更“标准”的替代方法

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

答案 2 :(得分:0)

是的,控件可以访问其上下文,例如使用Me.Page(我希望这是在VB.NET中完成的方式)来访问页面。

这种方法的问题在于,它使您的控件不再可重用,因为它们只能在他们知道的上下文中工作。可能最好切换依赖项,即页面/父控件应调用控件的GetPageTitle()方法,并使用返回值执行相应的操作。