Avatar billede simsen Mester
30. juni 2008 - 09:02 Der er 4 kommentarer og
1 løsning

Programmerings teknisk ting

Hej,

Jeg håber en eller anden kan hjælpe mig med at forstå....

Jeg har en procedure, som fungerer ganske glimrende, hvis jeg har den i codebehind filen, på den side som skal bruge den.

Nu skal jeg bruge metoden på flere forskellige filer, og går jo ind for genbrug, så jeg vil smække den ud i sin egen klasse, hvor jeg så gerne ville referere til den. Det skal siges, jeg bruger nøjagtig identiske usin direktiver på begge sider. Gør jeg dog dette, får jeg følgende fejl:

1) The name 'Server' does not exist in the current context
2) The name 'ResolveUrl' does not exist in the current context

Her ser i hvordan, jeg har forsøgt at lægge den ud i sin egen klasse:

using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.IO;

/// <summary>
/// Summary description for Images
/// </summary>
public class Images
{
    public Images()
    {
    }

    //30-06-2008 AS
    //Henter Billeder fra fysisk mappe
    public DataTable GetImagesFromFolder(string imagefolder)
    {
        DataTable datatable = new DataTable();
        datatable.Columns.Add("imgImage", typeof(string));
        datatable.Columns.Add("filename", typeof(string));
        DataRow datarow;

        //Sætter hvilke billedtyper der skal vises i gridviewet
        string strFilter = "*.jpg;*.png;*.gif";
        string[] m_arExt = strFilter.Split(';');
        foreach (string filter in m_arExt)
        {
            //Henter de forskellige billedtyper ud i et loop
            int i = 1;
            foreach (string file in Directory.GetFiles(Server.MapPath(imagefolder) + "\\", filter))
            {
                datarow = datatable.NewRow();

                datarow[0] = ResolveUrl(file);
                datarow[1] = Path.GetFileName(file);
                datatable.Rows.Add(datarow);
                i += 1;
            }
        }
        return datatable;
    }
}

Mvh
simsen :-)
Avatar billede 2c Nybegynder
30. juni 2008 - 09:11 #1
Nu sidder jeg uden en editor, men prøv at smide
HTTPContext.current. foran Server og ResolveUrl.
Altså noget i denne stil:
HTTPContext.current.Server
Avatar billede simsen Mester
30. juni 2008 - 09:16 #2
Hej 2c,

Den fejler ikke ved Server længere men den skriver, at HttpContext ikke indeholder en definition for ResolveUrl?
Avatar billede simsen Mester
30. juni 2008 - 09:29 #3
Hmmmmmm skidt pyt - jeg fandt en anden løsning på nettet angånede ResolveUrl...

public static string ResolveUrl(string originalUrl)
    {   
        if (originalUrl == null)       
            return null;   
       
        // *** Absolute path - just return   
        if (originalUrl.IndexOf("://") != -1)       
            return originalUrl;   
       
        // *** Fix up image path for ~ root app dir directory   
        if (originalUrl.StartsWith("~"))   
        {       
            string newUrl = "";       
            if (HttpContext.Current != null)           
                newUrl = HttpContext.Current.Request.ApplicationPath +                 
                    originalUrl.Substring(1).Replace("//", "/");       
            else           
                // *** Not context: assume current directory is the base directory           
                throw new ArgumentException("Invalid URL: Relative URL not allowed.");                                               
           
            // *** Just to be sure fix up any double slashes       
            return newUrl;   
        }   
       
        return originalUrl;
    }

Men forstår så ikke hvorfor det skulle være nødvendigt at skrive HTTPContext.current.Server for at få fat i Server?

Og hvorfor det er nødvendigt med den her ResolveUrl metode?

Håber du gider at forklare, så jeg også lærer noget - men ellers tak for hjælpen :-)

mvh
simsen
Avatar billede 2c Nybegynder
30. juni 2008 - 09:56 #4
Well, er ikke selv helt 100%, men her kommer et gæt. Når du laver en klasse, er det jo ikke specifikt web mere. Det vil sige, at du i teorien kan kalde den samme kode fra f.eks. en winform.

Hvis du tilgængæld ved, at koden kun skal kaldes fra web, kan du hente HTTPContext.current, og få alle informationer der er tilgænglige  når du koder websiden.
Avatar billede simsen Mester
30. juni 2008 - 10:42 #5
Jamen det er jo indlysende...... Har slet ikke selv tænkt i de baner - rigtig mange tak :-)
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