Tjena Du använder <%@ Page %> enbart i din '.aspx' sida. I din User Control (.ascx) använder du istället <%@ Control %>. UC registreras sedan i din '.aspx' sida. Exempel: Hej "Include" använde man i klassisk ASP och den funktionaliteten byter .NET ut mot kontroller. Masterpage kommer det inte i nästa version? Bara för att förtydliga MIG. Jag missförstod inget när jag gav mitt svar till dig. Jag trodde du kände till User Controls (.ascx) filer vilket du uppenbarligen inte gjorde. Och jo - Master Pages kommer i ver. 2.0 av Asp.Net, men det är fortfarande långt dit. En första Betaversion kommer kanske på eftersommaren. Ja det stämmer att de "riktiga" MasterPages kommer i 2.0, men det finns kontroller som fungerar på samma sätt för att kunna köra en typ av MasterPages redan nu. Egentligen ska man väl kalla det "Templates" istället nu i 1.x. Oj,, det blev många sidor ni rekomenderar :) Hej igen.. Marcus, Hej Hm... Nu kan jag inte skillnaden på det jag säger, men det är en httpmodule/httphandler du ska slänga in i web.config på något sätt istället om jag inte tar helt fel. Du ska alltså ärva/implementera någon klass/något interface (står troligen i msdn dokumentationen under httphandler/httpmodule exakt hur du ska göra) Hej
När jag försöker lägga in flera include filer för aspx får jag "There can be only one 'page' directive."
Hur gör man för att slippa återskriva kod flera gånger? Vill tex bara ha en sida(user control) med
menyn som jag sedan inkluderar i mina andra aspx sidor.
H.
MarcusSv:
.ASPX (med Code Behind)
<code>
<%@ Page Language="vb" AutoEventWireup="false" Codebehind="Start.aspx.vb" Inherits="kullenberg.Start" %>
<%@ Register TagPrefix="sc" TagName="TopNavigation" Src="_TopNavigation.ascx" %>
<body>
<! -- HTML inkl. <form runat="server"> -->
<sc:TopNavigation id="TopNavigation1" runat="server"></sc:TopNavigation>
<! -- mera HTML -->
</body>
</code>
.ASCX (med Code Behind)
<code>
<%@ Control Language="vb" AutoEventWireup="false" Codebehind="_TopNavigation.ascx.vb" Inherits="kullenberg._TopNavigation" %>
<!-- Här kör du HTML o Web kontroller utan HTML, BODY etc (och utan FORM, skall du normalt ha i .ASPX sidan -->
</code>Sv:
Ett litet missförstånd. Försöker förtydliga mig.
Jag vill åstakomma något som nedan, utan att använda FRAME utan enbart <div>
och genom varje <div> Include1 </div> en annan <div> Include2 </div>
så att det blir som nedan.
1. <!--#Include file="Top.aspx"-->
2. <!--#Include file="meny.ascx"-->
3 <!--#Include file="data.aspx"-->
Exempel på min websida:
------------------------------------------------------------------------------------
'
Här är ett aspx (include nr 1) innehållande logo osv '
ska vara aspx sida '
'
------------------------------------------------------------------------------------ ' '
' '
' '
Meny ' '
(inlude nr 2) ' Sidinnehåll som visas beroende '
ska vara ascx- ' på vald "länk". Aspx sida '
sida ' '
' '
' '
' '
' '
' '
osv
Jag vill alltså inte behöva återskapa webcontrollen och utsendet för menyn
för varje aspx sida. Frågan hur jag gör detta utan att få page directive- och
form error.
Någon som vet?
H
MarcusSv:
Du kan som sagt inte ha PAGE mer än en gång. Därför ska du inte använda include utan du bygger kontroller. Din Header ska alltså inte vara en .aspx sida utan även den en .ascx.
Sedan använder du alla kontroller i de .aspx sidor där de ska synas.
Detta för att du inte kan inkludera an .aspx sida i en annan för du då får som du redan märkt två PAGE på en sida.
För att sedan förenkla det ännu mer så kan du använda templates, sk. MasterPages. Det finns en hel del artiklar om det. Själv så använder jag Paul Wilsons version, http://wilsondotnet.com/
Templates använder PlaceHolders för att placera innehållet.
/pD
www.pdc.se
www.pdc.se/blog
www.patrik-dahlen.nuSv:
http://www.aspsidan.nu/kursRead.asp?kid=306
och http://msdn.microsoft.com/vstudio/whidbey/
Håller på att kolla på ditt förslag..
/MarcusSv:
Sv:
Microsoft släppte ett demo för två år sedan, http://www.asp.net/ControlGallery/ControlDetail.aspx?Control=385 men det behövdes kompletteras för att fungera tillfredsställande.
Det som jag använder är som jag sa Paul Wilsons MasterPages, http://wilsondotnet.com/ och det finns även en version från Andy Smith, http://metabuilders.com/Tools/MasterPages.aspx
Vad det går ut på är att du skapar en mall. Mallen är en webkontroll och innehåller ramen för alla dina sidor.
Exempel:
I min blog så är sidorna uppbyggda med mallar. Headern, menyn och loginrutan är kontroller. Dessa kontroller har jag placerat i min mallkontroll som även innehåller layouten för hela sidan.
BlogBase.ascx
<code>
<%@ Control Language="vb" AutoEventWireup="false" Codebehind="BlogBase.ascx.vb" Inherits="pdc.BlogBase" %>
<%@ Register TagPrefix="Wilson" Namespace="Wilson.MasterPages" Assembly="WilsonMasterPages" %>
<%@ Register TagPrefix="PDC_Utils" TagName="LoginControl" Src="~\controls\LoginControl.ascx" %>
<%@ Register TagPrefix="PDC_Utils" TagName="MenuControl" Src="~\controls\MenuControl.ascx" %>
<%@ Register TagPrefix="PDC_Utils" TagName="MonthlyStatControl" Src="~\controls\MonthlyStatControl.ascx" %>
<%@ Register TagPrefix="PDC_Utils" TagName="PostCategoryControl" Src="~\controls\PostCategoryControl.ascx" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<title>Patrik Dahlén's Blog</title>
<meta name="GENERATOR" content="Microsoft Visual Studio .NET 7.1">
<meta name="CODE_LANGUAGE" content="Visual Basic .NET 7.1">
<meta name="vs_defaultClientScript" content="JavaScript">
<meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
<link REL="stylesheet" HREF="/pdc/blog/styles/blog.css" TYPE="text/css">
</HEAD>
<body MS_POSITIONING="GridLayout">
<Form runat="server" ID="Form1">
<table width="790" cellpadding="0" cellspacing="0" border="0">
<tr>
<td colspan="5">
<table cellpadding="0" width="790" cellspacing="0" border="0">
<tr>
<td colspan="3" bgcolor="#000000"><IMG SRC="images/dot_clear.gif" width="10" height="1"></td>
</tr>
<tr>
<td width="1" bgcolor="#000000"><IMG SRC="images/dot_clear.gif" width="1" height="1"></td>
<td width="787" class="OrangeHeader"><asp:Label ID="lblHeader" Runat="server" /></td>
<td width="2" bgcolor="#000000"><IMG SRC="images/dot_clear.gif" width="2" height="1"></td>
</tr>
<tr>
<td colspan="3" bgcolor="#000000"><IMG SRC="images/dot_clear.gif" width="10" height="2"></td>
</tr>
</table>
</td>
</tr>
<tr>
<td colspan="5"><IMG SRC="images/dot_clear.gif" width="1" height="10"></td>
</tr>
<tr>
<td rowspan="3" width="130" valign="top">
<table cellpadding="0" width="130" cellspacing="0" border="0">
<tr>
<td><PDC_Utils:LoginControl id="LoginCtrl" runat="server" /></td>
</tr>
<tr>
<td><IMG SRC="images/dot_clear.gif" width="1" height="10"></td>
</tr>
<tr>
<td><PDC_Utils:MenuControl id="MenuCtrl" runat="server" /></td>
</tr>
<tr>
<td><IMG SRC="images/dot_clear.gif" width="1" height="10"></td>
</tr>
<tr>
<td><PDC_Utils:MonthlyStatControl id="StatCtrl" runat="server" /></td>
</tr>
<tr>
<td><IMG SRC="images/dot_clear.gif" width="1" height="10"></td>
</tr>
<tr>
<td><PDC_Utils:PostCategoryControl id="CatCtrl" runat="server" /></td>
</tr>
</table>
</td>
<td rowspan="3" width="10"><IMG SRC="images/dot_clear.gif" width="10" height="1"></td>
<td valign="top" width="650">
<wilson:contentregion runat="server" id="Region1">
<table cellpadding="0" width="650" cellspacing="0" border="0">
<tr>
<td colspan="3" bgcolor="#000000"><IMG SRC="images/dot_clear.gif" width="10" height="1"></td>
</tr>
<tr>
<td width="1" bgcolor="#000000"><IMG SRC="images/dot_clear.gif" width="1" height="1"></td>
<td width="597" class="BlueHeaderLarge">Content missing</td>
<td width="2" bgcolor="#000000"><IMG SRC="images/dot_clear.gif" width="2" height="1"></td>
</tr>
<tr>
<td colspan="3" bgcolor="#000000"><IMG SRC="images/dot_clear.gif" width="10" height="1"></td>
</tr>
<tr>
<td bgcolor="#000000"><IMG SRC="images/dot_clear.gif" width="1" height="1"></td>
<td class="TextBlock"> <br><br><br><br><br><br></td>
<td bgcolor="#000000"><IMG SRC="images/dot_clear.gif" width="2" height="1"></td>
</tr>
<tr>
<td colspan="3" bgcolor="#000000"><IMG SRC="images/dot_clear.gif" width="10" height="2"></td>
</tr>
</table>
</wilson:contentregion>
</td>
</tr>
<tr>
<td colspan="5"><IMG SRC="images/dot_clear.gif" width="1" height="10"></td>
</tr>
<tr>
<td valign="top" width="650" class="TextBlockTightTrans">
© 2004 by <a class="SmallBlack" href="http://www.pdc.se/code/contact.asp">Patrik Dahlén</a>.
Information is provided for educational purposes only, as-is and is subject to changes
without further notice. No warranties of any kind . You agree to use all information
only on your own risk.</td>
</tr>
</table>
</Form>
</body>
</HTML>
</code>
De taggar som heter wilson:contentregion är PlaceHolders för det innehåll som ändras från sida till sida. I ditt fall skulle du ha headern och menyn i en kontroll och sedan en contentregion för data. Det som ligger i contentregion i koden ovan är standardkod som visas om man inte lägger in något content.
För varje sida i sajten lägger jag sedan in mallkontrollen och sedan innehållet som skall visas i contentregion.
AboutMe.aspx
<code>
<%@ Page Language="vb" AutoEventWireup="false" Codebehind="AboutMe.aspx.vb" Inherits="pdc.AboutMe"%>
<%@ Register TagPrefix="Wilson" Namespace="Wilson.MasterPages" Assembly="WilsonMasterPages" %>
<wilson:masterpage runat="server" id="MPContainer">
<wilson:contentregion id="region1" runat="server">MasterPages</wilson:contentregion>
<table cellpadding="0" width="650" cellspacing="0" border="0">
<tr>
<td colspan="3" bgcolor="#000000"><IMG SRC="images/dot_clear.gif" width="10" height="1"></td>
</tr>
<tr>
<td width="1" bgcolor="#000000"><IMG SRC="images/dot_clear.gif" width="1" height="1"></td>
<td width="650" class="BlueHeaderLarge">About me</td>
<td width="2" bgcolor="#000000"><IMG SRC="images/dot_clear.gif" width="2" height="1"></td>
</tr>
<tr>
<td colspan="3" bgcolor="#000000"><IMG SRC="images/dot_clear.gif" width="10" height="2"></td>
</tr>
<tr>
<td bgcolor="#000000"><IMG SRC="images/dot_clear.gif" width="1" height="1"></td>
<td class="TextBlock">
<asp:Label ID="lblText" Runat="server" />
</td>
<td bgcolor="#000000"><IMG SRC="images/dot_clear.gif" width="2" height="1"></td>
</tr>
<tr>
<td colspan="3" bgcolor="#000000"><IMG SRC="images/dot_clear.gif" width="10" height="2"></td>
</tr>
</table>
</wilson:masterpage>
</code>
Om typen av innehåll är samma för ett antal sidor kan man göra så att man använder samma .aspx sida för alla de sidorna och skickar in ett id-nummer för att särskilja. Id-numret använder man för att hämta innehållet i t.ex. en databas eller xml-fil. Sedan gör man en .aspx sida för varje layout-typ av sida man har.
Så, som ni ser, MasterPages finns redan (på sätt och vis). :)
/pD
www.pdc.se
www.pdc.se/blog
www.patrik-dahlen.nuSv:
Det är jättekul att få tips! Jag ska kasta mig in i ämnet under dagen.
Jag återkommer förstås med hur det går!
Tack så länge.
MarcusCSv:
Det där med att ladd user controlls låte som en bra ide. En fåga bara.
Kan jag på nått sätt ladda en aspx sida till en placeholder?
Marcus CSv:
Inte .aspx då de innehåller t.ex <b>Page</b> direktiv och <b>Form</b> tagg, två saker dom bara får förekomma en gång i en .aspx sida. Om du skall dynamiskt ladda in innehåll på din sida så är det <b>UserControl</b>'s som gäller.
//AndreasSv:
Tack alla, nu vet jag på ett ungefär hur jag ska bygga upp sidan. Jag använder <div>ar
på sidan och kallar på olika user ctrls.
Jag har lagt följande kod i global.asax i BeginRequest
<code>
Dim fi As New FileInfo(Context.Request.FilePath)
If fi.Name.ToLower <> "default.aspx" Then
Context.RewritePath("default.aspx")
RaiseEvent LoadOtherPageThenDefault(fi.Name.ToLower, Context.Request.FilePath)
End If
</code>
Då kan man ju bara kommaåt default.aspx sidan. Som ni ser har jag försökt fånga när någon
skriven en annan sida. Det jag vill åstakomma är om till någon skriver http://hemsia.se/ensida.ascx så vill jag ladda ensida.ascx i contains diven på min default.aspx sida.
Frågan är alltså, hur dimar jag WithEvent i min default.aspx.vb class för att fånga händelsen? och därmed kunna ladda den eftersökta sidan?
H.
Marcus CSv:
Sv:
Jag tar och sätter denna tråd som löst då jag tycker jag fått svar på frågan.
Jag tackar alla som svarat.
Marcus C