65.9K
CodeProject 正在变化。 阅读更多。
Home

.NET 1.1 主页 (再谈)

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.17/5 (10投票s)

2006年4月8日

4分钟阅读

viewsIcon

57482

downloadIcon

440

准备你的 .NET 1.x 网站以使用 .NET 2.0 中的主页

Sample Pages A and B

引言

本文介绍如何尽可能地模仿 .NET 2.0 框架中主页的功能。通过这样做,你的 .NET 1.x 网站在转换后能够适应主页的概念。

背景

我正在从事一个项目,该项目原本打算使用 .NET 2.0 框架,但早期我们接到通知,公司还没有准备好切换。我们非常想使用母版页等功能。快速搜索 .NET 1.1 中的主页只找到少量文章,但没有一篇看起来真正易于使用或能模仿 .NET 2.0 中主页的功能。

使用代码

因此,我采取了一种方法,从 .NET 2.0 应用程序中提取一个 masterpage.master 文件,并将其作为我解决方案的入口点。

.NET 2.0 中的 ContentPlaceHolder 控件在 .NET 1.x 中不存在,所以我用 Panel 控件 (asp:Panel) 替换了它们。

主页包含完整的 HTML 布局,换句话说,主页中的所有内容都旨在“强制”调用页面的布局,同时保留页面上 asp:Panel(又名 ContentPlaceHolder 控件)的内容。

如下所示,HTML 布局是剩下的部分,面板内容有一些默认文本。我高亮显示了面板,以便你可以将它们与稍后将讨论的调用页面中的面板进行比较。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<html>
<head>
    <title runat="server">Default1</title>
    <meta name="GENERATOR" content="Microsoft Visual Studio .NET 7.1">
    <meta name="CODE_LANGUAGE" content="C#">
    <meta name="vs_defaultClientScript" content="JavaScript">
    <link href="Styles/MasterPage_A.css" type="text/css" rel="stylesheet" />
</head>
<body ms_positioning="GridLayout">
    <form id="Form1" method="post" runat="server">
        <table width="700" cellspacing="0" cellpadding="0" border="0" height="100%" align="center"
            id="Table1">
            <tr>
                <td class="Header" colspan="3">
                    <asp:Panel ID="pnlHeader" runat="server">
                        This is MasterPage A, set by the master page.<br />
                        Place a panel with ID="pnlHeader" in the Default.aspx and this text will be replaced.</asp:Panel>
                </td>
            </tr>
            <tr>
                <td class="LeftMenu" valign="top">
                    <asp:Panel ID="pnlLeftMenu" runat="server">
                        This text will not show up as it is overridden by the page.
                    </asp:Panel>
                </td>
                <td class="Content">
                    <asp:Panel ID="pnlContent" runat="server">
                        This text will not show up as it is overridden by the page.
                    </asp:Panel>
                </td>
                <td class="RightMenu" valign="bottom">
                    <asp:Panel ID="pnlRightMenu" runat="server">
                        This text will not show up as it is overridden by the page.
                    </asp:Panel>
                </td>
            </tr>
            <tr>
                <td class="Footer" colspan="3">
                    <asp:Panel ID="pnlFooter" runat="server">
                        Footer area, set by the master page
                    </asp:Panel>
                </td>
            </tr>
        </table>
    </form>
</body>
</html>

正如你所看到的,这类似于一个可能的网站布局(本文中很简单),面板中有一些默认文本。这些面板将被调用页面中匹配的面板替换。

我做过其他网站,我使用了 HTML 页面并使用了 ParseControl 方法将 HTML 转换为控件。一旦你有了控件,你就可以遍历此控件的控件集合来……查找更多控件。

我认为可以使用这种技术将一个面板替换为另一个面板。

当我在主页中删除内容时,我在调用页面(在本例中为 default.aspx)中做了相反的操作。这意味着只有实际属于页面(按钮、标签、面板、用户控件等)的 HTML 标记保留,而网站布局安全地存储在主页中。再次,模仿 .NET 2.0 中主页的功能。

<%@ Page Language="c#" Codebehind="Default.aspx.cs" AutoEventWireup="false" Inherits="Default" %>

<asp:panel id="pnlLeftMenu" runat="server"> This goes in the left menu </asp:panel> <asp:panel id="pnlContent" runat="server"> <TABLE> <TR> <TD noWrap width="60"> <asp:Button id="Button1" runat="server" Text="Show Time"></asp:Button></TD> <TD width="100%"> <asp:Label id="Label1" runat="server" Text=""></asp:Label></TD> </TR> </TABLE> </asp:panel> <asp:panel id="pnlRightMenu" runat="server"> This goes in the Right menu </asp:panel> <asp:panel id="Panel1" runat="server"> This panel is ignored and will not be shown on the final page </asp:panel>

正如你在上面的 HTML 标记中看到的,网站布局缺失,页面中只剩下 Panel(ContentPlaceHolders)及其内容。

请注意上面页面和主页中 Panel 的命名。面板的 ID 可以是任何名称,只要它们在两个页面之间匹配即可。

工作原理

将主页与调用页面合并的解决方案仅包含五个(简单的)步骤
1) 收集页面控件集合中的所有 Panel 控件。
2) 删除页面 (aspx) 上的所有控件。
3) 如果缓存中存在,则从缓存中加载主页;如果缓存中不存在,则从磁盘加载(防止高流量站点上的文件锁定)。
4) 将主页中找到的 Panel 控件替换为步骤 2 中收集的 Panel 控件。
5) 将更新后的主页(控件)添加到页面控件(在步骤 2 中已清除)。

在主页中定义但在调用页面 (aspx) 中未找到的面板将按原样显示,就像在 .NET 2.0 中一样。

在调用页面的代码隐藏文件中,只需要添加 using `System.Web.UI.preMasterPages` 指令并从 `MasterPages` 类派生即可。

using System;
using System.Web;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.Web.UI.preMasterPages;

/// <SUMMARY>
/// Summary description for Default.
/// </SUMMARY>
public class Default : MasterPages
{
    private void Page_Load(object sender, System.EventArgs e)
    {
        Title = "My Page Demo";
    }
    
    ... The rest of the class is omitted for clarity
}

我在 web.config 中简单地添加了一个 MasterPage 元素,其中包含要使用的主页的路径和文件名。你可以轻松地更改代码以允许采用“即时选择”的方法。

我只是在基类中添加了一个 `Title` 属性,该属性在 Page_Load 中设置页面的标题。

你应该能够运行转换后的页面而无需任何代码更改,我已经尝试过动态加载的用户控件以及在保持状态的同时,一切正常。

一旦你准备好迁移你的网站,只需将 aspx 和主页中的 `asp:Panel` 控件更改为 `asp:ContentPlaceHolder`,就完成了。

玩得开心!

历史

  • 09-04-2006
    • 更改了代码,使其只包含调用页面 (aspx) 中的面板和 MasterPage.master 页面中的完整站点布局。
      还在基类中添加了一个 Title 属性,以便可以在 Page_Load 中设置页面的标题。
  • 07-04-2006
    • 初始发布
© . All rights reserved.