代码之家  ›  专栏  ›  技术社区  ›  Kelly Robins

在ASP.net中重写母版页函数

  •  1
  • Kelly Robins  · 技术社区  · 17 年前

    在我的主页上我有一行

    <div class ="breadcrumbs" runat="server"><%= SitePath()%></div>  
    

    SitePath()调用一个自定义类,该类基于静态站点地图和动态生成页面的组合构建导航元素。它返回自定义面包屑导航元素的html。

    下面是我的代码隐藏中的SitePath()代码

    public string SitePath()
    {
        BreadCrumbNav breadNav = new BreadCrumbNav();
        breadNav.divClass = ".dv";
        breadNav.homeTitle = "ABC Home";
        return breadNav.Build();
    }
    

    我希望能够从我的动态页面覆盖这个,这样我就可以添加到路径中。例如

    public override string SitePath()
    {
        BreadCrumbNav breadNav = new BreadCrumbNav();
        breadNav.divClass = ".dv";
        breadNav.homeTitle = "ABC Home";
        breadNav.AddPage("Cooking Equipment", "PathyGoodness/Cooking+Equipment.ASPX");
        breadNav.AddPage("Toasters", "PathyGoodness/Cooking+Equipment/Toasters.ASPX");
        return breadNav.Build();
    }
    

    有没有一种方法可以将母版页方法引入范围,这样我就可以覆盖它们——或者我需要用另一种方法来实现这一点?我觉得我错过了一些非常明显的东西,但我似乎被卡住了。

    谢谢你的帮助!

    3 回复  |  直到 17 年前
        1
  •  3
  •   JoshJordan    17 年前

    由于母版页实际上不是继承的,而是作为模板使用的,因此这是不可能直接实现的。

    您可以尝试以下几种其他方法:

    首先,将其放在ContentPlaceholder中,并仅在必要时在单个页面的ASPX标记中覆盖它。

    页 相反,从母版开始,在那些没有“覆盖”行为的页面中,只需调用母版。在其他情况下,将您的特定实现添加到该方法中,瞧!(我想您也可以使用抽象的BasePage类型类从该方法调用Master)

        2
  •  1
  •   Pauli Østerø    17 年前

    通常,我反对将页面/上下文特定的方法放在masterpage类中。为什么?因为,正如Josh提到的,母版页只是模板。您永远不会从母版页继承,并且如果没有对页面对象的访问权,则无法显示母版页。因此,将这些方法放在Page类中更有意义。

        3
  •  1
  •   Myke Black    15 年前

    更简单的方法是直接从子页面引用主控件。

    在母版页中,将sitepath()函数替换为文本控件,如下所示:

    <div class ="breadcrumbs" runat="server"><asp:Literal id="litSitePath" runat="server" /></div>
    

    BreadCrumbNav breadNav = new BreadCrumbNav(); 
    breadNav.divClass = ".dv";    
    breadNav.homeTitle = "ABC Home";    
    litSitePath.Text = breadNav.Build();
    

    在子页面中,您可以使用Master.FindControl方法覆盖此项,如下所示:

    BreadCrumbNav breadNav = new BreadCrumbNav();    
    breadNav.divClass = ".dv";    
    breadNav.homeTitle = "ABC Home";    
    breadNav.AddPage("Cooking Equipment", "PathyGoodness/Cooking+Equipment.ASPX");    
    breadNav.AddPage("Toasters", "PathyGoodness/Cooking+Equipment/Toasters.ASPX");    
    Literal litSitePath = (Literal)Master.FindControl("litSitePath");
    litSitePath.Text = breadNav.Build();