【问题标题】:How to change control value in MasterPage from user control ?如何从用户控件更改 MasterPage 中的控件值?
【发布时间】:2012-04-03 15:54:10
【问题描述】:

我想从用户控件更改母版页中存在的控件值,场景如下:
在用户控件加载方法中,我使用名为“catID”的查询字符串参数来获取类别实体,然后我想将类别标题设置为位于母版页中的标题标签(类别标题)的值。
我试图更改用户控件页面加载控件中的标题,但母版页面加载方法执行得更早。

有什么想法吗?

【问题讨论】:

  • 这绝对是一种可怕的做法。完全违反了“关注点分离”原则等等。用户控件不应该改变母版页,页面应该。此外,用户控件应该不知道它的放置位置。你拥有它的方式就是紧耦合。
  • @Mrchief:+1 但 UserControls 的目的并不总是分离和可重用性,有时是封装和简化。在这种情况下,用户控件本身采用页面作为控制器的角色,页面仅控制包含用户控件的可见性。考虑 f.e. lazy-loading TabPanels of a TabContainer 的场景,其中所有面板都包含一个具有页面全部功能的用户控件。
  • @Tim:没错,这里的用户控件采用了页面的角色。我的项目中只有一个aspx,它根据查询参数控制用户控件的可见性。

标签: c# .net asp.net


【解决方案1】:

在您的 MasterPage 中提供一个设置标题的公共方法,例如:

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

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

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

【讨论】:

    【解决方案2】:

    如果它是一个查询字符串参数,您应该能够读取“catId”,即从后面的 Masterpage 代码中读取并设置标题。

    编辑:

    然后尝试一个属性: 在用户控件中

    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;
    }
    

    【讨论】:

    • 你的权利,我可以这样做,但如果我在母版页中获得类别实体并且我已经在用户控件中获得它,那就不好了。
    • 这很好,但它不起作用,因为我在 default.aspx 中加载了没有标题标签的用户控件......只有容器和一些其他标签......标题标签在 Master页面
    【解决方案3】:
     ((Label)Master.FindControl("loadlbl")).Text = "your text";
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-06
      • 1970-01-01
      相关资源
      最近更新 更多