假设我有一个 ASCX 用户控件,需要访问当前用户的全名。一个 ASPX 页面在顶部包含这一行
<%@ Register src="top.ascx" tagprefix="custom" tagname="top" %>
和正文中的这一行:
<custom:top runat="server" />
ASPX 文件知道当前用户的用户 ID,并且可以确定他的全名。那么如何使用 ASPX 文件运行的代码将其信息提供给 ASCX 文件呢?
假设我有一个 ASCX 用户控件,需要访问当前用户的全名。一个 ASPX 页面在顶部包含这一行
<%@ Register src="top.ascx" tagprefix="custom" tagname="top" %>
和正文中的这一行:
<custom:top runat="server" />
ASPX 文件知道当前用户的用户 ID,并且可以确定他的全名。那么如何使用 ASPX 文件运行的代码将其信息提供给 ASCX 文件呢?
在 UserControl 上声明一个属性并让父页面设置它。
在您的用户控件上:
public string FullName { get; set; }
在 aspx 页面上,或者在后面的代码中设置它
YourUserControl.FullName = FullName
或通过标记
<custom:top runat="server" FullName="<%= SomeProperty %>" />
您可以使用用户控件的Page
属性并将其转换为您的页面实例。然后,调用页面类的方法来获取用户名。
要在动态编译的项目中进行这项工作,您必须做更多的工作才能让控件识别动态编译页面的数据类型。这是一个关于如何做的简短教程。
或者,正如Brandon 所概述的那样,做相反的事情,让您的页面告诉您的用户控制信息。
这听起来您可能对页面生命周期的工作方式以及如何跨控件公开数据有误。例如,假设您的 ASPX 中有以下代码:
public override void OnLoad(EventArgs e)
{
string userName = "Bob";
}
在 ASPX 文件中,您可以引用控件并在其上设置属性以传递数据:
<custom:top ID="someControl" runat="server" />
您在top
控件中公开一个属性,如下所示:
public string UserName { get; set; }
然后,您可以将此代码添加到您的OnLoad
方法中:
someControl.UserName = userName;
然后您的控件将有权访问该数据。或者,如果您没有直接连接到控件的线路,您可以将内容粘贴到请求缓存中:
HttpContext.Current.Items["key"] = userName;
然后通过相同的方式从您的控件中提取数据:
string fromCache = HttpContext.Current.Items["key"];
您可以通过多种方式解决此问题。我通常使用会话变量,因为用户将被绑定到会话。
在 ASPX 中(或当用户登录时):
Session["UserFullName"] = GetFullName(); //Code to get full name here
在 ASMX 中:
this.FullName = Session["UserFullName"]; //TODO: Check for null values