web-dev-qa-db-fra.com

Bizarre de page maître - "Les contrôles de contenu doivent être des contrôles de niveau supérieur dans une page de contenu ou une page maître imbriquée faisant référence à une page maître."

C'est bizarre. J'ai ajouté un nouveau projet d'application Web à ma solution dans Visual Studio 2008.

Créé une page maître. Aucune modification apportée. Création d'un nouveau formulaire Web. Définissez sa page maître sur le MP que je viens de créer.

Toujours pas de modifications. Pas de balisage. Pas de contrôles utilisateur. Pas de références. Rien. Cependant, lorsque j'essaie de l'exécuter, je reçois:

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

Si je fais exactement la même chose dans un projet autonome en dehors de cette solution, cela fonctionne bien. N'oubliez pas que j'utilise un projet d'application Web par rapport à un projet de site Web si cela fait une différence.

Le formulaire 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>

La page maître:

<%@ 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

Voici une autre méthode d’utilisation de Visual Studio: si vous créez un nouvel élément dans Visual Studio et que vous sélectionnez un formulaire Web, un formulaire Web autonome * .aspx sera créé, ce que vous avez pour votre formulaire Web actuel (est-ce ce que vous avez fait?) . Vous devez sélectionner Formulaire de contenu Web, puis sélectionner le gabarit que vous souhaitez y attacher.

54
gabe

Votre formulaire Web ne devrait pas avoir tout ce balisage (comme le <html> tag). Comme il a une page maître, vous commencez simplement par la balise content. Votre page aspx devrait ressembler à ceci:

<%@ 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>

Lorsque vous ajoutez une nouvelle page aspx, assurez-vous de cocher la case "sélectionner un gabarit" dans la boîte de dialogue "ajouter un nouvel élément".

78
JerSchneid

Votre formulaire Web devrait ressembler à ceci:

<%@ 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>

Notez qu'il n'y a pas de <html> tag

6
Joshua Shannon

Lorsque vous avez créé le formulaire Web, avez-vous sélectionné la page maître à laquelle elle est attachée dans la boîte de dialogue "Ajouter un nouvel élément"? Ou l'avez-vous attaché manuellement en utilisant l'attribut MasterPageFile de la @Page directive? Si c'était le dernier cas, cela pourrait expliquer le message d'erreur que vous recevez.

VS insère automatiquement certains marquages ​​dans chaque type de page. Si vous sélectionnez la page maître au moment de la création de la page elle-même, elle ne génère aucune balise à l'exception du @Page déclaration et le contrôle de contenu de niveau supérieur.

4
Cerebrus

Pour une raison quelconque, le dialogue de création de page ne permet pas de sélectionner une page maître. J'ai essayé à la fois de déclarer par programme le MP et en mettant à jour la propriété dans le volet Propriétés. - NoCarrier il y a 13 minutes

Je crois que c'est parce que j'utilise une "application Web" par rapport à un "site Web" - NoCarrier il y a 9 min

Il y a de grandes chances que votre problème se trouve dans la balise <@PAGE>. Cela dit, si vous utilisez ou non une application Web, cela ne fait aucune différence. Pour créer une page enfant, cliquez avec le bouton droit sur votre gabarit dans l'Explorateur de solutions et choisissez Ajouter une page de contenu.

4
Serapth

Je viens d'avoir ce problème. C'est parce que nous avions une balise se terminant par une double barre oblique:

<//asp:HyperLink>
3
Daniel Ryan

Je viens de rencontrer cette exception et dans mon cas, cela était dû à un espace blanc entre asp: content elements

Donc, cela a échoué:

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

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

Mais en supprimant les espaces blancs entre les éléments travaillés:

<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

Mieux vaut tard que jamais je suppose ... vous avez la possibilité de définir la MASTERPAGE uniquement si vous développez un SITE WEB (FICHIER> NOUVEAU> SITE WEB) ... mais pas lorsque vous créez un projet ASP.NET (FICHIER> NOUVEAU> PROJET) - vous devez définir la page principale à l'aide des propriétés du formulaire Web nouvellement créé et vous devez modifier le source ASPX pour le rendre conforme à la page maître (c'est-à-dire supprimer le code HTML stock, etc.).

2
flaZer

J'ai rencontré cette erreur après avoir modifié une page WebPart (.aspx) dans SharePoint Designer 2013. Lorsque j'ai consulté le code dans SPD, un élément H1 situé en haut de la page a été mis en surbrillance jaune. En survolant cela indiquait que SharePoint: AjaxDelta n'était pas fermé avant le H1. Ajout du </SharePoint:AjaxDelta> l'a corrigé.

Bizarre parce qu'il est apparu SPD a introduit l'erreur après que je travaillais sur des composants WebPart listview ou sur un composant WebPart de visualiseur de page ailleurs sur la page.

1
G. Laushine

Vous devez ajouter le contenu asp et ajouter l'ID de titulaire de l'espace de contenu correspondant à l'espace réservé dans la page maître.

Vous pouvez lire ceci lien pour plus de détails

0
Pajri Aprilio

Dans mon cas, je chargeais dynamiquement un contrôle utilisateur dans une page et les balises content avaient les balises content

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

Supprimer cette balise du contrôle utilisateur a fonctionné pour moi.

0
Mohammed Siddiq