Avatar billede c-sharp Nybegynder
28. januar 2005 - 10:20 Der er 43 kommentarer og
1 løsning

Hjælp til at lave en masterpage

Jeg mangler en god måde at styre de faste elementer på siderne. Jeg har lavet 3 - 4 ”sites” i asp.net, hvor jeg har brugt usercontrols på den ene og den anden måde, men det er ikke optimalt! Nu har jeg så kigget lidt rundet her på eksperten om der er andre måder at gøre det på og jeg faldt over følgende tråd: http://eksperten.dk/spm/453472

Jeg har så læst artiklerne der bliver refereret til, og synes ikke det er helt optimalt. Som jeg har forstået skal man skrive alt koden til "masterpage" i codebehind eks.

      writer.Write( @"
            <html>
                <head>
                    <title>" + PageTitle + @"</title>
                </head>
                <body>" );

Det kan da blive noget bøvl at vedligeholde "masterpage".

Så læste jeg en anden tråd: http://eksperten.dk/spm/524284 her refereres til metabuilders.com, den har jeg så prøvet at downloade og åbne i VS.NET, men kan ikke kompilere det! Er det nemmere at vedligeholde "masterpage" når man bruger denne? Og hvad kan være problemet siden jeg ikke kan kompilere den?

Jeg får følgende fejl når jeg prøvet at åbne projektet i VS.NET:
The solution appears to be under source control, but its binding information cannot be found. It is possible that the MSSCCPRJ.SCC file or another item that holds the source control settings for the solution, has been deleted. Because it is not possible to recover this missing information automatically, the projects whose bindings are missing will be treated as not under source control.

Hvis jeg så siger ok til dette og prøver at kompilere projektet får jeg følgende fejl:
Cryptographic failure while signing assembly 'c:\Inetpub\wwwroot\masterpages\MasterPages\MasterPages\obj\Release\MetaBuilders.WebControls.MasterPages.dll' -- 'The key container name 'metabuilders.com' does not exist'
Avatar billede burningice Nybegynder
28. januar 2005 - 10:56 #1
sørg for at slette disse tre linjer under AssemblyInfo.cs

[assembly: AssemblyDelaySign(false)]
[assembly: AssemblyKeyFile("")]
[assembly: AssemblyKeyName("metabuilders.com")]

Både dog og SourceSafe er et typisk problem med Metabuilder's projekter. Men når man ser hvilke fede ting han laver, så kan man godt se gennem fingre med sådanne småting ;)
Avatar billede segato Nybegynder
28. januar 2005 - 16:44 #2
Har selv haft samme problem. Løste i "gamle dage" at jeg havde en masterpage som jeg kalde med en postparameter med navnet på den usercontrol som jeg dynamisk loadede fra men masterpage.aspx. Det er en løsning. Da jeg så at whidbey(visual studio 2005) kom med masterpages skiftede jeg over til whidbey der er det hele indbygget. Og som webudvikler er der utrolig meget at hente.
Avatar billede c-sharp Nybegynder
31. januar 2005 - 06:31 #3
Segato: Visual Studio 2005 er da ikke kommet endnu, andet end i beta, eller hvad? Kræver den ikke også asp.net 2.0?

Jeg fandt den her: http://www.evolvesoftware.ch/masterpages/

Jeg synes den ser ud til at være bedre dokumenteret, og så er den også af nyere dato. Er der nogen der har prøvet at bruge den?
Avatar billede c-sharp Nybegynder
04. februar 2005 - 06:22 #4
Jeg har nu fået leget lidt med forskellige version af Masterpages. Jeg har prøvet følgende:

WilsonMasterPages
EvolveMasterPages
MetabuilderMasterPages

Men jeg er lidt i tvivl om hvilken jeg skal bruge, er der nogen der kan anbefale en bestemt?

Jeg har også leget lidt med at skifte Template ved at trykke på en knap, men det kan jeg ikke få til at virke med MetabuilderMasterPages. Nogen der ved hvordan det kan lade sig gøre?
Avatar billede segato Nybegynder
04. februar 2005 - 12:29 #5
Betaen har været der lang tid og er framragende. Har brugt det nu i 6 måneder og det er fuldt brugbart specielt på websiden.
Avatar billede c-sharp Nybegynder
01. marts 2005 - 08:24 #6
Jeg tror jeg holder mig til 1.1 lidt endnu da mit webhotel ikke understøtter 2.0 :-(

Er der ikke nogen der kan fortælle mig hvilken version af masterpage jeg bør bruge, eller er de alle lige gode?

Jeg har fundet følgende:
WilsonMasterPages
EvolveMasterPages
MetabuilderMasterPages
Avatar billede c-sharp Nybegynder
07. marts 2005 - 08:55 #7
Er der mere hjælp her?
Avatar billede c-sharp Nybegynder
11. april 2005 - 08:13 #8
Jeg har nu brugt Metabuilder Masterpages til et par projekter, og den fungere perfect!

Jeg har dog 2 spørgsmål til den:

1. Når jeg bruger Metabuilders Masterpages laver den noget html der ikke overholder standarden for W3C, kan man gøre noget ved det?

2. Indtil nu hvis jeg har skulle overføre forskellige værdier fra selve siden til masterpage templaten har jeg gjordt det ved hjælp af session, kan man gøre det på en mere direkte måde. eks template.siden = "test"; ?

Jeg smider lidt flere point i spørgsmålet!
Hvis ikke i kan hjælpe mere må cyberfessor gerne smide et svar, så han kan få point for hans kommentar den 28/01-2005 10:56:09, det hjal mig til at få det op og spille!

I skal begge have mange tak for jeres kommentar
Avatar billede burningice Nybegynder
11. april 2005 - 16:25 #9
svar
Avatar billede c-sharp Nybegynder
13. april 2005 - 09:23 #10
cyberfessor: har du ikke en kommentar til mit spøgsmål den 11/04-2005 08:13:33?
Avatar billede burningice Nybegynder
13. april 2005 - 10:22 #11
desværre... jeg har aldrig selv rodet med hverken Metabuilders Masterpages eller andet masterpage-systemer for den sags skyld.
Avatar billede burningice Nybegynder
13. april 2005 - 10:23 #12
men ang. dit spm 2. kan du vel subclasse Templage-klassen og oprette nogle properties du kan bruge til at sætte nogle indstillinger med.
Avatar billede c-sharp Nybegynder
13. april 2005 - 10:39 #13
Kan du uddybe det lidt mere? Jeg synes jeg har prøvet alle mulig ting men jeg synes ikke jeg kan finde ud af at tilgår Mastersiden fra min underside.

masterside: den skabelonen der bruges på alle sider
underside: den side der "impelmenter" mastersiden
Avatar billede burningice Nybegynder
13. april 2005 - 12:24 #14
public class MinMasterTemplae : MetaBuilderMasterTemplate {
    private string noget;
    public string Noget {
      get { return this.noget; }
      set { this.noget = value; }
    }
}


nu kan du så lave noget

public class MinSide : MinMasterTemplate {
    protected override OnInit(EventArgs e) {
      base.Noget = "Hej";
    }
}
Avatar billede c-sharp Nybegynder
13. april 2005 - 12:52 #15
Jeg kan ikke få dit eksempel til at virke, jeg får følgende fejl:

Beskrivelse: Der opstod en fejl under parsing af en ressource, der er påkrævet ved behandling af denne anmodning. Læs følgende detaljer om parsefejlen, og foretag de nødvendige ændringer af kildefilen.

Meddelelse om parsefejl: 'cito.omcito' er ikke en gyldig basisklasse, for den udvider ikke klassen 'System.Web.UI.Page'.

Kildefejl:


Linje 1:  <%@ Page language="c#" Codebehind="omcito.aspx.cs" AutoEventWireup="false" Inherits="cito.omcito" %>
Linje 2:  <%@ Register TagPrefix="mp" Namespace="MetaBuilders.WebControls.MasterPages" Assembly="MetaBuilders.WebControls.MasterPages" %>
Linje 3:  <mp:contentcontainer runat="server" id="MPContainer" MasterPageFile="Template/masterpage.ascx">
Avatar billede burningice Nybegynder
13. april 2005 - 13:28 #16
og hvordan er cito.omcito erklæret?
Avatar billede c-sharp Nybegynder
13. april 2005 - 13:46 #17
namespace cito
{
    /// <summary>
    /// Summary description for omcito.
    /// </summary>
    public class omcito : Template.masterpage
    {
        private void Page_Load(object sender, System.EventArgs e)
        {
            base.Noget = "dette er en test";
        }

    }
}
Avatar billede burningice Nybegynder
13. april 2005 - 14:36 #18
og hvordan ser Template.masterpage ud?
Avatar billede c-sharp Nybegynder
13. april 2005 - 14:45 #19
namespace cito.Template
{
    public class masterpage : System.Web.UI.UserControl
    {
              ................
        }
}
Avatar billede burningice Nybegynder
13. april 2005 - 15:11 #20
ja, den går jo ikke.. du kan ikke lade en aspx-side arve fra System.Web.UI.UserControl
Avatar billede c-sharp Nybegynder
13. april 2005 - 15:15 #21
Men nu er det jo sådan at Metabuildes.masterpages bruger en usercontrol som template. jeg ved ikke om den kan bruge System.Web.UI.Page
Avatar billede burningice Nybegynder
13. april 2005 - 15:57 #22
som sagt, jeg kender ikke til MetaBuilders.MasterPages, men det lyder som om det kun er ascx-sider du kan template så, og ikke hele sider
Avatar billede c-sharp Nybegynder
13. april 2005 - 17:10 #23
Er der ikke flere forsalg til hvordan jeg kan overføre værdier fra undersiden til mastersiden?
Avatar billede burningice Nybegynder
13. april 2005 - 18:03 #24
hvad forhindrer dig i at gøre det som jeg foreslog dig?
Avatar billede c-sharp Nybegynder
13. april 2005 - 20:39 #25
Du skriver jo at det ikke kan lade sig gøre...
Avatar billede burningice Nybegynder
13. april 2005 - 21:47 #26
hvis du nu tager eksemplet med sublassing bliver din side til dette:

<%@ Page language="c#" Codebehind="omcito.aspx.cs" AutoEventWireup="false" %>
<%@ Register TagPrefix="cito" Namespace="cito.omcito" Assembly="dinAssembly" %>
<cito:contentcontainer runat="server" id="MPContainer" Noget="hej" MasterPageFile="Template/masterpage.ascx">

der skal du sørge for at subclasse MetaBuilders.WebControls.MasterPages.ContentContainer-klassen på den måde jeg beskrev i 13/04-2005 12:24:10
Avatar billede c-sharp Nybegynder
14. april 2005 - 05:54 #27
Jeg har nu prøvet følgende:

<%@ Page language="c#" Codebehind="omcito.aspx.cs" AutoEventWireup="false" %>
<%@ Register TagPrefix="cito" Namespace="cito.omcito" Assembly="cito.omcito" %>
<cito:contentcontainer runat="server" id="MPContainer" MasterPageFile="Template/masterpage.ascx">
<cito:content id="ComplexContent" runat="server">
<table cellpadding="0" cellspacing="0">
    <tr>
        <td>Omcito</td>
    </tr>
</table>
</cito:content>
</cito:contentcontainer>

og i min mastertemplate:

namespace cito.Template
{
    using System;
    using System.Data;
    using System.Drawing;
    using System.Web;
    using System.Web.UI.WebControls;
    using System.Web.UI.HtmlControls;

    public class masterpage : MetaBuilders.WebControls.MasterPages    {
        protected MetaBuilders.WebControls.MasterPages.Region ComplexContent;
                  ........................

Men jeg kan ikke få nedarvningnen i min masterside til at compile.
Avatar billede burningice Nybegynder
14. april 2005 - 08:27 #28
ingen fejl, ingen brok for compileren... den vil bare ikke?
Avatar billede c-sharp Nybegynder
14. april 2005 - 08:57 #29
Jo compileren melder følgende:

C:\Inetpub\wwwroot\cito\Template\masterpage.ascx.cs(13): 'MetaBuilders.WebControls.MasterPages' denotes a 'namespace' where a 'class' was expected
Avatar billede arne_v Ekspert
14. april 2005 - 09:12 #30
Fejl beskeden siger at:

public class masterpage : MetaBuilders.WebControls.MasterPages    {

skal være:

public class masterpage : MetaBuilders.WebControls.MasterPages.EnEllerAndenKlasse    {
Avatar billede burningice Nybegynder
14. april 2005 - 09:12 #31
jamen så har du jo fejlen...

MetaBuilders.WebControls.MasterPages er ikke nogen klasse
Avatar billede c-sharp Nybegynder
14. april 2005 - 09:28 #32
cyberfessor:
Du skriver at jeg skal gøre følgende:

public class MinMasterTemplae : MetaBuilderMasterTemplate {
..

Men hvem skal jeg nedarve fra, hvad er MetaBuilderMasterTemplate?
Avatar billede burningice Nybegynder
14. april 2005 - 09:42 #33
et fiktivt navn der skulle være noget psuodo-kode for hvad den pågældende klasse nu engang måtte hedde. Som sagt, så har jeg ikke arbejdet med MetaBuilders Template-system så jeg har INGEN (!!) anelse om hvad de forskellige klasser måtte hedde.

Det har du til gengæld, og du burde vide at man ikke kan nedarve fra et namespace.


Nå, nu har jeg hentet sourcekoden og det er jo egentlig meget simpelt. Der er kun tre klasser du skal subclasse, og hvis du er doven er der egentlig ikke engang grund til det da du bare kan rette til direkte i sourcen så det passer til dine behov.
Avatar billede c-sharp Nybegynder
14. april 2005 - 10:18 #34
Jeg beklager mine dumme spørgsmål!

Men hvis vi nu holder os til løsningen med subclassing hvilken klasse skal min template så nedarve fra?
Avatar billede burningice Nybegynder
14. april 2005 - 10:38 #35
MetaBuilders.WebControls.MasterPages.ContentContainer
og
MetaBuilders.WebControls.MasterPages.Content

og din aspx-side kan så komme til at se sådan her ud

<%@ Page language="c#" Codebehind="omcito.aspx.cs" AutoEventWireup="false" %>
<%@ Register TagPrefix="cito" Namespace="cito.omcito" Assembly="cito.omcito" %>
<cito:ContentContainer runat="server" id="MPContainer" MasterPageFile="Template/masterpage.ascx" DinEgenProperty="enVærdi">
<cito:Content id="ComplexContent" runat="server" DinEgenProperty="enVærdi">
<table cellpadding="0" cellspacing="0">
    <tr>
        <td>Omcito</td>
    </tr>
</table>
</cito:Content>
</cito:ContentContainer>
Avatar billede c-sharp Nybegynder
15. april 2005 - 13:55 #36
Du skriver at min template (masterside) skal nedarve fra: MetaBuilders.WebControls.MasterPages.ContentContainer og MetaBuilders.WebControls.MasterPages.Content. Men jeg kan jo ikke nedarve fra 2 klasser på engang. Jeg kan vel heller ikke bare nedarve direkte i min usercontrol fra de klasse?
Avatar billede burningice Nybegynder
15. april 2005 - 15:14 #37
du skal jo lave en af hver, tilsvarende som han har lavet
Avatar billede c-sharp Nybegynder
19. april 2005 - 14:12 #38
Jeg har kun en usercontrol til mit projekt.

Lyset vil simplethen ikke gå op for mig i den her opgave :-/

Jeg har også prøvet at tilrette Metabuilders Masterpages som du forslog. Jeg oprettede en property block i klassen ContentContainer, her skulle man så kunne sætte et sidenavn, men jeg kan ikke se hvordan jeg skal hente den værdi ud igen.

Jeg er lidt ked af at blive ved med at trække den her tråd, bare glad for at du er så tålmodig :-)
Avatar billede burningice Nybegynder
19. april 2005 - 17:34 #39
altså... vi er enige om at en template kan se sådan her ud, ikk?

<mp:contentcontainer runat="server" MasterPageFile="~/BasicMaster.ascx" >
<mp:content id="BasicContent" runat="server">

    <h2>This Is In Complex Master</h2>
    <hr>
   
    <mp:region runat="server" Id="ComplexContent" />
   
    <hr>
    <h2>This Is In Complex Master</h2>

</mp:content>
</mp:contentcontainer>

Og det du gerne vil kunne er f.eks. at gøre dette:

<mp:contentcontainer runat="server" Noget="hej hej" NogetAndet="whe" MasterPageFile="~/BasicMaster.ascx" >
<mp:content Farve="Rød" id="BasicContent" runat="server">

    <h2>This Is In Complex Master</h2>
    <hr>
   
    <mp:region runat="server" Id="ComplexContent" />
   
    <hr>
    <h2>This Is In Complex Master</h2>

</mp:content>
</mp:contentcontainer>

Hvis ikke, så har vi talt forbi hinanden.
Avatar billede c-sharp Nybegynder
20. april 2005 - 05:57 #40
Min masterpage template ser ud på følgende måde:

<html>
  <head>
      ......
      ......
   
                                              <td><mp:region runat="server" Id="ComplexContent" /></td>


      ...... 
      ......
</html>

og selve side ser sådan her ud:

<mp:contentcontainer runat="server" id="MPContainer" MasterPageFile="Template/masterpage.ascx" Sidenavn="omcito">
<mp:content id="ComplexContent" runat="server">
<table cellpadding="0" cellspacing="0">
    <tr>
        <td>et eller andet</td>
    </tr>
</table>
</mp:content>
</mp:contentcontainer>

Og det der så skal ske er at "selve siden" skal fortælle masterpage templaten hvilken siden den er, Så den kan highlight den side i menuen. Menuen ligger på masterpage templaten.
Avatar billede burningice Nybegynder
20. april 2005 - 08:40 #41
okay... det kan du gøre på denne måde:

<mp:contentcontainer runat="server" IAm="enside" id="MPContainer" MasterPageFile="Template/masterpage.ascx" Sidenavn="omcito">

I ContentContainer-klassen skal du så lave en IAm-property der gemmer en streng. Den kunne se sådan her ud

public string MasterPageFile
{
  get { return (string)ViewState["MasterPageFile"]; }
  set { ViewState["MasterPageFile"] = value; }
}

På din ascx-kontrol har du nu et property der hedder Parent. Denne property vil give din en reference til den control som ascx-kontrollen er et child af, i dette tilfælde ContaintContainer-kontrollen. Du kan derfor gøre sådan her for at få fat i IAm-værdien:

ContentContainer cc = (ContentContainer)this.Parent;
string iam = cc.IAm;
// gør noget med iam
Avatar billede c-sharp Nybegynder
20. april 2005 - 09:59 #42
SÅ SAD DEN LIGE I SKABET!

Nu virker det langt om længe, og tusind tak for det og din MEGET store tålmodighed!

Lige et lille spørgsmål til den måde det virker på:

Jeg har lavet følgende i ContentContainer-klassen:

    public string Sidenavn
        {
            get { return (string)ViewState["Sidenavn"]; }
            set { ViewState["Sidenavn"] = value; }
        }

Jeg kan se at værdien bliver gemt i et ViewState, men hvad er et ViewState? Er det en slags session? og hvis det er tilfældet kunne jeg vel strengttaget ligeså godt have brugt min første løsning, hvor jeg oprette en session i selvesiden som jeg så henter i masterpage templaten?
Avatar billede burningice Nybegynder
20. april 2005 - 18:23 #43
viewstate er den del af af en aspx-side du ser når du trykker "view source" i browseren og finder en linje som denne:

<input type="hidden" name="__VIEWSTATE" value="dDwtNzI5NjA2NTY4O3Q8O2w8aTwwPjs+O2w8dDw7bDxpPDE+O2k8Mz47aTw3PjtpPDk+Oz47bDx0PDtsPGk8MT47aTw1PjtpPDE1PjtpPDE3PjtpPDE5Pjs+O2w8dDw7bDxpPDA+Oz47bDx0PHA8cDxsPEhlaWdodDtXaWR0aDtfIVNCOz47bDwxPDcwcHg+OzE8NXB4PjtpPDM4ND47Pj47Pjs7Pjs+Pjt0PHA8bDxWaXNpYmxlOz47bDxvPGY+Oz4+Ozs+O3Q8O2w8aTwwPjs+O2w8dDxwPHA8bDxIZWlnaHQ7V2lkdGg7XyFTQjs+O2w8MTwwcHg+OzE8NXB4PjtpPDM4ND47Pj47Pjs7Pjs+Pjt0PDtsPGk8MD47PjtsPHQ8cDxwPGw8SGVpZ2h0O1dpZHRoO18hU0I7PjtsPDE8NHB4PjsxPDFweD47aTwzODQ+Oz4+Oz47Oz47Pj47dDw7bDxpPDA+Oz47bDx0PHA8cDxsPEhlaWdodDtXaWR0aDtfIVNCOz47bDwxPDVweD47MTwxcHg+O2k8Mzg0Pjs+Pjs+Ozs+Oz4+Oz4+O3Q8cDxsPFZpc2libGU7PjtsPG88dD47Pj47bDxpPDc+Oz47bDx0PDtsPGk8Mj47PjtsPHQ8cDxwPGw8TmF2aWdhdGVVcmw7PjtsPGh0dHA6Ly9nby5taWNyb3NvZnQuY29tLz9saW5raWQ9MjE3Mzg5Mjs+Pjs+O2w8aTwwPjs+O2w8dDxwPHA8bDxJbWFnZVVybDtBbHRlcm5hdGVUZXh0Oz47bDxodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vc2VydmljZXByb3ZpZGVycy9kaXJlY3RvcnkvbG9nb3MvNDc5NC5naWY7IEFyc3lzOz4+Oz47Oz47Pj47Pj47Pj47dDxwPGw8VmlzaWJsZTs+O2w8bzx0Pjs+Pjs7Pjt0PDtsPGk8MD47PjtsPHQ8cDxwPGw8SGVpZ2h0O1dpZHRoO18hU0I7PjtsPDE8NjAwcHg+OzE8MTBweD47aTwzODQ+Oz4+Oz47Oz47Pj47Pj47Pj47Ph991eCIPyvmUbzJemtzCg/+Ft2H" />

Man kan godt sige det er en slags session, men den er koblet sammen med en enkelt side. Dvs. at man kan ikke dele viewstate mellem sider, plus at informationen bliver ikke gemt på serveren, men bliver sendt med til klienten i en lang streng.

I dette tilfælde er det langt pænere at bruge Viewstate end session, da du på den måde kan holde denne værdi knyttet til siden, istedet for at have den flydende rundt i serverens hukommelse.
Avatar billede c-sharp Nybegynder
21. april 2005 - 05:58 #44
Super, endnu en gang tusind tak for hjælpen!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester