none
Dvě MasterPage na jedné stránce ASP.NET

    Dotaz

  • Potřeboval bych poradit jak do vytvořeného MasterPage vložit další MasterPage.

    Popsání problémů

    Vytvořil jsem si stránku která se skládá ze zápatí “MasterPage” a oblasti která se mění. Zápatí je na všech stránkách stejné a jsou v něm kategorie např. Domů, služby, kontakt.

    V zápatí když kliknu na služby, tak se my v oblasti která se mění. Zobrazí dvousloupcový layout, který se skládá s oblasti která se mění a menu.

    Potřeboval bych když se budu nacházet v kategorií služby aby se mě zápatí neměnilo společně s menu.  

    19. října 2012 8:12

Odpovědi

  • Nahoře v <%@ Page uvedete MasterPageFile="cesta k vnitřní MasterPage" %>

    Best regards Tomáš Herceg | ASP.NET MVP (http://www.vbnet.cz) Chief Software Architect @ http://www.riganti.cz

    19. října 2012 10:52
    Přispěvatel
  • Protože v té omne.master nemůžete mít přímo ContentPlaceHolder, ten musí být uvnitř Contentu.

    <%@ Master Language="C#" MasterPageFile="~/default.master" AutoEventWireup="true" CodeFile="omne.master.cs" Inherits="omne"  %>

    <asp:Content ID="Content1" runat="Server">
    < asp:ContentPlaceHolder ID="mirekspanko" Runat="Server">

        ssssss

    < /asp:ContentPlaceHolder>

    </asp:Content>

    Funguje to takhle:
    1) Máte hlavní master page, ve které je HTML kód a na pár místech jsou ContentPlaceHoldery (nebo tam máte jen jeden, to je na vás).
    2) Pak máte druhou MasterPage, která nahože v <#@Master odkazuje přes MasterPageFile na tu první. V této druhé MAsterPage musíte mít jednu nebo víc komponent Content, které se dosadí do příslušných ContentPlaceHolderů v té hlavní MasterPage.

    3) Pak máte ASPX stránku, která má zase nahoře v direktivě Page odkaz na druhou MasterPage (přes MasterPageFile). A v této stránce opět musíte mít jednu nebo více komponent asp:Content, které naplní contentplaceholdery v druhé masterpage.

    Je to takhle jasné?


    Best regards Tomáš Herceg | ASP.NET MVP (http://www.vbnet.cz) Chief Software Architect @ http://www.riganti.cz

    19. října 2012 13:32
    Přispěvatel

Všechny reakce

  • MasterPage do sebe lze v pohodě vnořovat - v okně Solution Explorer klikněte pravým tlačítkem na projekt a zvolte Add / New Item..., v okně pak vyberte položku Nested Master Page.


    Best regards Tomáš Herceg | ASP.NET MVP (http://www.vbnet.cz) Chief Software Architect @ http://www.riganti.cz

    19. října 2012 9:19
    Přispěvatel
  • Ve VisualStudio 2012 Express  for Web se položka Nested Master Page nenachází.  Šel jsem přesně podle postupu, který jste napsal. Díval jsem se dvakrát. 
    19. října 2012 9:46
  • Aha, já mám velké Visual Studio, tam to možná je jinak.

    Tak vytvořte novou MasterPage, smažte vše, co v ní je, kromě prvního řádku, a do prvního řádku <#@Master ... přidejte MasterPageFile="~/HlavniMasterPage.master" (nahraďte název souboru za skutečný název).
    Tím řeknete, že tahle MasterPage bude včleněna do té HlavniMasterPage.master. Pak do té nové master page přidejte element nebo elementy (podle toho, kolik je v HlavniMasterPage content place holderů):
    <asp:Content ID="nějaké id" runat="server" ContentPlaceHolderID="id placeholderu z HlavniMasterPage">

    </asp:Content>


    Best regards Tomáš Herceg | ASP.NET MVP (http://www.vbnet.cz) Chief Software Architect @ http://www.riganti.cz

    19. října 2012 9:51
    Přispěvatel
  • Vytvořený a upravený MasterPage mám takto:

    <%@ Master Language="C#" AutoEventWireup="true" CodeFile="omne.master.cs" Inherits="MasterPage" MasterPageFile="~/default.master" %>

    <asp:Content id="linux" ContentPlaceHolderID="mirekspanko"  runat="server">

       Zde bude text 
          
    </asp:Content>

    Teď lámu hlavu jak ho provázat se souborem omne.aspx, který vypadá nyní takto:

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="omne.aspx.cs" Inherits="_Default" MasterPageFile="~/default.master" %>

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

          
    </asp:Content>

     
    19. října 2012 10:48
  • Nahoře v <%@ Page uvedete MasterPageFile="cesta k vnitřní MasterPage" %>

    Best regards Tomáš Herceg | ASP.NET MVP (http://www.vbnet.cz) Chief Software Architect @ http://www.riganti.cz

    19. října 2012 10:52
    Přispěvatel
  • Upravil jsem to <%@ Page takto: 

          

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="omne.aspx.cs" Inherits="_Default" MasterPageFile="~/omne.master" %>

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


    </asp:Content>

    Když jsem spustil stránky tak mě to hodilo Chybu:

    Na stránce předlohy /omne.master nebyl nalezen ovládací prvek ContentPlaceHolder mirekspanko. Zkontrolujte atribut ContentPlaceHolderID ovládacího prvku obsahu na stránce obsahu.

    Když budu chtít napsat ContentPlaceHolderID ručně tak mě to nic nabídne na vložení. 

     

    19. října 2012 11:12
  • V MasterPage omne.master musí být prvek asp:ContentPlaceHolder s ID="mirekspanko".


    Best regards Tomáš Herceg | ASP.NET MVP (http://www.vbnet.cz) Chief Software Architect @ http://www.riganti.cz

    19. října 2012 11:24
    Přispěvatel
  • Když napíšu do MasterPage omne.master

    <%@ Master Language="C#" MasterPageFile="~/default.master" AutoEventWireup="true" CodeFile="omne.master.cs" Inherits="omne"  %>


    <asp:ContentPlaceHolder ID="mirekspanko" Runat="Server">

        ssssss

    </asp:ContentPlaceHolder>

    Takto hlásí chybu

    Ovládací prvky obsahu musí být na stránce obsahu nebo vnořené stránce předlohy, která odkazuje na stránku předlohy, prvky nejvyšší úrovně.

    ------------------------------------------------------------------------------------------------------------

    Když napíšu do MasterPage omne.master takto:

         

    <%@ Master Language="C#" MasterPageFile="~/default.master" AutoEventWireup="true" CodeFile="omne.master.cs" Inherits="omne"  %>


    <asp:Content  ContentPlaceHolderID="mirekspanko"  id="mirekspanko" runat="server">


    </asp:Content>

    Tak to hlásí chybu:

    Na stránce předlohy /omne.master nebyl nalezen ovládací prvek ContentPlaceHolder mirekspanko. Zkontrolujte atribut ContentPlaceHolderID ovládacího prvku obsahu na stránce obsahu.

    19. října 2012 13:04
  • Protože v té omne.master nemůžete mít přímo ContentPlaceHolder, ten musí být uvnitř Contentu.

    <%@ Master Language="C#" MasterPageFile="~/default.master" AutoEventWireup="true" CodeFile="omne.master.cs" Inherits="omne"  %>

    <asp:Content ID="Content1" runat="Server">
    < asp:ContentPlaceHolder ID="mirekspanko" Runat="Server">

        ssssss

    < /asp:ContentPlaceHolder>

    </asp:Content>

    Funguje to takhle:
    1) Máte hlavní master page, ve které je HTML kód a na pár místech jsou ContentPlaceHoldery (nebo tam máte jen jeden, to je na vás).
    2) Pak máte druhou MasterPage, která nahože v <#@Master odkazuje přes MasterPageFile na tu první. V této druhé MAsterPage musíte mít jednu nebo víc komponent Content, které se dosadí do příslušných ContentPlaceHolderů v té hlavní MasterPage.

    3) Pak máte ASPX stránku, která má zase nahoře v direktivě Page odkaz na druhou MasterPage (přes MasterPageFile). A v této stránce opět musíte mít jednu nebo více komponent asp:Content, které naplní contentplaceholdery v druhé masterpage.

    Je to takhle jasné?


    Best regards Tomáš Herceg | ASP.NET MVP (http://www.vbnet.cz) Chief Software Architect @ http://www.riganti.cz

    19. října 2012 13:32
    Přispěvatel