webForumDet fria alternativet

Flera classer på varje sida

.NET

25 svar · 748 visningar · startad av greggan

Medlem sedan jan. 2004678 inlägg
Frågan#1

Hej hej

Jag tänkte göra om min applikation och lägga in allt i coe behind för att göra sidan bättre organiserad samt för att inte behöva ändra vissa saker på 50 olika sidor.

Jag sökte runt här lite men känner mig ändå inte helt säker och vill mest bara ha det bekräftat.

Jag kan skapa en code-behind-fil med typ funktioner och liknande som är likadant på alla sidor. Sedan kan jag skapa en code-behind-fil för varje asp.net-sida och importa den code-behind-filen som ska vara med på alla sidor till varje code-behind fil.

Lite smått förvirrande kanske.
Men stämmer detta?

Medlem sedan maj 20012 812 inlägg
#2

Det verkar som du vill göra en egen Page-class. Alltså den class som alla ASPX sidor ärver ifrån.

Du har då 2 möjligheter.

1. Du skapar ett nytt projekt (classlibrary) där du lägger alla det funktioner och metoder som du vill att alla codebehind sidor skall gå tillträde till.

2. Du skapar en egen page-base klass som först ärver från .NET's page-base klass och sedan så lägger du till alla de funktioner och methoder som du vill att sidorna skall ha.

- Magnus

Medlem sedan jan. 2004678 inlägg
#3

Okej. Men då låter det som 1:an är mer det jag tänkt mig.

Hur ärver jag ner en codebehind till en annan codebehind då?

Medlem sedan apr. 2004778 inlägg
#4

Så här gör du:

Alternativ 1:
Klassen du skapat, t.ex. myClass innehåller olika funktioner.
I code-behind skriver du
vb.net
Imports myClass
c#
using myClass;

Sedan kan du använda funktionerna med
myClass.myFunction()

Alternativ 2:
Här är ett exempel på en BasePage

    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

        Private Sub BasePage_Load(ByVal sender As Object, ByVal e As EventArgs)
           ' Här läggs det som ska köras när sidan laddas
        End Sub

        Protected Sub BasePage_Error(ByVal sender As Object, ByVal e As EventArgs)
            ' En lite errorlogg
            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

Sen är det bara att lägga till andra funktioner som alla sidor skall ha.

Mina code-behind ser då ut så här:

    Public Class page
        Inherits BasePage

        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

        Private Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
           ' Här läggs det som skall köras när just den här sidan laddas
        End Sub

    End Class
Medlem sedan jan. 2004678 inlägg
#5

Hmm.. det känns som att jag blir lite förvirrad.

Just nu har jag en massa (låt oss säga 10) sidor som är blandar html och asp.netkod. Det är massa olika subrutiner som anropar varandra beroende på vad som händer samt page_load på nästan varje. Dessutom finns det vissa funktioner som är med på varje sida.

Då tänkte jag att jag kanske kan göra en codebehind som har de funktioner som är med på alla sidor, så att de finns tillgängliga att anropas om så skulle behövas. (Dvs inte riktigt alla sidor använder dessa, men fler än en)

De subrutiner + olika page_load för de olika sidorna tänkte jag lägga in i separate codebehindfiler för varje aspsida. I dessa anropar jag då funktionerna med minclass.funktionen()

Det känns så avancerat, det du beskriver, men låter det som ett smart sätt att göra som jag beskriver?

Ytterligare en fråga: När jag importar en class till en annan codebehindfil, behöver jag då inte ange sökvägen till den, som jag måste göra när jag importar en class till en aspsida?

Medlem sedan apr. 2004778 inlägg
#6

Blanda inte html och asp.net kod inline. Separera kod och layout genom att använda code-behind.

Att ha samma code-behind till alla sidor funkar men det blir problem om du har saker som hanteras annorlunda på olika sidor. Det är därför man gör en basklass som code-behind ärver så har man alla gemensamma funktioner där. Annars kan du ju aldrig ändra sidorna separat.

Det känns som att du tänkt lite fel.

De subrutiner + olika page_load för de olika sidorna tänkte jag lägga in i separate codebehindfiler för varje aspsida. I dessa anropar jag då funktionerna med minclass.funktionen()

du ska ha en code-behind för varje sida och i dess page_load utför du det som skall göras för den sidan.
De gemensamma funktionerna ska du inte lägga i codebehindfiler utan i klassfiler.

När man importerar klasser så behövs bara själva importen. Klassen ligger antingen i en fil i samma vs-projekt eller så bygger du ett klassbibliotek i ett separat projekt och refererar sedan det projektet.

Jag tror att du skulle behöva kolla upp lite saker.
1. Objekt-orienterad programmering. Hur man jobbar med klasser och arv.
2. Hur ASP.NET använder code-behind.

Medlem sedan jan. 2004678 inlägg
#7

jo men det jag blir förvirrad av nu är att det låter lite som att klasser är en egen fil och codebehind är en egen fil. Jag trodde att klasserna låg i codebehindfiler...

skulle det kunna vara uppbyggt ungefär såhär? det känns som att det är det du menar här, kanske bara är så att jag fått termerna om bakfoten, eller så har jag fått allt helt fel ;)

Codebehind
CLassallmän
massa funktioner som alla sidor använder
end class
slut codebehind

nyheter codebehind
import classallmän
classnyheter
page_load
delete
posta
osv, endast för nyheter
end class
slut codebehind

nyheter.aspx
<page inherits="classnyheter"...
all htmlkod + datagrid och liknande
slut nyheter.aspx
Medlem sedan apr. 2004778 inlägg
#8

Du har fått det fel.
Så här ligger det till.

En webbsida består av
.aspx - html kod
.aspx.cs/.vb - c#- eller vb.net kod

Klasser använder man i objektorientering. Det enklaste är att ha en fil för varje klass.

Din Classallmän ovan är en klass, inte code-behind.
Code-behind innehåller koden för en sida och sidan i sig är en klass, så rent teoretiskt är det som ligger i code-behind en klass. Ordet code-behind är beteckningen för att du har separerat koden och lagt vb.net och C# koden "bakom" själva sidan.
En klass är en OOP term.

Det du har ovan skall istället se ut så här:
allmän.vb

Class allmän
  massa funktioner som alla sidor använder
end class

nyheter.aspx.vb

imports allmän
class nyheter
  page_load
  delete
  posta
  osv, endast för nyheter och kan använda funktionerna i allmän genom allmän.funktionsnamn
end class

nyheter.aspx

<page inherits="nyheter"...
all htmlkod + datagrid och liknande
slut nyheter.aspx

Som jag nämnde ovan, du skulle behöva läsa på lite. Dels om OOP och dels om grunderna i hur ASP.NET använder code-behind.

Medlem sedan jan. 2004678 inlägg
#9

okej, men det känns som att jag förstår det lite bättre nu. Hade ju fått termerna lite fel ändå. Trodde att alla som var .vb var codebehind men så var det inte. Codebehind är altså de .vb-filer som hör till en viss aspxsida. Alla .vbfiler innehåller klasser, vanligtvis endast en.

Men annars har jag väl förstått det ganska bra?
Står OOP för något?

Medlem sedan dec. 19996 522 inlägg
#10

Objekt Orienterad Programmering, OOP :)

Medlem sedan jan. 2004678 inlägg
#11

Ahaaa.. :)

Medlem sedan jan. 2004678 inlägg
#12

kom på en sak till :r
vad händer om jag anropar en funktion från ett datagrid? den funktionen kan fortfarande ligga i .vb-filen då eller?

Medlem sedan apr. 2004778 inlägg
#13

Det beror på vilken .vb fil du pratar om.
Den VB.NET kod du haft blandat med din HTML i .aspx bör du flytta till code-behind filen, dvs. .aspx.vb filen.
Inga problem för ditt datagrid att anropa funktioner i code-behind.
Däremot så kan du nog inte anropa en funktion som ligger i din basklass. Men om du har en funktion i code-behind som ditt datagrid anropar så kan den i sin tur använda basklassens funktioner.

Medlem sedan jan. 2004678 inlägg
#14

aha.. jo det låter ju logiskt.
det känns som att jag frågar saker hela tiden, men nu stötte jag på ett problem.

la in en replacegrej i min basklass. Nu får jag felet: Name 'Replace' is not declared

vilka saker måste jag importa?

jag har redan:

Imports System
Imports System.Web
Imports System.Web.UI
Imports System.Web.UI.WebControls
Imports System.Data
Imports System.Data.OleDb
Imports System.Web.Security

plus att jag skriver:

Public Class Vanliga : Inherits Page

Tack för att du står ut och orkar svara på alla mina små problem. Jag uppskattar det. :)

Medlem sedan apr. 2004778 inlägg
#15

Nu beror det på hur du gjort.
Om du gjort en basklass som ärver Page enligt mina exempel ovan så måste även .aspx.vb se ut som jag visat ovan.
Då är det inget annat som behöver importeras.

Du behöver visa lite mer. Visa din basklass och mer av din code-behind.

Medlem sedan jan. 2004678 inlägg
#16

just nu har jag bara gjort en klass med alla vanliga funktioner, ingen code-behind ännu. Tänkte testa först, eftersom det är ett väldigt stort steg att göra om allt till code-behind. Så då tänkte jag låta den vanliga .aspx-sidan ärva min class vanliga som då har alla vanliga funktioner i sig.

Imports System
Imports System.Web
Imports System.Web.UI
Imports System.Web.UI.WebControls
Imports System.Data
Imports System.Data.OleDb
Imports System.Web.Security

Public Class Vanliga : Inherits PageBase.StandardPage
function free(txt)

	txt = Replace(txt, "<", "&lt;")
	txt = Replace(txt, ">", "&gt;")
	txt = Replace(txt, ":)", "<img src=""smileys/smile.gif"">")
	txt = Replace(txt, ":(", "<img src=""smileys/frown.gif"">")
	txt = Replace(txt, ":r", "<img src=""smileys/shame.gif"">")
	txt = Replace(txt, ":D", "<img src=""smileys/biggrin.gif"">")
	txt = Replace(txt, ";)", "<img src=""smileys/wink.gif"">")
	txt = Replace(txt, ":P", "<img src=""smileys/tongue.gif"">")
	txt = Replace(txt, ":h", "<img src=""smileys/cool.gif"">")
	txt = Replace(txt, ":@", "<img src=""smileys/angry.gif"">")
	txt = Replace(txt, ":o", "<img src=""smileys/oh.gif"">")
	txt = Replace(txt, ":q", "<img src=""smileys/quest.gif"">")
	txt = Replace(txt, ":birp", "<img src=""smileys/beergrin.gif"">")
	txt = Replace(txt, ":bire", "<img src=""smileys/bire.gif"">")
	txt = Replace(txt, "=P", "<img src=""smileys/blah.gif"">")
	txt = Replace(txt, ":x", "<img src=""smileys/dead.gif"">")
	txt = Replace(txt, ":stud", "<img src=""smileys/stud.gif"">")
	txt = Replace(txt, ":s", "<img src=""smileys/devil.gif"">")
	txt = Replace(txt, ":bak", "<img src=""smileys/devilgrin.gif"">")
	txt = Replace(txt, ":f", "<img src=""smileys/flirt.gif"">")
	txt = Replace(txt, "=/", "<img src=""smileys/hrmpf.gif"">")
	txt = Replace(txt, ":i", "<img src=""smileys/idea.gif"">")
	txt = Replace(txt, "kuk", "*censur*")
	txt = Replace(txt, "fitta", "*censur*")
	txt = Replace(txt, "bög", "*censur*")
	txt = Replace(txt, "hora", "*censur*")
	txt = Replace(txt, "=D", "<img src=""smileys/supergrin.gif"">")
	txt = Replace(txt, "!P", "<img src=""smileys/jaja.gif"">")
	txt = Replace(txt, ":'D", "<img src=""smileys/laugh.gif"">")
	txt = Replace(txt, "8-)", "<img src=""smileys/look.gif"">")
	txt = Replace(txt, "Y-)", "<img src=""smileys/moose.gif"">")
	txt = Replace(txt, "*tihi*", "<img src=""tihi.gif"">")
	txt = Replace(txt, vbcrlf, "<br>")
	txt = Replace(txt, "'", "''")

	free = txt
end function
End Class

i min vanliga .aspx-sida ligger:

<%@ Page Language="VB" inherits="vanliga" src="vanliga.vb" validaterequest="false"  debug="true" %>

nåt mer viktigt?

Medlem sedan apr. 2004778 inlägg
#17

Nu har du blandat ihop koncepten igen.
Om du gör filen vanliga.vb och sätter den som src och inherits så blir den sidans code-behind.
Läs igenom mina poster om de två olika alternativen och exemplen.
Du måste bestämma dig för vad du ska göra.
Om du ska fortsätta blanda kod och html i .aspx sidan så ska du inte göra en klass som ärver Page utan en vanlig klass som innehåller funktioner.
Om du ska ha code-behind kan du använda båda alternativen.

Jag tycker verkligen att du ska läsa på mer om grunderna i ASP.NET, särskilt hur det fungerar med code-behind och arv m.m.
Om du ska börja med klasser och arv så rekommenderar jag även att du läser på grunderna i OOP. Du kommer få väldigt svårt att komma igång och förstå den här tråden om du inte kan grundkoncepten i OOP.

Medlem sedan jan. 2004678 inlägg
#18

okej. men om jag nu känner att det är för mycket arbete att bygga om min applikation till codebehind och bara vill göra så att jag har med dom vanligaste funktionerna, kan jag göra det då? eller är det lika bra att jag lär mig codebehind och gör det på rätt sätt från början?

Medlem sedan apr. 2004778 inlägg
#19

Du kan skippa code-behind om du vill. Men du ska inte lägga inherit och src i din Page deklaration. Och din klass ska inte ärva Page.
Istället så ska du importera andra klasser och sedan använda dessa klasser och deras funktioner i sidan.
En exempel klass
MyClass.vb

Class myClass

  Public Shared Function Hello() As String
     Return "Hello World"
  End Function

End Class

Men du bör läsa på om OOP så du förstår hur man använder klasser. Det enklaste är faktiskt att du lär dig OOP och sedan lär dig code-behind. Att lägga allt i .aspx sidan gör bara saker och ting rörigt. Som nu t.ex. när du får svårt att hålla isär koncepten med arv, code-behind, klasser, m.m.

Finns inga genvägar till att bli en bra .NET uvecklare. ;)

Medlem sedan jan. 2004678 inlägg
#20

Okej, jo men det känns som att jag har fått en hel del bra tips av dig nu. Ska försöka lära mig det där ordentligt, för jag tycker mig anta att det kan vara något ganska viktigt med codebehind. Dessutom är det ju ganska skönt att ha det lite bättre strukturerat. Just nu sitter jag med samma funktion på varje sida, vilket innebär att så fort jag vill göra en liten ändring i en funktion så måste jag öppna upp min 10-20 aspx-filer och ändra funktionerna där. Detta lär ju låta som väldigt falsk musik i en bra .NET utvecklaresöron.

Finns inga genvägar till att bli en bra .NET uvecklare. ;)

Nej det är väl så, så det är bara läsa, öva, läsa, testa, plugga osv. Inte för att jag är jätteoptimistisk till att jag kommer att kunna använda den här kunskapen på något annat sätt än privat i framtiden, även om jag inte vill något hellre än att bara sitta vid tangentbordet. ;) :P

269 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
123 ms — deklarationer (db)
0 ms — hämta statistik (cache)
143 ms — hämta tråd, inlägg och bilagor (db)
120 ms — ändringar (db)