web-dev-qa-db-ja.com

マスターページの奇妙さ-「コンテンツコントロールは、コンテンツページまたはマスターページを参照するネストされたマスターページのトップレベルコントロールでなければなりません。」

これは変です。 Visual Studio 2008のソリューションに新しいWebアプリケーションプロジェクトを追加しました。

マスターページを作成しました。修正なし。新しいWebフォームを作成しました。マスターページを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アプリケーションプロジェクトと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>
65
NoCarrier

Visual Studioを使用する別の方法は次のとおりです。VisualStudioで[新しいアイテム]を実行し、[Webフォーム]を選択すると、スタンドアロンの* .aspx Webフォームが作成されます。 。 Webコンテンツフォームを選択してから、それに添付するマスターページを選択する必要があります。

54
gabe

Webフォームにすべてのマークアップを含める必要はありません(<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ページを追加するときは、[新しいアイテムの追加]ダイアログで[マスターページの選択]をオンにしてください。

78
JerSchneid

Webフォームは次のようになります。

<%@ 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>タグがないことに注意してください

6
Joshua Shannon

WebFormを作成したときに、[新しい項目の追加]ダイアログ自体で添付されるマスターページを選択しましたか?または、@PageディレクティブのMasterPageFile属性を使用して手動で添付しましたか?後者の場合は、表示されるエラーメッセージの説明になります。

VSは、各種類のページに特定のマークアップを自動的に挿入します。ページ自体の作成時にMasterPageを選択した場合、@Page宣言と最上位のコンテンツコントロール以外のマークアップは生成されません。

4
Cerebrus

何らかの理由で、ページの作成ダイアログにマスターページを選択するオプションはありません。プログラムでMPを宣言することと、[プロパティ]ペインでプロパティを更新することの両方を試みました。– NoCarrier 13分前

「Webアプリケーション」と「Webサイト」の両方を使用しているためだと思います– NoCarrier 9分前

問題があるのは<@PAGE>タグにある可能性があります。とは言っても、Webアプリケーションを使用しているかどうかに違いはありません。子ページを作成するには、ソリューションエクスプローラーでマスターページを右クリックし、[コンテンツページの追加]を選択します。

4
Serapth

この問題が発生しました。これは、二重スラッシュで終わるタグがあるためです。

<//asp:HyperLink>
3
Daniel Ryan

私はこの例外に遭遇しましたが、私の場合はasp:content要素間の空白が原因でした

したがって、これは失敗しました:

<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>
3
Thorgeir
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";
}
2
Mike

想像以上に遅い... WEBページを開発しているあなただけのマスターページを設定するオプションがあります(ファイル>新規>ウェブサイト)...しかし、ASP.NETプロジェクトを作成するときではありません(ファイル>新規>プロジェクト)-新しく作成されたWebフォームのプロパティを使用してマスターページを設定する必要があり、ASPXソースを変更してマスターページに準拠させる(つまり、ストックHTMLを削除するなど)のはあなた次第です

2
flaZer

SharePoint Designer 2013でWebパーツ(.aspx)ページを編集した後にこのエラーが発生しました。SPDのコードを見ると、ページ上部のH1要素が黄色で強調表示されていました。その上にマウスを移動すると、SharePoint:AjaxDeltaがH1以前に閉じられなかったことが示されました。 </SharePoint:AjaxDelta>を追加すると修正されました。

奇妙なことに、SPD=は、リストビューWebパーツまたはページビューアーWebパーツをページの他の場所で作業していた後にエラーを発生させました。

1
G. Laushine

aspコンテンツを追加し、コンテンツプレースホルダーidを追加する必要がありますマスターページのプレースホルダー。

これを読むことができます link 詳細

0
Pajri Aprilio

私の場合、ページにユーザーコントロールを動的に読み込み、ページとユーザーコントロールの両方にコンテンツタグがありました

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">

ユーザーコントロールからこのタグを削除すると、うまくいきました。

0
Mohammed Siddiq