1

用户控件是否可以通过某种方式确定其“上下文”或其父 .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 之类的,但我想知道最好的方法是什么。

简而言之,用户控件是否可以从声明它的页面中获取某种“上下文”,或者是否有更好的方法来完成这种事情?谢谢你。

-- 使用建议的方法编辑更新 --------------

添加到用户控件的代码:

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>
4

3 回答 3

3

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

于 2010-03-08T23:18:28.423 回答
1

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

我可以在自定义控件中获取当前在 Visual Studio.NET 中打开的 ASP 页面文件名吗?

于 2010-03-08T23:16:51.623 回答
0

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

这种方法的问题是,它使您的控件的可重用性降低,因为它们只能在他们知道的上下文中工作。切换依赖关系可能会更好,即页面/父控件应该调用控件的GetPageTitle()方法并使用返回值做适当的事情。

于 2010-03-08T23:19:32.727 回答