场景非常简单。我有一个带有用户控件的aspx页面。我想在aspx页面的pageload上设置一个值并从usercontrol获取响应。 SET作业已完成,但无法获取响应。它总是空的。我尝试了两种方法,但都没有。
ASPX PAGE
<uc1:ucContent ID="Content1" runat="server" />
代码背后
protected void Page_Load(object sender, EventArgs e)
{
// SET job is working without any problem
Content1.ItemName = "X";
//METHOD ONE:
Page.Title = Content1.MetaPageTitle;
//METHOD TWO:
HiddenField hdnPageTitle = (HiddenField)Content1.FindControl("hdnMetaPageTitle");
Page.Title = hdnPageTitle.Value;
}
用户控制
protected void Page_Load(object sender, EventArgs e)
{
if (string.IsNullOrEmpty(itemName))
{
// GET DATA FROM DB
// METHOD ONE:
hdnTitle.Value = DB.DATA;
// METHOD TWO:
metaPageTitle = DB.DATA;
}
}
private string metaPageTitle;
public string MetaPageTitle
{
// METHOD ONE:
get { return metaPageTitle; }
// METHOD TWO:
get { return hdnTitle.value; }
}
修改
itemName是一个UserControl属性,用于从父页面获取值:
private string itemName;
public string ItemName
{
set { itemName = value; }
}
感谢你提前给予的帮助!
答案 0 :(得分:1)
我认为问题是page
的{{1}}是在Page_Load
之前触发的(看看:asp.net: what's the page life cycle order of a control/page compared to a user contorl inside it?)。
因此,您可以在UserControl
中设置属性:
在Page_init
:
UserControl
现在这应该适用于您的网页protected void Page_Init(object sender, EventArgs e)
{
if (string.IsNullOrEmpty(itemName))
{
// GET DATA FROM DB
hdnTitle.Value = DB.DATA;
}
}
:
Page_Load
通常我更喜欢Page和UserControl之间的另一种通信。它被称为事件驱动的通信,意味着当Page.Title = Content1.MetaPageTitle;
发生变化时,您应该在UC中触发自定义事件(因此在适当的事件处理程序中)。
然后页面可以处理此特定事件并做出相应的反应。
Mastering Page-UserControl Communication - event driven communication