【问题标题】:Is there a simple way to have multiple ContentPlaceHolder controls update independently of each other?有没有一种简单的方法可以让多个 ContentPlaceHolder 控件相互独立更新?
【发布时间】:2010-10-20 14:55:27
【问题描述】:

这是一个非常简单的 ASP.NET 母版页示例。母版页显示 4 个超链接并具有两个 ContentPlaceholder 控件。前两个链接指向将显示在 ContentPlaceHolder1 中的内容页面,后两个链接指向将显示在 ContentPlaceHolder2 中的内容页面。

<%@ Master Language="C#" AutoEventWireup="true" CodeBehind="Site1.master.cs" Inherits="ProofOfConcept.Site1"  %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    <h1>
        Demo site
    </h1>
    <asp:HyperLink ID="HyperLink1" runat="server" NavigateUrl="~/HeadContent1.aspx">Head Content 1 in ContentPlaceHolder1</asp:HyperLink>
    <asp:HyperLink ID="HyperLink2" runat="server" NavigateUrl="~/HeadContent2.aspx">Head Content 2 in ContentPlaceHolder1</asp:HyperLink>
    <asp:HyperLink ID="HyperLink3" runat="server" NavigateUrl="~/MainContent1.aspx">Main Content 1 in ContentPlaceHolder2</asp:HyperLink>
    <asp:HyperLink ID="HyperLink4" runat="server" NavigateUrl="~/MainContent2.aspx">Main Content 2 in ContentPlaceHolder2</asp:HyperLink>
    <br />
    <div style="border: 1px dotted blue;">
        <asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server">
            This is default text for ContentPlaceholder1
        </asp:ContentPlaceHolder>
    </div>
    <br />
    <div style="border: 1px dotted red;">
        <asp:ContentPlaceHolder ID="ContentPlaceHolder2" runat="server">
            This is default text for ContentPlaceholder2
        </asp:ContentPlaceHolder>
    </div>
    </div>
    </form>
</body>
</html>

四个内容页面本身都是这样的:

<%@ Page Title="" Language="C#" MasterPageFile="~/Site1.master" AutoEventWireup="true" CodeBehind="MainContent1.aspx.cs" Inherits="ProofOfConcept.MainContent1" %>
<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceholder2" runat="server">
    This is text from MainContent1 in ContentPlaceholder2
</asp:Content>

...适当地设置 ContentPlaceholder ID。换句话说,每个内容页面只包含一个内容控件,该控件链接到母版页上的一个 ContentPlaceHolders。

例如,如果我构建站点并加载 HeadContent1.aspx(第一个链接),则仅显示 HeadContent1 中的内容(显然,加上母版页中的标记)。如果我单击第三个链接,则会显示第二个 ContentPlaceHolder 中的内容,但第一个占位符会恢复为其默认标记。

这种行为似乎都符合设计,无疑在许多情况下都非常有用,但我想做的是让两个 ContentPlaceholder 彼此独立刷新。或多或少地像老式的 HTML 框架一样工作?这可能吗,还是我应该使用其他控件(或其他设置而不是主/内容)?

【问题讨论】:

    标签: asp.net master-pages


    【解决方案1】:

    我会说您想针对您的情况使用 iframe。母版页无法按照您所寻找的方式运行。

    【讨论】:

      【解决方案2】:

      我同意迈克的观点。你要走很长的路。为了让您的示例使用母版页,您将需要 16 个不同的内容页面。每个页面都需要填写 PlaceHolder1 和 PlaceHolder2 的内容,具体取决于单击的链接和顺序。

      IFrame 将是处理此类问题的更好方法,但我首先建议您检查您的设计以确定是否有可以简化它的方法。

      【讨论】:

      • 感谢您的回复,我也觉得这不是网站的正确基础架构。 IFRAME 有一个固定的来源,不是吗?所以我不能使用所示的链接来简单地定位适当的 IFRAME(如果我错了,一定要纠正我)而不深入研究代码。这似乎是一个简单的问题,肯定有一个简单而优雅的解决方案我忽略了?我只想在一个页面中拥有基本的页面结构、布局和设计元素,两个内容区域相互独立地显示和更新内容。
      • 好的,现在我想我知道你要去哪里了。实际上,您可以动态指定 IFrame 的来源。但是,这可能不是您想要实现的目标。母版页主要用于定义网站的结构,而不是其功能。我的建议是使用用户控件来定义每个部分中的内容(在页面上,而不是母版页上)并使用某种状态机制(查询字符串参数或配置文件?)来定义将显示哪些用户控件。切换控件的可见属性可能是最简单的。
      • ... 而不是动态加载它们。我使用母版页来定义哪些菜单将出现在网站的顶部和左侧 - 它们会根据用户是在网站的主要部分、我的帐户部分还是结帐部分而有所不同。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-31
      • 1970-01-01
      • 1970-01-01
      • 2019-03-10
      • 1970-01-01
      • 2012-09-15
      相关资源
      最近更新 更多