【问题标题】:Get and cast Masterpage UserControl from Content Page to access specific UC Property从内容页面获取并转换 Masterpage UserControl 以访问特定的 UC 属性
【发布时间】:2013-04-02 09:17:11
【问题描述】:

我有一个引用 2 个用户控件的 MasterPage (MyBoxx.Master):

<%@ 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" %>

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

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" %>

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

如果有人对我如何永久解决此问题有任何建议,我将不胜感激。

谢谢!

【问题讨论】:

  • 这部分(uxHeader)Page.Master.FindControl 是在代码隐藏中还是在aspx 文件中?尝试为此类使用完全限定名称 - 会有所帮助吗?您在 Visual Studio 中构建期间或在浏览器中通过 ASP.Net 编译期间是否遇到编译错误?所有类(母版页、页面、控件)是否共享同一个程序集?
  • 此代码位于代码隐藏中。我在构建过程中遇到编译错误。它们都具有相同的组件。我实际上正在研究一个可能的解决方案,如果我成功了,我当然会发布答案......
  • 好的,那你需要using my.namespace.here;(my.namespace.here.uxHeader)Page.Master.FindControl
  • 我会使用配置文件...

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


【解决方案1】:

嗯,我找到了几个可行的解决方案……我想我更早地理解了它是如何/为什么起作用的

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;

希望这将有助于那些在未来寻求有关该主题的帮助的人。我看到这是一个反复出现的问题

【讨论】:

  • 您能否帮助从内容页面访问用户控件。在母版页中: 在内容页中:ShoppingCartControl myWCtl = this.Master.FindControl("myCtl") as ShoppingCartControl;它给出错误:“类型或命名空间不存在!任何想法?
  • 您是否尝试过上面的解决方案?如果是并且问题仍然存在,最好打开您自己的问题,并完整描述问题以及您尝试解决的问题
【解决方案2】:

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

这是一个可行的解决方案:

在您的母版页中,您需要注册您的用户控件 (.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" %>

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

部分类我的页面

  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
    ...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多