如何从用户控件更改主控页中的控件值?

3
我想从用户控件更改主控件中存在的控制值,情况如下:
在用户控件加载方法中,我使用一个查询字符串参数称为“catID”来获取类别实体,然后我想将类别标题设置为标题标记(类别标题)的值,该标记位于主控件中。
我尝试在用户控件页面加载控件时更改标题,但主控件加载方法会先执行。
有什么想法吗?

2
这是一种非常糟糕的做法。完全违反了“关注点分离”原则和许多其他原则。用户控件不应该更改主页面,而是页面应该更改。此外,用户控件应该对其放置位置保持不可知性。你现在的做法只会造成紧密耦合。 - Mrchief
1
@Mrchief:+1 但是UserControl的目的并不总是分离和重用,有时候是封装和简化。在这种情况下,UserControl本身扮演页面控制器的角色,而页面仅控制包含UserControl的可见性。考虑例如延迟加载TabContainer的TabPanels的场景,其中所有面板都包含具有页面完整功能的UserControl。 - Tim Schmelter
@Tim:没错,这里的用户控件扮演了页面的角色。在我的项目中只有一个aspx文件,它根据查询参数控制用户控件的可见性。 - Dabbas
3个回答

12

在你的主页中提供一个公共方法来设置标题,例如:

public void setTitle(string title)
{
    this.LblTitle.Text = title;
}

然后,您可以从您的UserControl中调用它(YourMasterPage是MasterPage的实际类型):

((YourMasterPage)this.Page.Master).setTitle("new Title");

0
 ((Label)Master.FindControl("loadlbl")).Text = "your text";

0
如果它是一个查询字符串参数,你应该能够从Masterpage的代码后台读取"catId"并设置标题。
编辑:
尝试使用属性: 在用户控件中。
protected void Page_Load(object sender, EventArgs e)
{
    this.MyTitle = "SomeTitle";
}
public string MyTitle { get; set; }

在主页面上:

protected void Page_Load(object sender, EventArgs e)
{
    WebUserControl.PreRender += new EventHandler(WebUserControl_PreRender);
}

void WebUserControl_PreRender(object sender, EventArgs e)
{
    string str = WebUserControl.MyTitle;
    this.Header.Title = str;
}

你说得对,我可以这样做,但是如果在母版页中获取了类别实体,在用户控件中又获取一次,就不好了。 - Dabbas
这很好,但它不起作用,因为我在default.aspx中加载了用户控件,该页面没有标题标签...只有容器和其他一些标签...标题标签在母版页中。 - Dabbas

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