从内容页面获取并转换主页面用户控制以访问特定的UC属性

时间:2013-04-02 09:17:12

标签: c# user-controls master-pages asp.net-2.0

我有一个MasterPage(MyBoxx.Master)引用2个usercontrols:

<%@ Master Language="C#" AutoEventWireup="true" CodeFile="MyBoxx.master.cs" Inherits="MyBoxxMaster" %>
<%@ Register TagPrefix="uc1" TagName="Header" Src="Header.ascx" %>
<%@ Register TagPrefix="uc1" TagName="Footer" Src="Footer.ascx" %>

我的用户控件“标题”包含搜索框。我想在访问某些页面时隐藏此搜索框。因此,我向用户控件添加了一个布尔属性,并在渲染usercontrol时使用此属性来确定是否显示搜索框:

public partial class uxHeader : System.Web.UI.UserControl
{

    bool _showSearch = true;
    public bool ShowSearch
    {
        get { return _showSearch; }
        set { _showSearch = value; }
    }
    [...]
    protected void Page_Load(object sender, EventArgs e)
    {
        [...]
        searchBox.Visible = _showSearch;

    }
}

然后我尝试从内容页面访问此“ShowSearch”属性:

((uxHeader)Page.Master.FindControl("Header1")).ShowSearch = false;

问题是我在尝试编译时遇到以下错误:

Error   15  The type or namespace name 'uxHeader' could not be found (are you missing a using directive or an assembly reference?)

事情是我确定我已经让它工作并在某些时候进行编译,因为它适用于之前发布的生产版本。但现在我正在对同一站点中的其他内容进行更改,并且无法再编译。

在SO的各个帖子中,我尝试将以下行添加到我的内容页面aspx:

<%@ MasterType VirtualPath="~/MyBoxx.master"%>
<%@ Reference VirtualPath="~/MyBoxx.master" %>

没有任何成功!我还看到了关于生命周期页面的一些答案,但这不是问题,因为我在编译时遇到错误,而不是执行时的错误。

如果有人对如何解决这个问题有任何建议,我将非常感谢。

谢谢!

2 个答案:

答案 0 :(得分:2)

好吧,我找到了几个有效的解决方案......我想我明白了它之前是如何工作的?

1)似乎编译在这方面起作用。如果我评论该行,编译该站点,然后尝试再次添加该行,类型uxHeader在VS中是“可用的”,我可以使用未注释的行再次编译该站点...

2)由于第一个解决方案显然不是一个长期的解决方案,我发现在内容页面aspx中引用用户控件(当然没有实际使用它)可以解决这个问题:

<%@ Register TagPrefix="uc1" TagName="Header" Src="Header.ascx" %>

3)我也试过这个,我觉得最干净...... 在母版页中,公开一个公共属性:

public uxHeader PageHeader
{
    get
    {
        return Header1;//Header1 is the id of the userControl dropped in masterpage
    }
}

在内容页面aspx中,我然后输入:

<%@ MasterType VirtualPath="~/DBoxx.master"%>

然后,仍然在内容页面中,但在代码隐藏中,并在编译完网站后,我可以使用:

this.Master.PageHeader.ShowSearch = false;

希望这将有助于那些寻求未来主题帮助的人。我认为这是一个难以回答的问题

答案 1 :(得分:1)

根据您对用户控件进行编码的方式,您可能会或可能无法在将其作为母版页属性公开给母版页时访问其所有属性/方法。

这是一个有效的解决方案:

在您的母版页中,您需要注册您的用户控件(.ascx)并将其放在表单标记内的主文件中。

注册用户控件

<%@ Register Src="~/Controls/MyUserControl.ascx" TagPrefix="uc" TagName="MyUserControl" %>

将用户控件添加到母版页

<form id="frmMain" runat="server">
        <uc:MyUserControl runat="server" ID="ucMyUserControl" />
        <div id="main-wrapper">
            <div id="main">...

现在,对于内容页面,您必须在使用您要使用该控件的母版页的每个内容页面中创建一个引用。

在内容页面中添加参考

<%@ Reference Control="~/Controls/MyUserControl.ascx" %>

现在,您可以在页面级别设置公共变量并访问它的属性/方法

  

部分类MyPage

  Inherits System.Web.UI.Page

  Public usrCtrl As MyUserControl


Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load

    If Master.FindControl("ucMyUserControl") IsNot Nothing Then
        usrCtrl = CType(Master.FindControl("ucMyUserControl"), MyUserControl)
        usrCtrl.ExecMyMethod()
    End If
    ...