母版页奇怪 - “内容控件必须是内容页面中的顶级控件或引用母版页的嵌套母版页。”

时间:2009-05-07 17:02:04

标签: asp.net visual-studio-2008 master-pages

这很奇怪。我在Visual Studio 2008中为我的解决方案添加了一个全新的Web应用程序项目。

创建了母版页。零修改。 创建了一个新的webform。将其母版页设置为刚刚创建的MP。

仍然没有修改。没有标记。没有用户控制。没有参考。没有。但是,当我尝试运行它时,我得到:

Content controls have to be top-level controls in a content page or a nested master page that references a master page.
HttpException (0x80004005): Content controls have to be top-level controls in a content page or a nested master page that references a master page.]
   System.Web.UI.MasterPage.CreateMaster(TemplateControl owner, HttpContext context, VirtualPath masterPageFile, IDictionary contentTemplateCollection) +8665016
   System.Web.UI.Page.get_Master() +51
   System.Web.UI.Page.ApplyMasterPage() +15
   System.Web.UI.Page.PerformPreInit() +45
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +282

如果我在此解决方案之外的独立项目中执行相同的操作,则可以正常工作。请记住,如果这有任何区别,我正在使用Web应用程序项目与网站项目。

网络形式:

<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="Default.aspx.vb" Inherits="WebUI._Default" MasterPageFile="~/Site1.Master" %>

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

    </div>
    </form>
</body>
</html>

母版页:

<%@ Master Language="VB" AutoEventWireup="false" CodeBehind="Site1.master.vb" Inherits="WebUI.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>
    <asp:ContentPlaceHolder ID="head" runat="server">
    </asp:ContentPlaceHolder>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server">

        </asp:ContentPlaceHolder>
    </div>
    </form>
</body>
</html>

13 个答案:

答案 0 :(得分:76)

您的网络表单不应包含所有标记(例如<html>标记)。由于它有一个母版页,您只需从内容标记开始。您的aspx页面应如下所示:

<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="Default.aspx.vb" Inherits="WebUI._Default" MasterPageFile="~/Site1.Master" %>

<asp:content id="Content1" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
   This is the body!
</asp:content>

当您添加新的aspx页面时,请务必在“添加新项目”对话框中选中“选择母版页”。

答案 1 :(得分:53)

这是使用Visual Studio的另一种方式:如果您在Visual Studio中执行New Item并选择Web Form,它将创建一个独立的* .aspx Web表单,这是您当前Web表单的内容(这就是你的意思)做?)。您需要选择Web Content Form,然后选择要附加到其上的母版页。

答案 2 :(得分:6)

您的网络表单应如下所示:

<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="Default.aspx.vb" Inherits="WebUI._Default" MasterPageFile="~/Site1.Master" %>
<asp:Content runat="server" ID="head" ContentPlaceHolderId="head">
<!-- stuff you want in &gt;head%lt; -->
</asp:Content>

<asp:Content runat="server" ID="content" ContentPlaceHolderId="ContentPlaceHolder1">
<h1>Your content</h1>
</asp:Content>

请注意,没有<html>标记

答案 3 :(得分:4)

创建WebForm时,是否在“添加新项”对话框中选择了它所附加的主页面?或者您是否使用MasterPageFile指令的@Page属性手动附加了它?如果是后者,它可能会解释您收到的错误消息。

VS会自动在每种页面中插入某些标记。如果您在创建页面时选择MasterPage,除了@Page声明和顶级Content控件之外,它不会生成任何标记。

答案 4 :(得分:4)

  

出于某种原因,没有选择   创建页面对话框以选择a   母版页。我试过了两个   以编程方式声明MP和   通过更新中的属性   属性窗格。 - NoCarrier 13分钟   前

     

我相信它,因为我使用的是“网络”   申请“vs a”网站“ -   NoCarrier 9分钟前

可能在&lt; @ PAGE&gt;中标记您的问题所在。也就是说,如果您使用的是Web应用程序,它并没有什么区别。要创建子页面,请在解决方案资源管理器中右键单击主页面,然后选择添加内容页面。

答案 5 :(得分:3)

刚刚遇到这个问题。 这是因为我们有一个以双斜线结尾的标签:

<//asp:HyperLink>

答案 6 :(得分:3)

我刚遇到此异常,在我的情况下,它是由asp:content elements

之间的空格引起的

所以,这失败了:

<asp:content runat="server" ContentPlaceHolderID="Header">
    Header
</asp:content>

<asp:Content runat="server" ContentPlaceHolderID="Content">
    Content
</asp:Content>

但删除元素之间的空白区域:

<asp:content runat="server" ContentPlaceHolderID="Header">
    Header
</asp:content><asp:Content runat="server" ContentPlaceHolderID="Content">
    Content
</asp:Content>

答案 7 :(得分:2)

比我从未想象的更好......你可以选择设置MASTERPAGE,只有你正在开发一个WEB站点(文件&gt;新&gt;网站)...但是当你创建一个ASP.NET项目时却没有(FILE&gt; ; NEW&gt; PROJECT) - 您必须使用新创建的webform的属性设置主页面,并且由您来修改ASPX源以使其符合母版页(即删除库存HTML等...)

答案 8 :(得分:2)

protected void Page_PreInit(object sender, EventArgs e) 
{ 
 if (Membership.GetUser() == null) //check the user weather user is logged in or not
    this.Page.MasterPageFile = "~/General.master";
 else
    this.Page.MasterPageFile = "~/myMaster.master";
}

答案 9 :(得分:1)

在SharePoint Designer 2013中编辑Web部件(.aspx)页面后遇到此错误。当我查看SPD中的代码时,页面顶部附近的H1元素突出显示为黄色。将鼠标悬停在上面表示SharePoint:AjaxDelta在H1之前未关闭。添加</SharePoint:AjaxDelta>修复它。

很奇怪,因为在我使用listview web部件或页面上其他地方的页面查看器Web部件后,SPD出现了错误。

答案 10 :(得分:0)

就我而言,我是在页面中动态加载用户控件,并且页面和用户控件都具有内容标签

((int) x / theNumber) * theNumber)

从用户控件中删除此标签对我有用。

答案 11 :(得分:0)

您需要添加 asp内容,并添加与母版页中的占位符相对应的内容占位符ID

您可以阅读此link以获得更多详细信息

答案 12 :(得分:0)

在我的情况下,asp:content标记中缺少runat="server"。我知道这很愚蠢,但是可能有人从我所获得的构建中的代码中删除了。

对我有用。有人可能会遇到同样的事情。因此共享。