Avatar billede websam Nybegynder
21. april 2005 - 17:39 Der er 32 kommentarer og
1 løsning

Fortsættelse af http://www.eksperten.dk/spm/610356

Som det første for jeg fejl på den her :

Public Function GetLocalizedString(ByVal type As String) As String
    If Application("LoginLanguage") = Nothing Then
        Dim ds As DataSet = New DataSet()
        Dim ses As String = Session("setLanguage")
        ds.ReadXml(Server.MapPath("../Xml/login.xml"))
        Application("LoginLanguage") = ds
    End If

    Return CType(Application("LoginLangauge"), DataSet).Tables(CStr(ses)).Rows(0)(type).ToString()
End Function

Fejlen lyder på :

Object reference not set to an instance of an object.

Og er i denne linie :

Return CType(Application("LoginLangauge"), DataSet).Tables(CStr(ses)).Rows(0)(type).ToString()

Ved ikke helt hvad det er ?

/Websam
Avatar billede burningice Nybegynder
21. april 2005 - 17:43 #1
ah... jeg havde optimere lidt for meget... kommer til at se at ses, variabel går ud af scope efter din if-block. Prøv dette

Public Function GetLocalizedString(ByVal type As String) As String
    Dim ses As String = CType(Session("setLanguage"), String)
   
    If Application("LoginLanguage") = Nothing Then
        Dim ds As DataSet = New DataSet()
        ds.ReadXml(Server.MapPath("../Xml/login.xml"))
        Application("LoginLanguage") = ds
    End If

    Return CType(Application("LoginLangauge"), DataSet).Tables(ses).Rows(0)(type).ToString()
End Function
Avatar billede websam Nybegynder
21. april 2005 - 17:46 #2
Får stadig den samme fejl :

Object reference not set to an instance of an object

/Websam
Avatar billede burningice Nybegynder
21. april 2005 - 17:53 #3
Samme fejl, samme sted?

:)

så også lige en lille stavefejl. LoginLangauge skal jo være LoginLanguage

håber ikke det er fejlen though, for folk der copy/paster fra eksperten må gerne lige kigge den igennem for slåfejl m.m. før de melder tilbage at koden er noget skrammel.
Avatar billede websam Nybegynder
21. april 2005 - 18:01 #4
Nej havde rettet stavebøf, men det var mig der skrev den forkerte fejlkode den kommer her :

Operator is not valid for type 'DataSet' and 'Nothing'.

Og i denne linie :

If Application("LoginLanguage") = Nothing Then

?

/Websam
Avatar billede websam Nybegynder
21. april 2005 - 18:05 #5
Hov det er jo fordi det skal være "Is nothing" i stedet for "= Nothing" i vb.net min fejl :o)

Så var der det med selve .xml hvis nu jeg ville have en xml fil for hvert sprog således at den danske kom til at ligne noget i denne stil :

<?xml version="1.0" standalone="yes"?>
<NewDataSet>
    <login>Login</login>
    <username>Brugernavn</username>
    <password>Adgangskode</password>
    <vld_username>Du skal udfylde feltet Brugernavn !</vld_username>
    <vld_password>Du skal udfylde feltet Adgangskode !</vld_password>
    <lostpassword>Glemt Adgangskode</lostpassword>
</NewDataSet>

Hvordan ville fremgangsmåden så være for ovenstående ?

/Websam
Avatar billede websam Nybegynder
21. april 2005 - 18:09 #6
Og hvornår er Application("LoginLanguage") nulstillet, er den det når en person forlader siden eller hvornår sker det ?

/Websam
Avatar billede burningice Nybegynder
21. april 2005 - 18:09 #7
for det første skal din xml så set sådan her ud:

<?xml version="1.0" standalone="yes"?>
<NewDataSet>
  <NewDataTable>
    <login>Login</login>
    <username>Brugernavn</username>
    <password>Adgangskode</password>
    <fill_username>Du skal udfylde feltet Brugernavn !</fill_username>
    <fill_password>Du skal udfylde feltet Adgangskode !</fill_password>
  </NewDataTable>
</NewDataSet>

der skal være mindst en tabel i xml'en, ellers er den ikke valid. Dernæst skal din metode ændres lidt så den er sådan her

Public Function GetLocalizedString(ByVal type As String) As String
    Dim ses As String = CType(Session("setLanguage"), String)
 
    If Application("LoginLanguage"+ ses) Is Nothing Then
        Dim ds As DataSet = New DataSet()
        ds.ReadXml(Server.MapPath("../Xml/"+ ses "+.xml"))
        Application("LoginLanguage"+ ses) = ds
    End If

    Return CType(Application("LoginLanguage"+ ses), DataSet).Tables(0).Rows(0)(type).ToString()
End Function

så burde det gå an
Avatar billede burningice Nybegynder
21. april 2005 - 18:10 #8
application bliver først nulstillet når din application lukker ned. Det er forskelligt hvordan det er indstillet på serveren, men typisk er en times inaktivitet (3600 sekunder)
Avatar billede websam Nybegynder
21. april 2005 - 18:17 #9
Ok det ser cool ud, Takker.

Indstilling af application "timeout" er det så noget der instilles under iis'en eller hvor foregår det ?

/Websam
Avatar billede burningice Nybegynder
21. april 2005 - 18:23 #10
ja.. det er under Application Pools > Din Application Pool > Din Application
Avatar billede burningice Nybegynder
21. april 2005 - 18:24 #11
dog vil jeg mene, at jo længere den kører, desto bedre... hvis serveren ikke mangler hukommelse, så kan den lige så godt få lov at køre indtil serveren selv skal genstartes
Avatar billede websam Nybegynder
21. april 2005 - 18:26 #12
det kan jeg ikke umiddelbart finde, jeg køre med iis 5 win 2000 server ?
Avatar billede websam Nybegynder
21. april 2005 - 19:31 #13
Det kan jeg oxo kigge på senere. Hvis jeg så har forstået det hele rigtigt så :

1. Hvis jeg har 2 applicationer der bruger denne language function så ligger den der 2 gange, en gang for hver app.

2. Vil Application("LoginLangauge") automatisk ændre sig hvis .xml fil opdateres ?

3. Jeg læste lidt på cache og dette beskrives flere steder til at være den bedste løsning også i forhold til application variabler, dog ser jeg stadig ovenstående som en fin ide da det jo er det samme der hentes hver gang.

/Websam
Avatar billede burningice Nybegynder
21. april 2005 - 20:53 #14
ah.. iis 5.. ja, så ved jeg ikke lige hvordan det sættes. iis5 og iis6 er noget anderledes i deres opbygning.

1) ja... forskellige applikationer deler ikke den samme application-variabel i hukommelsen. De får tildelt en hver
2) Nej, desværre... det er dog ikke så svært at lave hvis du har brug for det :) jeg kan godt komme med et eksempel hvis det skal være

3) Du lægger jo ord i munden på mig ;) Det er rigtigt at Cache har nogle lidt mere avancerede funktioner såsom f.eks. at overvåge om en fil bliver ændret, plus man kan selv bestemme hvor længe en bestemt variabel skal ligge i hukommelsen før den automatisk bliver slettet.

Så, hvis du har brug for 2), så skal vi have gang i Cache istedet for Application :)
Avatar billede websam Nybegynder
21. april 2005 - 22:05 #15
Det ville være en fordel at det var cache da jeg med tiden får behov for at ændre i xml filen fra tid til anden så hvis ikke der er så meget i det må du gerne komme med et eksempel der kan køre på ovenstående :o)

/Websam
Avatar billede burningice Nybegynder
21. april 2005 - 22:22 #16
der er et fint eksempel her der faktisk viser næsten 100% det du har brug for, endda i VB.Net, det er ikke så tit artikler er skrevet i det:)

http://www.devx.com/asp/Article/21751/0/page/2

så din kode vil nok blive til

Public Function GetLocalizedString(ByVal type As String) As String
    Dim ses As String = CType(Session("setLanguage"), String)

    If Cache("LoginLanguage"+ ses) Is Nothing Then
        Dim ds As DataSet = New DataSet()
        ds.ReadXml(Server.MapPath("../Xml/"+ ses "+.xml"))
       
        Dim depends As New _
          System.Web.Caching.CacheDependency _
          (Server.MapPath("../Xml/"+ ses "+.xml"))

        Cache.Insert("LoginLanguage"+ ses, ds, depends)
    End If

    Return CType(Cache("LoginLanguage"+ ses), DataSet).Tables(0).Rows(0)(type).ToString()
End Function
Avatar billede websam Nybegynder
21. april 2005 - 22:46 #17
Cool det virker sørme også :o), men hvis jeg nu lader min function køre på en aspx side hvorpå der er "inkluderet" en ascx fil der indeholder en label med <%# GetLocalizedString("username") %> får jeg følgende fejl :

Name 'GetLocalizedString' is not declared

Og det er så på linien med :

<%# GetLocalizedString("username") %>

Skyldes det at pagelode på selve aspx siden loades før eller skal det ligge på selve ascx siden for at virke ?

/Websam
Avatar billede burningice Nybegynder
22. april 2005 - 00:06 #18
nej, problemet er at funktionen GetLocalizedString ikke findes i den klasse din ascx-side består af.

Så, enten kan du lægge funktionen på selve ascx-siden, eller også kan du lave det ekstra smart og lave en såkalt Util, eller Helper-class til denne funktion.

Eks.

public class Util {
  public static string GetLocalizedString(string type) {
      // Do what u have to do
  }
}

Overalt hvor du har lyst kan du nu skrive f.eks.

Util.GetLocalizedString("username"), og funktionen behøber ikke at være inkluderet nogen specielle steder.

Ved godt min psuodo-kode er C#, men du skal ikke have det alt for nemt :P (Hint, static i vb.net hedder Shared)
Avatar billede websam Nybegynder
22. april 2005 - 00:24 #19
Jeg har jo siddet og rodet lidt med det og kom frem til følgende :

Public Class Util
    Public Shared Function GetLocalizedString(ByVal type As String) As String
        Dim ses As String = CType(HttpContext.Current.Session("setLanguage"), String)
        If HttpContext.Current.Cache("LoginLanguage") Is Nothing Then
            Dim ds As DataSet = New DataSet
            ds.ReadXml(HttpContext.Current.Server.MapPath("../Xml/login.xml"))
            Dim depends As New System.Web.Caching.CacheDependency(HttpContext.Current.Server.MapPath("../Xml/login.xml"))

            HttpContext.Current.Cache.Insert("LoginLanguage", ds, depends)
        End If

        Return CType(HttpContext.Current.Cache("LoginLanguage"), DataSet).Tables(ses).Rows(0)(type).ToString()
    End Function
End Class

Dette er nu gemt i en fil ved navnet Util.vb som er en Class fil. Jeg har så sat Util foran min GetLocalizedString("username") og diverse andre og får denne fejl :

'GetLocalizedString' is not a member of 'Util'.

I linie :

Util.GetLocalizedString("username")

Jeg har DataBind() i PageLoad og Imports xxxxxxxxx.Util i toppen af min side !?!

/Websam
Avatar billede burningice Nybegynder
22. april 2005 - 00:30 #20
hmm... det var mærkeligt... den står jo lige der :P

hvad så hvis du fjerner Shared fra GetLocalizedString og kalder funktionen sådan her. Jeg ved godt det ikke er en smart løsning, men det er bare lige for at teste:

Dim util As Util = New Util()
util.GetLocalizedString("username")

kan du det, eller brokker den sig også over det?
Avatar billede websam Nybegynder
22. april 2005 - 00:32 #21
Og hvor vil du have "Dim util As Util = New Util()" til at stå henne ?

/Websam
Avatar billede websam Nybegynder
22. april 2005 - 01:48 #22
Nu har jeg prøvet at sætte den i toppen min klasse og i PageLoad på aspx og ascx siden og det giver samme fejl :

'GetLocalizedString' is not a member of 'Util'

Så det gav ingen forskel !

/Websam
Avatar billede burningice Nybegynder
22. april 2005 - 08:29 #23
må jeg prøve at se hele din source-kode for den ascx-side du prøver at bruge GetLocalizedString. Det er højst sandsynligt bare en lille dum ting.
Avatar billede websam Nybegynder
22. april 2005 - 09:04 #24
Det må du da gerne det kommer her :

#################################################

Imports try2try.LoginBiz
Imports try2try.Util

Public Class Login
    Inherits System.Web.UI.UserControl

#Region " Web Form Designer Generated Code "

    'This call is required by the Web Form Designer.
    <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()

    End Sub
    Protected WithEvents vld_Password As System.Web.UI.WebControls.RequiredFieldValidator
    Protected WithEvents lbl_Username As System.Web.UI.WebControls.Label
    Protected WithEvents txt_Username As System.Web.UI.WebControls.TextBox
    Protected WithEvents vld_Username As System.Web.UI.WebControls.RequiredFieldValidator
    Protected WithEvents lbl_Password As System.Web.UI.WebControls.Label
    Protected WithEvents txt_Password As System.Web.UI.WebControls.TextBox
    Protected WithEvents Label1 As System.Web.UI.WebControls.Label
    Protected WithEvents btn_Login As System.Web.UI.WebControls.LinkButton
    Protected WithEvents btn_LostPassword As System.Web.UI.WebControls.LinkButton

    'NOTE: The following placeholder declaration is required by the Web Form Designer.
    'Do not delete or move it.
    Private designerPlaceholderDeclaration As System.Object

    Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init
        'CODEGEN: This method call is required by the Web Form Designer
        'Do not modify it using the code editor.
        InitializeComponent()
    End Sub

#End Region

    Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Label1.Text = Session("Test")
        DataBind()
    End Sub

    Private Sub btn_Login_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_Login.Click
        If Page.IsValid Then
            If CheckLogin(txt_Username.Text, cls_Function.GenerateHash(txt_Password.Text)) Then
                Session("test") = "Du er nu logget ind :o) - " & Session("UserId")
            Else
                Session("test") = "Du blev IKKE logget ind :o( - " & Session("UserId")
            End If
            Response.Redirect("Default.aspx")
        End If
    End Sub

    Private Sub btn_LostPassword_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_LostPassword.Click
        Response.Redirect("?m=lostpassword")
    End Sub
End Class

##############################################################
Og fra selve design view :
##############################################################

<%@ Control Language="vb" AutoEventWireup="false" Codebehind="Login.ascx.vb" Inherits="try2try.Login" TargetSchema="http://schemas.microsoft.com/intellisense/ie5" %>
<P><asp:label id="lbl_Username" runat="server" Text='<%# GetLocalizedString("username") %>'></asp:label><BR>
    <asp:textbox id="txt_Username" runat="server" CssClass="textbox"></asp:textbox><asp:requiredfieldvalidator id=vld_Username runat="server" ErrorMessage='<%# GetLocalizedString("vld_username") %>' ControlToValidate="txt_Username">
    </asp:requiredfieldvalidator><BR>
    <BR>
    <asp:label id="lbl_Password" runat="server" Text='<%# GetLocalizedString("password") %>'></asp:label><BR>
    <asp:textbox id="txt_Password" runat="server" TextMode="Password" CssClass="textbox"></asp:textbox><asp:requiredfieldvalidator id=vld_Password runat="server" ErrorMessage='<%# GetLocalizedString("vld_password")%>' ControlToValidate="txt_Password">
    </asp:requiredfieldvalidator><BR>
    <BR>
    <asp:linkbutton id=btn_Login runat="server" Text='<%# GetLocalizedString("login")%>'>
    </asp:linkbutton>&nbsp;|
    <asp:linkbutton id=btn_LostPassword runat="server" Text='<%# GetLocalizedString("lostpassword")%>' CausesValidation="False">
    </asp:linkbutton></P>
<P><asp:label id="Label1" runat="server"></asp:label></P>

Så har du lidt at kigge på :o)
Avatar billede websam Nybegynder
22. april 2005 - 09:11 #25
og Util. skal stå foran alle GetLocalizedString, men det var fordi jeg lige havde funktionen stående på siden :o)

/Websam
Avatar billede websam Nybegynder
22. april 2005 - 09:21 #26
Og det virker jo helt hen i vejret at det ikke virker for mine buisness og datalag er lavet på samme måde som class filer og de brokker sig ikke over det !

/Websam
Avatar billede websam Nybegynder
22. april 2005 - 12:16 #27
Har du givet op på det :o) Jeg har prøvet snart alle muligheder og kommer hele tiden frem til at det kun virker med funktionen på den side hvor det skal bruges :o)

/Websam
Avatar billede burningice Nybegynder
22. april 2005 - 15:33 #28
hehe.. nej, jeg har skam ikke givet op... har bare været ude og nyde det dejlige vejr :)

Det første jeg ville skyde på var at den ikke kendte til din Util-klasse, men det ser ikke ud til at være fejlen, for så ville fejlbeskeden være en anden.

Jeg studsede dog lige over at du har skrevet

Imports try2try.Util

Så du har et Namespace der hedder Util ? Ligger Util-klassen så i dette namespace, så den alt i alt hedder try2try.Util.Util ?? I så fald, prøv så at kalde funktionen på denne måde:

try2try.Util.Util.GetLocalizedString()
Avatar billede websam Nybegynder
22. april 2005 - 15:42 #29
Mit projekt hedder try2try og min klasse hedder Util.vb og alle andre klasser jeg har kaldes med Imports try2try.minclass så jeg kan ikke se det skulle hjælpe.

Jeg har dog i mellemtiden flyttet mine lable.text, button.text og så videre ned i min pageload på siden og så virker det fint med kald fra klassen, jeg har dog nogle problemer med custom validering som du måske kan svare på i et andet spm. jeg har oprettet.

Med custom validering kan jeg så også smide errormessage i codebehind for siden og så er jeg på rette vej med at få det Util.vb "shit" til ta virke :o)

/Websam
Avatar billede websam Nybegynder
22. april 2005 - 15:57 #30
smid et svar :o)
Avatar billede burningice Nybegynder
22. april 2005 - 16:19 #31
hvad så med din ascx-side.. har du lavet nogle imports på den?
Avatar billede websam Nybegynder
22. april 2005 - 16:26 #32
Jeg har 2 valgmuligheder og for begge er gældende at det skal ske på de sider hvor Util skal bruges :

1. Skrive Imports xxxxx.util og så kalde med GetLocalizedString("username")

2. Undlade Imports xxxxx.util og så kalde med Util.GetLocalizedString("username")

Men det er jo ikke anderledes fra System.Data.SqlClient hvis jeg ikke importere den skal jeg jo oxo skrive hele stien.
Avatar billede burningice Nybegynder
22. april 2005 - 16:59 #33
hm... oh well... det er nok bare mig der ikke kan gøre mig klog på vb.net. i c# kan man kun importere namespaces, ikke hele klasser.
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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