ASP.NET ASCX使用实例变量

4

假设我有一个ASCX用户控件,需要访问当前用户的完整名称。一个ASPX页面在顶部包含以下行:

<%@ Register src="top.ascx" tagprefix="custom" tagname="top" %>

and this line in the body:

<custom:top runat="server" />

ASPX文件知道当前用户的用户ID,并可以确定他的全名。那么我如何使用由ASPX文件运行的代码将其信息提供给ASCX文件?
4个回答

6
在用户控件上声明一个属性,并让父页面设置它。
在您的用户控件中:
public string FullName { get; set; }

在aspx页面上,可以在代码后台中进行设置。
YourUserControl.FullName = FullName

或通过标记

<custom:top runat="server" FullName="<%= SomeProperty %>" />

1
谢谢这个想法,Brandon!这肯定会很有用。 - user1325179

4
你可以使用用户控件的Page属性并将其转换为页面实例。然后,调用页面类的方法以获取用户名。
为了使此功能在动态编译的项目中工作,您需要进行更多的工作,以使控件识别动态编译页面的数据类型。这里是一个简短的教程,介绍如何做到这一点
或者,如Brandon所述,相反地让您的页面告诉您的用户控件信息。

1
你第一段的答案对我最有效。我以为我已经尝试过这个方法了。它非常好用,而且实现起来很简单,而Brandon的解决方案虽然很酷,但需要更多的工作。谢谢! - user1325179

0
你可以用几种方法来实现这个。我通常使用会话变量,因为用户将绑定到会话中。
在 ASPX 中(或当用户登录时):
Session["UserFullName"] = GetFullName(); //Code to get full name here

在 ASMX 中:

this.FullName = Session["UserFullName"]; //TODO: Check for null values

0

这听起来你可能对页面生命周期的工作方式以及如何在控件之间共享数据有所误解。例如,假设您在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"];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接