Samlad information runt 2310/T341 kurser
Informator AB samt Cornerstone AB
http://download.cnet.com/windows/3055-13632_4-75077446.html?tag=pdl-redir
Denna sida är avsedd för stödanteckningar under de kurser som jag kört. Det är frågor som eleverna ställt eller speciella tips som läggs till från såväl mig som andra elever.
» Text i textboxen som försvinner när man börjar skriva
<input type="text" value="Letar du något?" name="s" id="s" onfocus="if (this.value == 'Letar du något?') {this.value = '';}" onblur="if (this.value == '') {this.value = 'Letar du något?';}" />
» http://msdn.microsoft.com/library/default.asp?url=/library/en-us/mapi/html/97d7559f-9486-47ee-8f5b-45cf2c840967.asp (PR_SEARCH_KEY)
Bra designtemplates för sidor
http://www.oswd.org/
http://www.webcreme.com/
» Internet Explorer Developer Toolbar
http://www.microsoft.com/downloads/details.aspx?FamilyID=E59C3964-672D-4511-BB3E-2D5E1DB91038&displaylang=en
» ASP.NET Precompiler
http://msdn2.microsoft.com/en-us/library/ms229863(VS.80).aspx
» Bra artiklar om threading
http://www.yoda.arachsys.com/csharp/threads/
» Bra menyer, gratis för non-profit siter och intranet
http://www.milonic.com
» 101 Exempel för Visual Studio 2005 (vb/c#)
http://msdn2.microsoft.com/en-us/vstudio/aa718334.aspx
http://msdn2.microsoft.com/en-us/vstudio/aa718338.aspx (code snippets)
http://msdn2.microsoft.com/en-us/vstudio/aa718342.aspx (starter kits)
» Häftig generator för Regexp
http://tools.osherove.com/Default.aspx?tabid=182
- Testa bandbredden på nätet
http://rochester.speedtest.frontiernet.net/
- VB.NET och ASP.NET applikationer att testa och ändra
http://www.windowsforms.net/Default.aspx?tabindex=8&tabid=3
- Gratis webbhotell för .Net
http://www.aspspider.net/
- Hundapplikationen
/kurs/hundsite.zip
- Hur man skriver delegater i C# (Patrik Löwendahl)
/kurs/delegates.zip
- Konvertera vb-c# ovh vise versa
http://www.developerfusion.co.uk/utilities/convertvbtocsharp.aspx
- http://www.microsoft.com/sverige/msdn/live/2005/fall/agenda.asp
Fritt event hos Microsoft 25/10 om vsNet 2005
5% rabatt på litteratur för MCAD/MCSD finns på adlibris gällande http://www.adlibris.se/shop/product.asp?isbn=0735619255&mscssid=ALKTTRLSEH9X9N4NTLHNNBCADREM9EU0. Ange pellesoft 5% rabatt vid beställningen på deras hemsida.
Hur man pekar ut en annan fil om vissa http-fel uppstår:
<customErrors mode="RemoteOnly">
<error statusCode="403" redirect="/include/403.aspx" />
<error statusCode="404" redirect="/include/404.aspx" />
<error statusCode="500" redirect="/include/500.aspx" />
</customErrors>
- fromdb = ' data från databasen sen tidigare så det syns i div-taggen
' submitta
<script>
function runthis()
document.form1.data.value = document.form1.minbox.innerhtml
document.form1.submit
</script>
<form name="Form1" id="Form1" runat="server>
<input type = "hidden" name= "data" value="">
<div id="minbox" style="width:200px;height:200px;" border=1 contenteditable=true>
<%=fromdb%></div>
<a href="javascript.runthis();">Spara</a>
</form>
<%
mindata = request.form("data")
..... - > databas
%>
Bra utgångspunkt är http://www.htmlarea.com/
- Frigör cachen på OutputCache-objektet från codeBehind
Response.Cache.SetLastModified(Now)
Response.Cache.SetExpires(Now)
Response.Cache.SetCacheability(HttpCacheability.NoCache)
-
Pekka tipsade om hur man tillåter endast användare som kör basic authentication att komma åt trace.axd - www.codeproject.com/aspnet/basicauthen.asp
- Om ni får xsd-filer från kund finns en bra template för att automatiskt generera ut classer så att ni kan använda xml-filsdatat senare. http://www.microsoft.com/downloads/details.aspx?familyid=89E6B1E5-F66C-4A4D-933B-46222BB01EB0&displaylang=en , tips från Albin Malmgren.
- Intressanta artiklar om sökmotorer finner ni på http://www.seologik.se/
- Om du vill presentera upptaget/väntar/arbete pågår kan detta exempel i javascript användas enkelt. Se Better busybox: http://blogs.crsw.com/mark/articles/642.aspx
-
Om man exempelvis vill att när man trycke Enter i en textbox skall submitta frågan istället för att trycka på Enter-knappen, kan man skapa en EventHandler och fånga om man exempelvis tryckt Chr(13) = vilket är Enter. På så sätt kan man hantera detta smidigare. Exempel i c#
this.myTextBox.KeyPress += new System.Windows.Forms.KeyPressEventHandler(
this.myTextBox_KeyPress );
and add the event handler method as such:
private void myTextBox_KeyPress( object sender,
System.Windows.Forms.KeyPressEventArgs e )
{
// Do your stuff here
} -
Om man postar html från ett formulär kan man få följande felmeddelande: A potentially dangerous Request.Form value was detected from the client (TextBox1="
") -
För att stänga av detta kan man i @page-attributet lägga till kommandot: ValidateRequest="false
-
Länk till en bra klass för rinjedahls kryptering hämtas här: http://www.obviex.com/samples/Encryption.aspx#Output
Skicka mail med smtp via asp.net/vb.net
Sub sendmail(Optional ByVal relay As Boolean = False)
Dim newmail As New MailMessage
Dim smtp As Mail.SmtpMail
With newmail
.From = ""
.To = ""
.Subject = ""
.Body = ""
' relay
If relay = True Then
.Fields("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1
.Fields("http://schemas.microsoft.com/cdo/configuration/sendusername") = "username"
.Fields("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "password"
End If
End With
smtp.SmtpServer = "mail1.telia.com"
smtp.Send(newmail)
Kod för en .asmx.vb fil för att ansluta mot databas med datareader och plocka ut för och efternamn på en kund via web-service.
Imports System.Web.Services
Imports System.Data
Imports System.Data.SqlClient
<WebService(Namespace:="http://localhost/", Description:="Kundrelaterad information")> _
Public
Class Service1' WEB SERVICE EXAMPLE ' The HelloWorld() example service returns the string Hello World.
' To build, uncomment the following lines then save and build the project.
' To test this web service, ensure that the .asmx file is the start page
' and press F5.
'
<WebMethod(Description:="This function will provide you with the customer information")> _
Public Function GetCustomerName(ByVal customer_id As Integer, ByVal userid As String) As String If userid <> "88" Then ' dummy för en form av inloggningskravReturn "You have no access, contact test@support.se"
End If Dim con As New SqlClient.SqlConnection("data source=london; initial catalog=doctors; integrated security=sspi")
con.Open()
Dim cmd As New SqlCommand("select dr_lname, dr_fname from doctors where dr_id=" & customer_id, con) Dim dr As SqlClient.SqlDataReader = cmd.ExecuteReader(CommandBehavior.CloseConnection)Dim result As String While dr.Read
result = dr("dr_lname") & " " & dr("dr_fname")
End While
dr.Close()
con.Close()
End
ClassTre klasser som kan användas för databasanrop och täcker i stort sett alla behov för vanliga webbapplikationer:
Shared
Function GetConnectionString() As String' returnerar olika connectionsträngar beroende på om man kör i debugläge
' eller inte. Kör man i debug används den lokala databasen på utvmaskinen. If InStr(HttpContext.Current.Request.Url.ToString, "localhost") > 0 Then
GetConnectionString = ConfigurationSettings.AppSettings("ConnectionStringLocal")
Else
GetConnectionString = ConfigurationSettings.AppSettings("ConnectionString")
End If
End Function '
' Fyller en listbox och väljer en post om det går
' Shared Sub FillListBox(ByVal objName As DropDownList, ByVal index As String, ByVal Querystring As String, Optional ByVal firstItemText As String = "-- Välj --") Dim rst As SqlClient.SqlDataReader = ReturnDataReader(Querystring) ' lägg till ett förstaval
objName.Items.Clear()
objName.Items.Add(
objName.Items.Add(New ListItem(rst(1), rst(0)))
End While ' markera vald post om det går Try
If index > 0 And objName.Items.Count > 1 Then
objName.Items.FindByValue(index).Selected = True
End If
Catch ex As Exception
objName.SelectedIndex = 0
Finally
rst.Close()
End Try ' stäng och frigör
rst.Close()
rst =
Dim adapter As New SqlDataAdapter
Dim dataset As New DataSet ' anslut och försök utföra arbetet Try
adapter.SelectCommand = New SqlCommand(query, conn)
adapter.Fill(dataset)
Catch ex As SystemException
' om fel uppstår
Throw New ApplicationException("SQL: Kan inte köra frågan:" & Err.Description & query)
End Try ' returnera data om vi kan
Return dataset End Function Public Shared Function ReturnDataReader(ByVal sqlquery As String) As SqlDataReader ' observera att connection ligger öppen i denna rutin och tar minne
' i servern, men håller tråden öppen och pooling verkar bli bättre
' Create Instance of Connection and Command Object Dim myConnection As SqlConnection = New SqlConnection(GetConnectionString)
Dim myCommand As SqlCommand = New SqlCommand(sqlquery, myConnection) ' Mark the Command as a SPROC
myCommand.CommandType = CommandType.Text Try
' öppnar anslutningen och exekverar frågan
myConnection.Open()
Dim result As SqlDataReader = myCommand.ExecuteReader _
(CommandBehavior.CloseConnection)
' returnerar resultatet
Return result
Catch ex As DataException
' adderar info till loggfilen
' meddelar felet
Throw New SystemException("Fel vid anrop av sql-fråga: " & sqlquery & "-" & Err.Description)
End Try
myCommand =
NothingmyConnection = Nothing End Function ' Kör ett query innehållande sp-namn och dess parametrar
' returnerar ingenting Shared Sub ExecuteQuery(ByVal sqlquery As String) ' endast för ins/upd/del
' Skapa instans av en Connection samt Command Object Dim connectionstring As String = GetConnectionString()
Dim Con As New SqlConnection(connectionstring)
Dim cmd As SqlCommand ' öppnar connection
Con.Open() ' skickar in datat
cmd = New SqlCommand(sqlquery, Con) ' kör sp:n eller sql-satsen
Try
cmd.ExecuteNonQuery()
Catch ex As Exception
Throw New SystemException("Fel vid anrop av sql-fråga: " & sqlquery & "-" & Err.Description)
End Try ' stänger och frigör objekten
Con.Close()
cmd = Nothing
Con = Nothing
End Sub
Exempel på web.config
<?
xml version="1.0" encoding="utf-8"?><
configuration> <appSettings> <add key="Connection" value="data source=localhost;initial catalog=northwind;integrated security=true;" /> <add key="mail" value= "mail.pellesoft.se" /> </appSettings>
Motsvarande i c#
// Lägges precis under <configuration> i web.config
<appSettings>
<add key="ConnectionString" value="data source=localhost;initial catalog=northwind; integrated security=true;" />
<add key="mail" value= "mail.pellesoft.se" />
</appSettings>
// Skapa en ny class1.cs och ersätt ALLT med följande:
using System;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
using System.Web.UI.WebControls;
namespace Cornerstone
{
/// <summary>
/// Summary description for Class1.
/// </summary>
public class dbFunctions
{
// Get the the connection string from the web.config
static public string GetConnectionString()
{
return System.Configuration.ConfigurationSettings.AppSettings["ConnectionString"];
}
public dbFunctions()
{
//
// TODO: Add constructor logic here
//
}
static public SqlDataReader ReturnDataReader(string sqlquery)
{
SqlConnection myConnection = new SqlConnection(GetConnectionString());
try
{
myConnection.Open();
SqlCommand myCommand = new SqlCommand(sqlquery,myConnection);
myCommand.CommandType = System.Data.CommandType.Text;
SqlDataReader result = myCommand.ExecuteReader(CommandBehavior.CloseConnection);
return result;
}
catch(SqlException err)
{
throw new System.SystemException("Fel vid anrop av sql-fråga: " + sqlquery + "-" + err.Message);
}
}
static public void ExecuteQuery(string sqlquery)
{
SqlConnection myConnection = new SqlConnection(GetConnectionString());
try
{
myConnection.Open();
sqlquery = sqlquery.Replace("'","''");
SqlCommand myCommand = new SqlCommand(sqlquery,myConnection);
myCommand.CommandType = System.Data.CommandType.Text;
myCommand.CommandText = sqlquery;
myCommand.ExecuteNonQuery();
myConnection.Close();
}
catch(SqlException err)
{
throw new System.SystemException("Fel vid anrop av sql-fråga: " + sqlquery + "-" + err.Message);
}
}
static public DataSet ReturnDataSet(string sqlquery)
{
SqlConnection myConnection = new SqlConnection(GetConnectionString());
try
{
myConnection.Open();
DataSet myDS = new DataSet();
SqlDataAdapter myAdapter = new SqlDataAdapter(sqlquery,myConnection);
myAdapter.Fill(myDS);
myConnection.Close();
return myDS;
}
catch(SqlException err)
{
throw new System.SystemException("Fel vid anrop av sql-fråga: " + sqlquery + "-" + err.Message);
}
}
static public void FillListBox(System.Web.UI.WebControls.DropDownList dpl, string index, string querylist)
{
FillListBox(dpl,index,querylist,"--- Välj ---");
}
static public void FillListBox(System.Web.UI.WebControls.DropDownList dpl, string index, string querylist, string firstItem)
{
SqlDataReader rst = ReturnDataReader(querylist);
dpl.Items.Clear();
dpl.Items.Add(new ListItem(firstItem,"0"));
while (rst.Read())
{
dpl.Items.Add(new ListItem(rst[1].ToString(),rst[0].ToString()));
}
try
{
if (Convert.ToInt32(index) > 0 && dpl.Items.Count > 1)
{
dpl.Items.FindByValue(index).Selected = true;
}
}
catch (Exception ex)
{
dpl.SelectedIndex = 0;
}
rst.Close();
}
}
}
Bygg en tabell från CodeBehind:
Private
Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim conn As SqlConnection Dim daAuthors As SqlDataAdapter Dim dv As DataView 'create a connection to the Pubs databaseconn =
New SqlConnection _("data source=localhost;integrated security=true;initial catalog=pubs")
'create a dataset with information from the authors tabledaAuthors =
New SqlDataAdapter _("select * from Authors", conn)
ds =
New DataSet()daAuthors.Fill(ds, "Authors")
If Not Page.IsPostBack Then 'bind the column names to the listbox Dim r As DataRow Dim x As Integer = 0 For Each r In ds.Tables(0).Rows Dim tr As New TableRow() Dim td1 As New TableCell() Dim td2 As New TableCell() Dim link As New HyperLink() If x Mod 2 = 0 Thentr.ForeColor = Color.Brown
End Ifx += 1
link.Text = r(3)
link.NavigateUrl = "medical.aspx?pcp=" & r(3) & " " & r(2)
td1.Controls.Add(link)
td2.Attributes.Add("onclick", "javascript:alert('hej" & r(3) & "');")
td2.Text = r(2)
tr.Controls.Add(td1)
tr.Controls.Add(td2)
Table1.Controls.Add(tr)
Next End If End Sub
Exempel: språkhantering vb.net
Många pratar om språkhantering och för att få till en sådan på ett bra sätt tänkte jag helt enkelt skriva en artikel för att hjälpa dig på traven. Det finns inbyggt i .net men jag tyckte att det var enklare att ha en extern xml-fil som jag kunde skicka upp till servern i tid och otid för att snabbt kunna göra ändringar.
Vi börjar helt enkelt med att skapa oss en xml-fil som till en början inte blir speciellt märkvärdig. Denna kan sedan byggas på mer och mer, med fler språk och du kan till och med separera dessa så en xml-fil tillhör respektive språk. I mitt syfte kör vi i alla fall två språk, men vi har allt data samlat på en och samma sida.
[/include/language.xml]
<?xml version="1.0" encoding="utf-8" ?>
<languages>
<language name="Svenska" id="SV">
</language>
<language name="Engelska" id="EN">
</language>
</languages>
Nu har vi vår första xml-fil som du har skapat i notepad eller någon annan editor. Som du ser här så har vi starttaggen languages, där efter kommer language-taggen för svenska och därefter engelska. Som du förstår nu så kan du alltså bygga denna fil hierarkiskt hur djup som helst för att gruppera din information. Vi börjar med att fylla på några små objekt för såväl svenska som engelska och därefter skall vi plocka ut informationen och använda den i vår applikation.
<?xml version="1.0" encoding="utf-8" ?>
<languages>
<language name="Svenska" id="SV">
<page>
<language>In English</language>
</page>
</language>
<language name="Engelska" id="EN">
<page>
<language>På Svenska</language>
</page>
</language>
</languages>
Nu har vi lagt en rubrik som vi kallar page, och under page några objekt - typiska menyalternativ i toppen på pellesoft som du ser. Nu är det dags att bygga en funktion som hjälper oss att växla mellan språk. Enklast är att använda sig av ett sessionsobjekt och det börjar vi med genom att ha en link som vi trycker på om vart annat för att växla språket.
<asp:linkbutton id="lnkLanguage" runat="server">LinkButton</asp:linkbutton>
När vi klickar på denna länken så har vi en funktion kopplad till den i codebehind som ser ut som följer:
Private
Sub lnkLanguage_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lnkLanguage.Click If Session("UserCurrentLanguage") = Language.English Then
Session("UserCurrentLanguage") = Language.Swedish
Else
Session("UserCurrentLanguage") = Language.English
End If
Response.Redirect(Request.Url.ToString, True)
End Sub
Först tittar vi lite på response.redirect här. Den används för att ladda om hela sidan igen då koden troligast ligger i en usercontrol som visar menyn. Genom att ladda om sidan kommer informationen att presenteras igen men eftersom vi bytt språk ser man även ändringarna. Det står Language.English och .Swedish. Dessa har jag lagt i min basklass för att enkelt nå den. Du kan göra samma sak genom att lägga till följande.
Public Enum Language
Swedish = 1
English = 2
End Enum
Nu behövs vår magiska kontroll för att hämta rätt språk för rätt inställning. Vi börjar med funktionen som hämtar rätt språk.
Shared
Function GetLanguage() As StringSelect Case System.Web.HttpContext.Current.Session("UserCurrentLanguage")
Case Language.English : GetLanguage = "en"
Case Else : GetLanguage = "sv"
End Select
End Function
Rutinen returnerar helt enkelt en eller sv som vi sedan kommer använda oss av i vår språkfunktion när vi hämtar ut datat från vår xmlfil. Om nu anvädaren tittar på sidan och inte har påbörjat sin session än kan man också ta reda på vad webbläsaren har default för språk. Detta gör du exempelvis genom att kalla en rutin som nedan men endast en gång.
Shared Function GetLanguageId() As IntegerGetLanguageId = CInt(System.Web.HttpContext.Current.Session("UserCurrentLanguage"))
If GetLanguageId < 1 Then
' vilket språk är webbläsaren inställd på som default, visa då det först?
Dim webbrowserlanguage As String = System.Web.HttpContext.Current.Request.ServerVariables("HTTP_ACCEPT_LANGUAGE")
Select Case Left(LCase(webbrowserlanguage), Language.English)
Case "sv"
System.Web.HttpContext.Current.Session("UserCurrentLanguage") = Language.Swedish
Case "en"
System.Web.HttpContext.Current.Session("UserCurrentLanguage") = Language.English
Case Else
System.Web.HttpContext.Current.Session("UserCurrentLanguage") = Language.English
End Select
End If
End Function
Denna rutinen kan du exempelvis kalla på initiellt för att sedan användas vidare i dina rutiner. Den skall alltså kallas första gången, såvida du inte alltid vill påtvinga språket som webbläsaren initiellt använder. Därefter behöver vi också få reda på var filen finns placerat rent fysiskt på disk i vår applikation.
Shared Function GetLanguagePath() As StringIf InStr(HttpContext.Current.Request.Url.ToString, "localhost") > 0 Then
GetLanguagePath = ConfigurationSettings.AppSettings("LanguageFileLocal")
Else
GetLanguagePath = ConfigurationSettings.AppSettings("LanguageFile")
End If
End Function
Denna hämtar helt enkelt ut sökvägen där vi placerat vår xmlfil. Du kan antingen använda dig av mappath eller så lägger du det helt enkelt i web.config. Jag förordar web.config eftersom mappath faktiskt gör en findfile som i sin tur tar cpu och disk IO i onödan. Det kommer bli ganska många anrop när folk surfar på sidan så allt sådant som är tidsbesparande skall användas.
<?
xml version="1.0" encoding="utf-8" ?><configuration>
<appSettings>
<add key="LanguageFile" value="c:\server\wwwroot\include\extended.xml" />
<add key="LanguageFileLocal" value="c:\inetpub\wwwroot\include\extended.xml" />
</appSettings>
<system.web>
Sådär, nu har vi även våra sökvägar i web.config. Nästa moment är nu aktiskt att återanvända till vår linkbutton ovan, för den skall ju byta språk på texten varje gång man klickar på denna. Vi tar helt enkelt och på vår huvudsida, exempelvis default.aspx att lägga till denna funktion.
lnkLanguage
.Text = Namespace.Klassnamn.GetLangMessage("/page/language", True)Vi är nu bara en liten bit kvar från vår färdiga språkfil och den sista funktionen är alltså GetLangMessage som vi använder för att få tag på vår xml-fils specifika post beroende på vilket språk vi valt. Den här rutinen är lite mer avancerad än dom tidigare och en kort förklaring krävs innan vi summerar allting.
XML-filen läses in i cacheobjektet rakt upp och ner. Så länge den finns kommer vi hämta den och plocka ut vår översättning. Men om den inte finns där, läses den upp igen och läggs in. Jag har valt att med 15 minuters intervall döda denna cache och ladda om den automatiskt. Anledningen till det är att om jag skickar in en ny språkfil exempelvis via FTP så vet jag att inom 15 minuter kommer den nya användas. Hur du gör får du bestämma själv förstås. men jag tycker det är ett smidigt sätt.
En sak till, jag har något som kallas fallback. Det innebär att om jag står på sidan på Engelska och skall visa namnet där och det inte finns, då går jag vidare till Svenska och visar det. Finns inte det heller så skriver jag helt enkelt [nyckeln saknas]. På detta sätt vet du att du kanske missat ett stavat fe l på något tagg i din xml-fil, eller helt enkelt glömt den när du hoppar mellan dom olika språken. Nu tar vi en titt på vår funktion.
Shared Function GetLangMessage(ByVal KeyName As String, Optional ByVal FixBlankingSpace As Boolean = False) As String ' // Hämtar ur translate.xml ett namn eller en text beroende' på hur användaren ställt in sin webbläsare, eller via
' hemsidan. Dokumentet läggs även i en application-cache
' så den endast efterfrågas då vid av applikation/iis.
' ------------------------------------------------------
' KeyName är case-sensitive
' rooten anges ej, är <languages>
' ------------------------------------------------------ Dim XMLdoc As XmlDocument = New XmlDocument Try
' // Om hela xmldokumentet är cachat så använder vi det, annars öppnar vi
' det bara igen och läser igenom våra värden If Not HttpContext.Current.Cache("languagefile") Is Nothing Then
' läs ut xmlfilen från cache
XMLdoc = HttpContext.Current.Cache("languagefile")
Else
' skriv ner xmlfilen i cache, cacha i 15 minuter
XMLdoc.Load(GetLanguagePath)
HttpContext.Current.Cache.Insert("languagefile", XMLdoc, Nothing, DateTime.Now.AddMinutes(15), TimeSpan.Zero)
End If ' // Finns något data?
If XMLdoc.DocumentElement Is Nothing Then
Exit Function
End If
Catch ex As Exception ' vi fick något fel
System.Web.HttpContext.Current.Response.Write("Fel vid hämtning av xml-fil till siten. " & Err.Source & "<br>" & Err.Description)
HttpContext.Current.Response.End()
End Try ' // Söker ut rätt data baserat på frågan. En fallback finns vilket innebär
' att om inte något annat språks värde finns, söker den efter det svenska
' och finns inte det - returneras texten [nyckel saknas] Dim returnvalue As String
Try
returnvalue = XMLdoc.SelectSingleNode("/languages/language[@id='" & UCase(pellesoft.Site.GetLanguage,) & "']/" & KeyName).InnerText
Catch ex As Exception' fallback på språk
If pellesoft.Site.GetLanguageId >= 1 Then
Try
returnvalue = XMLdoc.SelectSingleNode("/languages/language[@id='SV']/" & KeyName).InnerText
Catch ex
returnvalue = "[nyckel saknas]"
End Try
Else
returnvalue = "[nyckel saknas]"
End If
End Try ' // rensar objektet
XMLdoc = Nothing ' // returnerar resultatet
If FixBlankingSpace = True Then
returnvalue = Replace(returnvalue, "-", "-")
Return Replace(returnvalue, " ", " ")
Else
Return returnvalue
End If End Function
Det som kan vara lite främmande här är ett scriptspråk som heter XPath och kan användas för att arbeta med just xml-filer. Funktionen SelectSingleNode söker den först matchande noden som kan finnas och vi skickar in data som säger att language skall vara SV/ därefter skall noden vara något som vi skickar med från vår funktion när vi skall skriva vår label. Det bör även tilläggas att Cache.Insert motsvarar gamla asp's Application("namn") men är nu mycket mer avancerad och effektivare.
Och så var hela applikationen klar att användas och testas. Om ni kommer på bättre eller effektivare lösningar så hör gärna av er eller posta de i filarkivet. Lycka till!
En variant på content managementsystem
Fixa en databas som innehåller tabellen page, med fälten pageid samt pagedata. Klasserna för att spara och läsa finns ovan.
Kod för aspx-sidan:
<%@ Page Language="vb" validateRequest="false" AutoEventWireup="false" Codebehind="content.aspx.vb" Inherits="development.content"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/tr/html4/strict.dtd">
<HTML>
<HEAD>
<title>Demo Content Management Editor</title>
<meta content="JavaScript" name="vs_defaultClientScript">
</HEAD>
<body>
<script>
function savetodatabase() {
document.Form1.datastorage.value = document.getElementById("datapage").innerHTML;
document.Form1.action.value = 'update';
//document.Form1.submit;
return true;
}
</script>
<form id="Form1" name="Form1" method="post" runat="server">
<input type="hidden" name="datastorage">
<input type="hidden" name="action">
<TABLE id="Table1" height="69" cellSpacing="1" cellPadding="1" width="530" border="0">
<TR>
<TD vAlign="top" noWrap width="513">
<div id="datapage" contentEditable="true" runat="server" name="datapage"><asp:label id="Label1" runat="server"></asp:label></div>
</TD>
<TD vAlign="top">
<input onclick="savetodatabase();" type="submit" value="Spara" name="submit">
</TD>
</TR>
<TR>
<TD nowrap width="513"> </TD>
<TD>
<a href="#" onclick="document.getElementById('datapage').contentEditable='true';">På</a>
<a href="#" onclick="document.getElementById('datapage').contentEditable='false';">Av</a>
</TD>
</TR>
</TABLE>
</form>
</body>
</HTML>
Kod för code-behind:
Public Class content
Inherits System.Web.UI.Page
Protected WithEvents datapage As System.Web.UI.HtmlControls.HtmlGenericControl
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'Put user code to initialize the page here
If Request("action") = "update" Then
SaveData()
Else
LoadData()
End If
End Sub
Sub LoadData()
Dim dr As SqlClient.SqlDataReader = dbfunctions.ReturnDataReader("select pagedata from page where pageid=1")
While dr.Read
datapage.InnerHtml = Convert.ToString(dr(0))
End While
dr.Close()
End Sub
Sub SaveData()
' resultatet
Dim data As String = Request.Form("datastorage")
dbfunctions.ExecuteQuery("update page set pagedata = '" & data & "' where pageid=1")
Response.Redirect(Request.Url.ToString)
End Sub
End Class
/Pelle Johansson
' Hur man skapar en tabell från codebehind med sortering på kolumner
Dim
sortorder As String = Request("sortorder") If sortorder = "" Then sortorder = "firstname" ' vad vi skall hämta ut Dim sql As String = "select * from employees order by " & sortorder & ""Response.Write(sql)
' instansiera objekt för att fyllas med data ' hämta datat Dim dr As SqlClient.SqlDataReader = database.ReturnDataReader(sql) Dim ptr As Integer = 0 Dim trHead As New TableRow Dim td1Head As New TableCell Dim td2Head As New TableCell Dim header1 As New HyperLink Dim header2 As New HyperLinkheader1.Text = "Förnamn" : header1.NavigateUrl = "webform1.aspx?sortorder=firstname"
header2.Text = "Efternamn" : header2.NavigateUrl = "webform1.aspx?sortorder=lastname"
td1Head.Controls.Add(header1)
td2Head.Controls.Add(header2)
trHead.Controls.Add(td1Head)
trHead.Controls.Add(td2Head)
Table2.Controls.Add(trHead)
While dr.Read ' förbered tablerow/celler Dim tr As New TableRow Dim td1 As New TableCell Dim td2 As New TableCell Dim mylink As New HyperLinkptr += 1
If ptr Mod 2 = 0 Then tr.BackColor = Color.BurlyWoodmylink.Text = dr("firstname")
mylink.NavigateUrl = "test2.aspx?id=" & dr("employeeid")
td1.Controls.Add(mylink)
'td1.Text = dr("firstname")td2.Text = dr("lastname")
tr.Controls.Add(td1)
tr.Controls.Add(td2)
Table2.Controls.Add(tr)
End Whiledr.Close()