Avatar billede trumf Nybegynder
20. marts 2005 - 17:17 Der er 48 kommentarer og
1 løsning

konvertere asp til .net

Hejsa E

Kan nogen hjælpe mig med at komme i gang med at konvertere et ASP projekt til et .NET (C#)

Jeg har indtil nu benyttet med en del af includefiler, men skal nu finde en anden måde at gøre det på. Derudover skal jeg have styr på brugen af klasser og metoder.

Min ASp løsning er noget CMS der har "undersøgt" hvilket domæne siden har kørt på, for derved at bestemme hvilken DB sideopsætning skal hentes fra. DB oplysninger og farver skal bruges på alle sider, så jeg har før brugt en inklude fil til det, men prøver nu med en klasse.
Og så er der noget menu som går igen på alle sider, men dhtml skal vel laves i en costom control eller hvad...

Vil nogen hjælpe med at komme i gang med det her, og samtidig fortælle hvor det er rigtigst at gøre de forskellige ting. global.asax, web.config, klasser osv.

Som det fremgår nedenfor hentes mange variable fra konstanter.asp
Koden er forkortet en del, men bare jeg får styr på det der er, så skal resten nok komme.

Min "gamle" default.asp:
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
<!--#INCLUDE FILE="include/konstanter.asp" -->
<%
page = request("page")
If aaben = "on" Then
    If page <> "" Then
        siden = page & ".asp?tekstID=" & request"tekstID")   
        Else
        siden = "forside.asp"
    End If
Else
    siden = "lukket.asp"
End If
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/frameset.dtd">
<html>
<head>
<title> <%=shopnavn%> </title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta http-equiv="keywords" content="<%=metakeyword%>">
<meta name="description" content="<%=metadesc%>">
<link rel="shortcut icon" href="favicon.ico">
</head>

<frameset cols="<%if centreret = "on" then%>*,<%end if%><%=width+17%>,*" border="0" frameborder="no">
    <%if centreret = "on" then%><frame src="x.asp" name="x" scrolling="no"><%end if
        if egentop = "on" then%><frameset rows="<%if egentop = "on" then response.write(topHeight & ", ") end if%>*" border="0" frameborder="no"><%end if%>
            <%if egentop = "on" then%><frame src="/include/egentop.asp" name="cShopTop" scrolling="no"><%end if%>
            <frame src="<%=siden%>" name="cShopMain" scrolling="auto">
        <%if egentop = "on" then%></frameset><%end if%>
    <frame src="x.asp" name="y" scrolling="no">
</frameset>

</html>
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Den gamle konstanter.asp:
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
<!--#INCLUDE FILE="funktioner.asp" -->
<!--#INCLUDE FILE="Conn_open.asp" -->
<%
aktuelSide = lCase(request.ServerVariables("URL"))
If left(aktuelSide, 1) = "/" Then
    aktuelSide = right(aktuelSide, len(aktuelSide)-1)
End If
If inStr(aktuelSide, "/") Then
    S1 = split(aktuelSide, "/")
    aktuelSide = S1(1)
End If

If Session("tilbage") = "" Then
    Session("tilbage") = "x"
    aktuelSide = "x"
End If

Select Case aktuelSide
    Case "x"
        Session("tilbage") = "forside.asp"
    Case "vis_kurv.asp
        Session("tilbage") = aktuelSide & "?vgID=" & Session("vgID")    Case "vis_produkt.asp",
                    Session("tilbage") = Session("tilbage")
    Case Else
        Session("tilbage") = "java script:history.back(-1);"
End Select

SQLStr = "SELECT * FROM konstanter WHERE kID = 1"
Set hentKonst = Conn.Execute(SQLStr)
If Not hentKonst.EOF Then
    farve1 = hentKonst("farve1")
    farve2 = hentKonst("farve2")
    farve3 = hentKonst("farve3")
    mainColor = hentKonst("mainColor")
    borderColor = hentKonst("borderColor")
    font = hentKonst("font")
    fontsize = hentKonst("fontsize")
    mainFontColor = hentKonst("mainFontColor")
    fontfarve1 = hentKonst("fontfarve1")
End If
Set hentKonst = Nothing
%>
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Den gamle Conn_open.asp:
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
<%
SERVER_NAME = Request.ServerVariables("SERVER_NAME")
domain = Replace(SERVER_NAME, "www.", "")
xSplit = Split(domain, ".")
xCount = uBound(xSplit)

If xCount < 2 Then
    SQLStr = "SELECT a.dbName, a.dbUser, a.dbPass, a.webID FROM admin a, domains d WHERE a.webID = d.webID AND d.domain = '" & domain & "'"
End If

Set hent = Conn.Execute(SQLStr)
If Not hent.EOF Then
    webID = hent("webID")
    dbName = hent("dbName")
    dbUser = hent("dbUser")
    dbPass = hent("dbPass")
Else
    webID = 0
    dbName = ""
    dbUser = ""
    dbPass = ""
End If
Set hent = Nothing

Set Conn = Server.CreateObject("ADODB.Connection")
ConnStr = "Driver={MySQL ODBC 3.51 Driver}; Server=localhost; Database=" & dbName & "; UID=" & dbUser & "; PWD=" & dbPass & ";"
Conn.Open ConnStr
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

min gamle forside.asp og mange andre sider:
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
<!--#INCLUDE FILE="include/head.asp" -->
<!--#INCLUDE FILE="include/js_menu.asp" -->
</head>
<body class="shopbody" onLoad="init();">
<!--#INCLUDE FILE="include/top.asp" -->
<!--#INCLUDE FILE="include/menuogleft.asp" -->
<%=forsideTekst%>
<!--#INCLUDE FILE="include/bund.asp" -->
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Avatar billede trumf Nybegynder
22. marts 2005 - 11:57 #1
Jeg beder ikke om at nogen skal skrive koden for mig, men blot at hjælpe med at komme igang og beskrive hvordan jeg skal bygge det op.
Avatar billede ncp Nybegynder
22. marts 2005 - 20:38 #2
For det første skal du have fat i MySQL Connector/Net, så du kan hente data fra MySQL - du finder den her: http://dev.mysql.com/downloads/connector/net/1.0.html
Avatar billede trumf Nybegynder
22. marts 2005 - 20:53 #3
Den har jeg allerede.

Det er ikke så meget selve koden, det finder jeg nok ud af, men hvor skal jeg hente alle de data jeg før hentede i include filen (konstanter.asp)
Dataene skal jo bruges på alle sider, så jeg har lavet en klassefil (konstanter.cs) og vil så bruge dataene den vej.
Jeg forestiller mig, at jeg kan hente data som skal bruges på default.aspx ind i default.cs ved at henvise til klassen konstanter og variablen farve1 ved at skrive noget med string farve1 = konstanter.farve1 og så bruge farve1 som en variabel på default.aspx
Jeg håber dette giver mening, og hvis ikke hvordan skal jeg så gøre det ???
Avatar billede arne_v Ekspert
22. marts 2005 - 23:38 #4
Sådan noget skal laves helt anderledes i ASP.NET - hvis det skal være pænt
ASP.NET ihvertfald.

Men jeg har ihvertfald ikke overblikket til det.

Mangler der ikke også nogle sider ?
Avatar billede trumf Nybegynder
23. marts 2005 - 09:04 #5
Hejsa Arne

Jo der mangler mange sider, men hvis jeg bare får ideen med hvordan der gøres, så skal jeg nok selv klare de andre.
menuogleft.asp, js_menu.asp, head.asp og top.asp havde jeg tænkt mig at lave som custom kontroller.
Jeg kan bare ikke lige finde ud af hvordan jeg laver det der med at hente alle konstanter, og lave det så det er pænt.
Har du en ide ?
Avatar billede arne_v Ekspert
23. marts 2005 - 09:26 #6
Konfigurations konstanter ville jeg nok opbevare i en singleton (med late
loading fra databasen i constructor).
Avatar billede trumf Nybegynder
23. marts 2005 - 10:11 #7
Men en singleton er da et objekt som kun kan have en instans og jeg kører jo mange domæner (med forskellig opsætning). Domænerne deler samme kode i IIS'en.
Vil hver applikation på tværs af IIS'en så ikke dele denne instans...
Avatar billede arne_v Ekspert
23. marts 2005 - 10:33 #8
Nu er jeg ikke ASP.NET ekspert, men jeg vil tro at hvert domæne hostet i IIS, har
sit eget "application domain" og at hvert "application domain"" vil have sin
egen kopi af den singleton.
Avatar billede trumf Nybegynder
23. marts 2005 - 11:03 #9
OK, og så kan jeg kalde alle variable gennem constructoren fra codebehind filen i f.eks. pageprerender, og bruge dem på aspx siden med <%=farve1%>
Avatar billede arne_v Ekspert
23. marts 2005 - 11:07 #10
<%=ConfigSingleton.Instance.Farve1%>

:-)
Avatar billede arne_v Ekspert
23. marts 2005 - 11:07 #11
Men du kan vel nemt lige teste om application domains og singletons virker som
jeg tror.
Avatar billede trumf Nybegynder
23. marts 2005 - 13:00 #12
Sorry var lige væk lidt. (har købt en kompressor og er lige i gang med at "gøre rent" i severskabet :-)
Ok <%=ConfigSingleton.Instance.Farve1%> kan vel laves uden at lave noget på codebehind filen, men i stedet lægge constructoren i en klasse for sig selv...

Jeg prøver lige, men jeg skal jo først finde ud af hvordan sådan en singleton laves :-)
Jeg har læst om det, men aldrig lavet en...
Avatar billede trumf Nybegynder
25. marts 2005 - 23:34 #13
Denne her singleton klasse skal jo ikke være skrives ind på alle siderne, da det vil være for uoverskueligt at rette 400 steder hver gang jeg tilføjer en variabel, så jeg har oprettet en .cs fil (includes.cs) og lagt den der, men hvordan laver jeg en reference til den klassefil ???
Når jeg kalder includes.instance.farve1 siger den at det ikke er en del af namespacet...

Skulle jeg lave et klassebibliotek og lægge alle mine funktioner og konstantkald der ?
Avatar billede arne_v Ekspert
25. marts 2005 - 23:53 #14
Du har din TrumfUtil.cs med ConfigSingleton klassen og andre klasser i
namespace TrumfUtil.

Den builder du til TrumfUtil.dll og gør tilgængelig for de web apps der skal
bruge den.

De kan så lave using TrumfUtil og bruge ConfigSingleton.
Avatar billede trumf Nybegynder
26. marts 2005 - 02:29 #15
Når jeg lægger koden ind i nedenstående får jeg fejlen:
'webUtil.ConfigSingleton.instance' is inaccessible due to its protection level
på den side hvor jeg laver reference, men ingen fejl på selve util-siden
public ConfigSingleton()
{
        string dbName = "";
        string dbUser = "";
        string dbPass = "";

        MySqlConnection ConnStr = new MySqlConnection("Database=" + dbName + ";Data Source=localhost;User Id=" + dbUser + ";Password=" + dbPass);
        string SQLStr = "SELECT * FROM konstanter WHERE kID = 1";
        MySqlCommand cmdGetConst = new MySqlCommand(SQLStr, ConnStr);
        ConnStr.Open();
        MySqlDataReader readConst = cmdGetConst.ExecuteReader();

        string egenTop = readConst["egenTop"].ToString();
        string centreret = readConst["centreret"].ToString();
        string farve1 = readConst["farve1"].ToString();

        ConnStr.Close();       
}

Når jeg laver koden som nedenstående får jeg en fejl på util-siden:

using System;
using MySql.Data.MySqlClient;

namespace webUtil
{
    public class ConfigSingleton
    {
        string dbName = "";
        string dbUser = "";
        string dbPass = "";

        MySqlConnection ConnStr = new MySqlConnection("Database=" + dbName + ";Data Source=localhost;User Id=" + dbUser + ";Password=" + dbPass);
        string SQLStr = "SELECT * FROM konstanter WHERE kID = 1";
        MySqlCommand cmdGetConst = new MySqlCommand(SQLStr, ConnStr);
        ConnStr.Open();
        MySqlDataReader readConst = cmdGetConst.ExecuteReader();

        string egenTop = readConst["egenTop"].ToString();
        string centreret = readConst["centreret"].ToString();
        string farve1 = readConst["farve1"].ToString();

        ConnStr.Close();

        private static ConfigSingleton instance;

        public ConfigSingleton()
        {
        }

        public static ConfigSingleton Instance()
        {
            if( instance == null )
                instance = new ConfigSingleton();

            return instance;
        }
    }
}

Invalid token '(' in class, struct, or interface member declaration
og så er der streg under parantes start i: ConnStr.Open(); og ConnStr.Close();
Avatar billede arne_v Ekspert
26. marts 2005 - 10:11 #16
webUtil.ConfigSingleton.instance' is inaccessible due to its protection level =>
instance er private og skal tilgåes via den publib Instance

og det sidste er ikke validt C# kode da alle kald skal være inden i en metode
Avatar billede trumf Nybegynder
26. marts 2005 - 21:41 #17
instance er private og skal tilgåes via den publib Instance

Jeg forstår ikke....
Avatar billede arne_v Ekspert
26. marts 2005 - 21:45 #18
Må jeg være så fræk at henvise til en af mine egne artikler:

http://www.eksperten.dk/artikler/37

?
Avatar billede trumf Nybegynder
26. marts 2005 - 22:02 #19
Vær du bare fræk ;-)
Jeg læser nu...
Avatar billede trumf Nybegynder
26. marts 2005 - 23:42 #20
OK så er den læst, men jeg kan ikke lige se hvordan det hjælper mig i denne situation...

Hvis vi nu siger at dette er mine variable:

string dbName = "";
string dbUser = "";
string dbPass = "";

MySqlConnection ConnStr = new MySqlConnection("Database=" + dbName + ";Data Source=localhost;User Id=" + dbUser + ";Password=" + dbPass);
string SQLStr = "SELECT * FROM konstanter WHERE kID = 1";
MySqlCommand cmdGetConst = new MySqlCommand(SQLStr, ConnStr);
ConnStr.Open();
MySqlDataReader readConst = cmdGetConst.ExecuteReader();

string egenTop = readConst["egenTop"].ToString();
string centreret = readConst["centreret"].ToString();
string farve1 = readConst["farve1"].ToString();

ConnStr.Close();

og at dette er min singleton:

using System;
using MySql.Data.MySqlClient;

namespace webUtil
{
    public class ConfigSingleton
    {
        private static ConfigSingleton instance;

        public ConfigSingleton()
        {
        }

        public static ConfigSingleton Instance()
        {
            if( instance == null )
                instance = new ConfigSingleton();

            return instance;
        }
    }
}

Hvor skal min kode til at hente variable så ind henne for at jeg kan hente dem frem fra andre sider?
Avatar billede arne_v Ekspert
27. marts 2005 - 00:05 #21
Hen fra database koden skal i constructor.

[som skal være private !!]

resultatet skal gemmes i private fields som har public get properties
Avatar billede arne_v Ekspert
27. marts 2005 - 00:11 #22
using System;
using MySql.Data.MySqlClient;

namespace webUtil
{
    private string egenTop;
    ...
    public class ConfigSingleton
    {
        private static ConfigSingleton instance;

        private ConfigSingleton()
        {
              ...
              egenTop = readConst["egenTop"].ToString();
              ...
        }

        public static ConfigSingleton Instance()
        {
            if( instance == null )
                instance = new ConfigSingleton();

            return instance;
        }

        public string EgenTop
        {
              get
              {
                  return egenTop;
              }
        }
        ...
    }
}
Avatar billede arne_v Ekspert
27. marts 2005 - 00:11 #23
Iøvrigt laver man ofte Instance som property fremfor som metode
Avatar billede trumf Nybegynder
27. marts 2005 - 00:55 #24
Wow, så bliver min kode godt nok lang, for der er mange variable, for slet ikke at tale om alle funktionerne, som jeg lige så godt kan lægge her...

Hvor meget kode bliver eksekveret når man kalder en klasse ?
Jeg tænker her, at hvis man nu har 100 variable og 50 funktioner, men kun skal bruge en enkelt variabel, er der så noget performance at vinde ved at lave flere singletons, eller finder "frameworket" selv ud af kun at kalde den Get man skal bruge.
Avatar billede trumf Nybegynder
27. marts 2005 - 00:59 #25
Eller endnu vigtigere...

når det nu er klassekald, vil der så ikke laves en kald til DB hver gang der laves en get ?
Avatar billede trumf Nybegynder
27. marts 2005 - 01:06 #26
Altså på en side kan jeg jo flere gange skrive Response.Write(ConfigSingleton.Instance.Farve1), Response.Write(ConfigSingleton.Instance.Farve2) osv. så laves denne del vel hver gang
        private ConfigSingleton()
        {
              ...
              egenTop = readConst["egenTop"].ToString();
              ...
        }

dvs et DB kald for hver variabel der skal bruges på en side, eller huskes alle variable gennem hele sessionen/applikationssessionen
Avatar billede arne_v Ekspert
27. marts 2005 - 12:16 #27
Nej.

Hvis du kigger på Instance så kalder den kun constrctor første gang !
Avatar billede trumf Nybegynder
27. marts 2005 - 15:36 #28
OK, ret fedt... meget bedre end includes der kaldes for hver side med calssic ASP. Kører det så på applications eller sessions niveau ?
Avatar billede arne_v Ekspert
27. marts 2005 - 15:53 #29
applikation

men det er uafhængigt af at det er en web applikation
Avatar billede trumf Nybegynder
27. marts 2005 - 21:13 #30
Kan man gøre noget for at nulstille instance/genkalde contructor, for ellers vil man jo ikke kunne se ændringer før genstart af webservice når der arbejdes i administrationen.
Avatar billede arne_v Ekspert
27. marts 2005 - 21:32 #31
Så vil du skulle lave en metode i singleton'en og lave en refresh.aspx side som
kalder den
Avatar billede arne_v Ekspert
27. marts 2005 - 21:32 #32
Eller bygge noget timet ind i den så den altid genlæse data hver 10. minut
Avatar billede trumf Nybegynder
27. marts 2005 - 21:59 #33
OK, det er vel noget i stil med.

        public string Instance
        {
              set
              {
                  instance = null;
              }
        }

lige efter

        public string EgenTop
        {
              get
              {
                  return egenTop;
              }
        }
Avatar billede arne_v Ekspert
27. marts 2005 - 22:12 #34
Jeg ville nok lave en Refresh metode - det er ikke pænt med en property set som
ignorerer value.
Avatar billede trumf Nybegynder
27. marts 2005 - 23:10 #35
OK det tager vi i næste spm, men for lige at gøre denne færdig, så har jeg lige en lille smule mere før der er hul igennem.
Jeg kan ikke lave Request fra singletonen da der ikke er adgang til namespacet httprequest, så jeg bliver nødt til at få den overført på en eller anden måde så jeg kan lave en connection til den rigtige DB. Jeg har tænker at gøre det på følgende måde, men kan ikke lige gennemskue at få variablen over.

using System;
using System.Collections;
using MySql.Data.MySqlClient;
using System.Text.RegularExpressions;
using System.Web;

namespace webUtil
{
    public class Functions
    {
    ...
    }

    public class ConfigSingleton
    {
    private string egenTop;
    private string connStr;

        private static ConfigSingleton instance;

    private static string GetConnStr()
    {
        string server_name = Request("server_name");
        string domain = Regex.Replace(server_name, "www.", "");
        ...
        string dbName = domain.....
        string dbUser = ....
        string dbPass = ....
        string connStr = "Database=" + dbName + ";Data Source=localhost;User Id=" + dbUser + ";Password=" + dbPass);
        return connStr
    }

        private ConfigSingleton()
        {
          MySqlConnection ConnStr = new MySqlConnection(GetConnStr());
              ...
              egenTop = readConst["egenTop"].ToString();
              ...
        }

        public static ConfigSingleton Instance()
        {
            if( instance == null )
                instance = new ConfigSingleton();

            return instance;
        }

        public string EgenTop
        {
              get
              {
                  return egenTop;
              }
        }
        public string ConnStr
        {
              get
              {
                  return GetConnStr();
              }
        }
    }
}
Avatar billede arne_v Ekspert
27. marts 2005 - 23:24 #36
Prøv med HttpContext.Current.Request
Avatar billede arne_v Ekspert
27. marts 2005 - 23:25 #37
Men jeg forstår iøvrigt ikke helt hvorfor du skal bruge srequest data for at vide i
hvilken applikation du er ?
Avatar billede trumf Nybegynder
27. marts 2005 - 23:36 #38
Jeg bruger request til at hente det domæne brugeren er inde på. Domænet ligger i en DB med en reference til det tilhørende databasenavn.
Men jeg formoder at du nu fortæller mig at jeg kan bruge en eller anden application(xxx) for at finde det samme eller noget tilsvarende...
Avatar billede trumf Nybegynder
27. marts 2005 - 23:50 #39
der ligger slet ikke noget under system.web så den dur vist heller ikke...
jer skal jo bare have fat i Request.ServerVariables("SERVER_NAME")
Avatar billede arne_v Ekspert
27. marts 2005 - 23:52 #40
Du skal nok bare have tilføjet en reference til System.Web.dll eller sådannoget
Avatar billede arne_v Ekspert
27. marts 2005 - 23:52 #41
Og ja - jeg tror at det må kunne findes uden at kigge i en request - jeg ved dog¨
ikke lige hvordan.
Avatar billede arne_v Ekspert
28. marts 2005 - 00:14 #42
Prøv og se om du kan bruge:

System.Web.HttpRuntime.AppDomainAppPath
System.Web.HttpRuntime.AppDomainAppVirtualPath

til noget.
Avatar billede trumf Nybegynder
28. marts 2005 - 02:08 #43
OK nu har jeg vist fået hul igennem :-)

Når jeg så skal bruge variablerne fra singletonen (på aspx siden), skal jeg så hente dem på .aspx eller på .aspx.cs siden ?
Det lyder for mig umiddelbart indlysende kun at hente dem frem på aspx siden, men på den side kan jeg jo ikke lave en "using webUtil" så hvordan gør jeg det så ?

<%@ Page language="c#" Codebehind="x.aspx.cs" AutoEventWireup="false" Inherits="_24_7net.WebForm2" %>
<%
string firmanavn = "xxx";
string metakeyword = "xxx";
string metadesc = "xxx";
string farve5 = "ff0000";
string bg5 = "";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title> <%=firmanavn%> </title>
<meta http-equiv="keywords" content="<%=metakeyword%>">
<meta name="description" content="<%=metadesc%>">
</head>

<body bgcolor="#<%=farve5%>"<%if (bg5 != "") {%> background="pict/sitePict/<%=bg5%>"<%}%>>

</body>
</html>
Avatar billede arne_v Ekspert
28. marts 2005 - 13:37 #44
Jo !

<%@ import namespace="WebUtil" %>

og

<%=ConstantSingleton.Instance().Farve5%>

eller uden import:

<%=WebUtil.ConstantSingleton.Instance().Farve5%>
Avatar billede arne_v Ekspert
28. marts 2005 - 13:37 #45
Burde man iøvrigt ikke bruge CSS til den slags ?
Avatar billede trumf Nybegynder
28. marts 2005 - 18:06 #46
Jo det gør jeg faktisk også, det var bare et eksempel.
De værdier jeg bruger er højde, bredde på tabeller og billeder og hvad der skal vises forskellige steder osv.

Nu har jeg vist også brugt min tarif for denne gang.
Jeg takker mange gange for din tålmodighed, smider du et svar.
Avatar billede arne_v Ekspert
28. marts 2005 - 18:09 #47
svar
Avatar billede trumf Nybegynder
28. marts 2005 - 19:42 #48
Du har sgu været til meget stor hjælp denne gang ;-)
Avatar billede arne_v Ekspert
28. marts 2005 - 19:58 #49
ASP.NET er et meget stort web framework. Meget meget større end ASP.
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
Kurser inden for grundlæggende programmering

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