Har följande. Du kan skriva en klass där alla sidor ärver page_load från och på det sättet ha en funktion där du sätter alla förutsättningar centralt i de fall du vill detta. Ett exempel: Marcus, Den lösning som jag använder ser ut så här:Problem med usercontrols
default.aspx innehåller tre olika userkontroller.
menuLeft.ascx
menuRight.ascx
menuTop.ascx
dessa representerar en viss design med tex en meny till vänster på sidan.
dessa userkontroller innehåller en annan userkontroll menu.ascx, som visar meny.
denna menykontroll har x antal properties som sätter färg, storlek etc.
idag har jag satt samma properties på de olika designkontrollerna, och sätter sedan värdet på dem i default sidan för att ställa in menyn.
detta gör att det blir mycket samma kod, har försökt med att designkontrollerna ärver menyn, men fick ej det att fungera.
Hur gör man?Sv: Problem med usercontrols
<info>
Du ersätter:
Inherits System.Web.UI.Page
med:
Inherits mittnamespace.SitePageBase
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Därefter kallar du en funktion som du kan kalla
PageLoadFunctions()
End Sub
</info>
Sen skapar du en ny vb-klass som du kallar exempelvis pagebase.vb. I denna skriver du:
NameSpace mittnamepsace
Public Class SitePageBase
Inherits System.Web.UI.Page
Public Sub New()
End Sub
Sub PageLoadFunctions()
' här lägger du alla inställningar du vill att aspxsidan och dess uct:er skall
' ställas in med när sidan laddas
End Sub
Sv: Problem med usercontrols
Vad du kan göra är en slags Presenter control/class.
En klass som sägger alla värden för din meny.
Jag är inte helt med på uppbyggnaden men vad du kan göra är ett Interface som du ärver.
ex IMenu sedan bygger du en presenter klass med två metoder.
En som tar emot en Imenu där du sätter värden och en metod där du tar emot page och söker fram de menykontroller du har och sedan ropar du på den metod som sätter dess layout 3 ggr, (en för vaje meny).
På så vis har du en central klass där du lätt kan justera dina kontrollers utssénden.
Detta kommer gå smidigare i .Net 2.0 då du kan skapa templates för alla kontroller du nyttjar.
Alltså.
Skapa en klass ex. UIPresenter släng in två metoder.
SetMenuLayout(Page page)
leta reda på dina menyer, antingen med FindControl efter ID eller Loppa genom alla du har och kolla om de är av typen IMenu
Skapa metoden som sätter utséendet.
SetMenyControlLayour(IMenu menu)
sätt de pubklika värderna. Ex:
menu.Style = ....
Se till så alla din meny ärver IMenu interfacet och koppla på den.
Klart.
(OBS! Du behöver inte använda interface om du inte vill utan kan kasta om din Control som Find Control gav dig till din Meny, det är vilket som.
På det här sättet kan du sedan bygga vidare på din UIPresenter om det är andra värden o saker du vill sätta på gemensamma controller utan att behöva skriva dem om o om igen.
Det finns tusen olika lösningar o vad som är bäst bestämmer du själv. Tänk på att Kraven är viktigast.
Och det är viktigt att du har de flesta kraven framför dig. De ger dig oftast svaret på den lösning som blir effektivast och enklast att hantera med.
Mvh JohanSv: Problem med usercontrols
-Wilson MasterPages som huvudmall
Detta är en .ascx som innehåller designkontrollerna.
Alla sidor har sedan denna kontroll inlagd, plus det innehåll som skall finnas i "innehållsdelen".
Jag kan ha olika huvudmallar om jag behöver olika layout.
-BasePage klass
En vanlig .vb fil som ärver Page och som sedan alla andra sidor ärver. Där lägger jag funktionalitet som alla sidor ska ha.
Exempel. OBS, nu blir det till att scrolla. ;)
En mall
<code>
<%@ Control Language="vb" AutoEventWireup="false" Codebehind="BaseTemplate.ascx.vb" Inherits="PDC.Core.Web.BaseTemplate" TargetSchema="http://schemas.microsoft.com/intellisense/ie5" %>
<%@ Register TagPrefix="PDC" Namespace="PDC.Core.Web.Controls.Server" Assembly="PDC.Core" %>
<%@ Register TagPrefix="PDC" TagName="HeaderTemplate" Src="~\Templates\HeaderTemplate.ascx" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<title><asp:Literal ID="litTitle" Runat="server" /></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">
<asp:Literal ID="litStyle" Runat="server" />
</HEAD>
<body MS_POSITIONING="GridLayout">
<Form runat="server" ID="Form1">
<div id="divHeader" style="position:absolute; top:20px; left:40px; width:725px; clip:rect(0,725,70,0); visibility: visible; z-index:40;">
<PDC:HeaderTemplate id="HeaderTemplate" runat="server" />
</div>
<div id="divImage" style="position:absolute; top:100px; left:145px; visibility: visible; z-index:70;">
<PDC:ContentRegion runat="server" id="RegionImage">
Innehåll saknas
</PDC:ContentRegion>
</div>
<div id="divLeftContent" style="position:absolute; top:296px; left:145px; visibility: visible; z-index:70;">
<PDC:ContentRegion runat="server" id="RegionLeft">
Innehåll saknas
</PDC:ContentRegion>
</div>
<div id="divRightContent" style="position:absolute; top:297px; left:445px; visibility: visible; z-index:80;">
<PDC:ContentRegion runat="server" id="RegionRight">
Innehåll saknas
</PDC:ContentRegion>
</div>
</Form>
</body>
</HTML>
</code>
Mallens code-behind
<code>
Protected litStyle As Literal
Protected litTitle As Literal
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim aSite As Site = Session("CurrentSite")
litStyle.Text = "<link rel=""stylesheet"" href=""" & ConfigurationSettings.AppSettings("webroot") & "Styles/Main_" & aSite.Id & ".css"">"
litTitle.Text = aSite.Description
End Sub
</code>
Min BasePage klass
<code>
Imports PDC.Core.Business
Imports PDC.Modules.Content.Business
Imports PDC.Modules.Accounts.Business
Namespace Core.Web
Public Class BasePage
Inherits System.Web.UI.Page
' Page Events
'- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Protected Overrides Sub OnInit(ByVal e As EventArgs)
MyBase.OnInit(e)
AddHandler Me.Load, AddressOf BasePage_Load
AddHandler Me.Error, AddressOf BasePage_Error
End Sub
Protected thisPage As Modules.Content.Business.Page
Private Sub BasePage_Load(ByVal sender As Object, ByVal e As EventArgs)
If Session("CurrentSite") Is Nothing Then
Dim newSite As Site
newSite = New Site(1)
Session("CurrentSite") = newSite
End If
If Request("pageid") <> "" Then
thisPage = New Modules.Content.Business.Page(Request("pageid"), Session("LanguageID"))
End If
End Sub
Protected Sub BasePage_Error(ByVal sender As Object, ByVal e As EventArgs)
Dim currentError As Exception = Server.GetLastError()
' Write error to log file if not already done by AppException
If Not (TypeOf currentError Is AppException) Then
AppException.LogError(currentError.Message.ToString)
End If
' Show error on screen
ShowError(currentError)
' Clear error so that it does not buble up to Application Level
Server.ClearError()
End Sub
' Shared Methods
'- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Public Shared Sub ShowError(ByVal currentError As Exception)
Dim context As HttpContext = HttpContext.Current
context.Response.Write( _
"<link rel=""stylesheet"" href=""" & ConfigurationSettings.AppSettings("webroot") & "/Styles/Main.css"">" & _
"<h2>Error</h2><hr/>" & _
"An unexpected error has occurred on this page." & _
"The system administrators have been notified.<br/>" & _
"<br/><b>The error occurred in:</b>" & _
"<pre>" & context.Request.Url.ToString & "</pre>" & _
"<br/><b>Error Message:</b>" & _
"<pre>" & currentError.Message.ToString & "</pre>" & _
"<br/><b>Error Stack:</b>" & _
"<pre>" & currentError.ToString & "</pre>")
End Sub
End Class
End Namespace
</code>
En vanlig sida i sajten
<code>
<%@ Register TagPrefix="PDC" TagName="LoginControl" Src="~\Modules\Accounts\Controls\LoginControl.ascx" %>
<%@ Register TagPrefix="PDC" Namespace="PDC.Core.Web.Controls.Server" Assembly="PDC.Core" %>
<%@ Register TagPrefix="PDC" TagName="NavigationControl" Src="~\Core\Controls\NavigationControl.ascx" %>
<%@ Page Language="vb" AutoEventWireup="false" Codebehind="page.aspx.vb" Inherits="PDC.Core.Web.page"%>
<PDC:MasterPage runat="server" id="MPContainer">
<PDC:ContentRegion id="RegionImage" runat="server">
<asp:Image ID="imgMain" Width="620" Height="175" Runat="server" /><br>
<asp:Image ID="imgVertSpace" Height="20" Width="1" ImageURL="../Images/dot_clear.gif" Runat="server" /><br>
<asp:Image ID="imgVertLine" Height="1" Width="620" ImageURL="../Images/dot_grey.gif" Runat="server" /><br>
</PDC:ContentRegion>
<PDC:ContentRegion id="RegionLeft" runat="server">
<PDC:NavigationControl id="NavControl" NavigationType="2" runat="server" /><br><br>
<table cellpadding="0" cellspacing="0" border="0" width="260">
<tr>
<td align="center"><br><br><asp:Image ID="imgSub" Runat="server" /></td>
</tr>
</table>
</PDC:ContentRegion>
<table cellpadding="0" cellspacing="0" border="0" width="320">
<tr>
<td align="right" class="padded" id="CurrentTD" runat="server"><asp:HyperLink Text="Aktuellt" Runat="server" ID="lnkCurrent" /></td>
</tr>
<tr>
<td><asp:Image ID="Image1" Height="18" Width="1" ImageURL="../Images/dot_clear.gif" Runat="server" /><br>
<asp:Label CssClass="header" ID="lblHeader" Runat="server" /><br>
<asp:Image ID="Image2" Height="3" Width="1" ImageURL="../Images/dot_clear.gif" Runat="server" /><br>
<asp:Label ID="lblMain" Runat="server" /></td>
</tr>
</table>
</PDC:masterPage>
</code>
Sidans code-behind
<code>
Imports PDC.Core.Web.Controls.User
Imports PDC.Core.Business
Namespace Core.Web
Public Class page
Inherits BasePage
Protected MPContainer As PDC.Core.Web.Controls.Server.MasterPage
Protected RegionImage As PDC.Core.Web.Controls.Server.ContentRegion
Protected RegionLeft As PDC.Core.Web.Controls.Server.ContentRegion
Protected RegionRight As PDC.Core.Web.Controls.Server.ContentRegion
Protected Overrides Sub OnInit(ByVal e As EventArgs)
MyBase.OnInit(e)
InitializeComponent()
End Sub
'This call is required by the Web Form Designer.
<System.Diagnostics.DebuggerStepThrough()> _
Private Sub InitializeComponent()
AddHandler Me.Load, AddressOf Page_Load
End Sub
Protected lblMain As Label
Protected lblHeader As Label
Protected imgMain As System.Web.UI.WebControls.Image
Protected imgSub As System.Web.UI.WebControls.Image
Protected NavControl As NavigationControl
Protected lnkCurrent As HyperLink
Protected CurrentTD As HtmlTableCell
Private Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
Dim aSite As Site = Session("CurrentSite")
lnkCurrent.NavigateUrl = "~/Templates/" & aSite.StartPage
CurrentTD.Attributes.Add("onmouseover", "this.className='green'")
CurrentTD.Attributes.Add("onmouseout", "this.className='padded'")
If Not thisPage Is Nothing Then
NavControl.CategoryID = thispage.CategoryID
lblMain.Text = thisPage.Content.GetContent("MainText").Content
lblHeader.Text = thisPage.Content.GetContent("MainHeader").Content
If thisPage.Content.GetContent("MainImage").ContentFile Is Nothing Then
imgMain.ImageUrl = "~/Images/dot_clear.gif"
imgMain.AlternateText = ""
Else
imgMain.ImageUrl = "~/Files/" & thisPage.Content.GetContent("MainImage").ContentFile.Url
imgMain.AlternateText = thisPage.Content.GetContent("MainImage").ContentFile.Description
End If
If thisPage.Content.GetContent("SubImage").ContentFile Is Nothing Then
imgSub.ImageUrl = "~/Images/dot_clear.gif"
imgSub.AlternateText = ""
Else
imgSub.ImageUrl = "~/Files/" & thisPage.Content.GetContent("SubImage").ContentFile.Url
imgSub.AlternateText = thisPage.Content.GetContent("SubImage").ContentFile.Description
End If
Else
imgMain.ImageUrl = "~/Images/dot_clear.gif"
imgMain.AlternateText = ""
End If
End Sub
End Class
End Namespace
</code>
Om jag behöver ändra något i en designkontroll så gör jag det i den kontrollen (precis som du har nu).
Både design och code-behind.
Om jag ska ändra i huvudlayouten så gör jag det i MasterPage mallkontrollen.
Både design och code-behind.
Om funktionaliteten ska ändras för alla sidor gör jag det i BasePage.
Med andra ord, styrningen av designkontrollerna görs i MasterPage mallen.