05. juli 2004 - 17:33Der er
132 kommentarer og 1 løsning
Mousedown i webapplikation
Hvordan kalder man metoden "mousedown" i en webaplikation? Når mousedown'en kaldes, så skal der sættes en linie ind i en database på serveren. Dette sker gennem en instans af en klasse, som oprettes i aspx-filen. Mousedown'en er så en metode i codebehindfilen til den aktuelle aspxfil...?
I dette særtema om aspekter af AI ser vi på skiftet fra sprogmodeller til AI-agenter, og hvordan virksomheder kan navigere i spændet mellem teknologisk hastighed og behovet for menneskelig kontrol.
Hej - lige et par spørgsmål. Hvad er det folk skal kunne trykke på med musen ? Og.. hvilket udviklingsmiljø bruger du ? (det sidste er bare for at høre hvad du eventuelt kan få foræret af miljøet)
Folk trykker på et link. Bl.a. dette links navn skal så gemmes i databasen. Jeg prøgramerer i C# i Visual Studio. Selve aspx-filen er skrevet i VB-script. Men derfor kan jeg vel godt programere codebehindfilen i C#?
Hvis du i visual studio trækker en LinkButton (ligger under Web Forms i toolboxen) ind på din form og dobbeltklikker på den, så genererer visual studio en handler til det event i koden, og sørger for at knappen kalder den handler hvis der klikkes på den. Du vil så kunne se dels i din aspx-fil, og dels i din codebehind, hvordan man vanligvis implementerer den slags. Du kan stadig lave en onmousedown="<whatever>" clientside, men hvis du i handleren vil skrive til dabaser mv. vil jeg nok anbefale at du gør det serverside.
Ja, jeg foretrækker nok også, at et foregår serverside. Men clientside er vel også i orden...man kan vel bare løse det med komplette URL'er (hele stien/URL'en til databasen). Hvordan skal hele metodehoveet (minus implementeringen) skrives til en inmousedown?
Hvis jeg benytter LinkButton, så skal jeg skrive noget kode ve hvert link. Og linkkoden er jo skrevet i VBscript...så den går vist ikke rigtigt. Desuden vil det vel være næmere at lave en mousedownhandler, da jeg så kun skal skrive 1 metode til at klare alle mulighederne. Jeg har fundet 1 mulighed:
Jeg kan bare ikke få denne løsnng til at fungere. Jeg skal vist nedarve fra en klasse. Men hvilken klasse er dette, og hvordan skal jeg helt nøjagtig gøre det?
<%@ Page Language="VB" Debug="True" %> <%@ Import Namespace="System.IO" %> <%@ Import Namespace="System.Math" %> <SCRIPT language="VB" runat="server"> Private lsTitle as String Public Sub Page_Load(obj as object, e as eventargs) lsTitle = Request("title") If lsTitle = "" Then lsTitle = "Ftp browser" End Sub Public Sub RptErr(psMessage) Response.Write("<DIV align=""left"" width=""100%""><B>Script Reported Error</B><BR>Message: " & psMessage & "</DIV><BR>") End Sub </SCRIPT> <HTML><HEAD><TITLE><%=lsTitle%></TITLE> <STYLE> BODY{font-family:tahoma;font-size:9pt;} TABLE{border-collapse:collapse;border:1px inset #606060;} TD{border:1px solid #606060;font-family:tahoma;font-size:9pt;} H1{margin-bottom:1px;font-family:vendara,tahoma;font-size:12pt;color:#202020;} A{font-family:tahoma;font-size:9pt;color:#3C6B96;} .tdDir{border:0px;font-family:tahoma;font-size:9pt;color:#202020;background-color:#EFEFEF;} .tdFile{border:0px;font-family:tahoma;font-size:9pt;color:#202020;background-color:#FAFAFA;} .tdhead{border:0px;font-family:tahoma;font-size:9pt;color:#ffffff;background-color:#3C6B96;} .tdheadA{border:0px;font-family:tahoma;font-size:9pt;color:#eeeeee;background-color:#3C6B96;} </STYLE> </HEAD><BODY bgcolor="#e7e7ef"> <% Try Dim sScriptName as String, i as Long, sSubDir as String, j as Integer Dim sPrevLink as String, iLen as Double, sLen as String Dim sLink as String = Request("link")
Response.Write("<CENTER><H1>" & lsTitle & "</H1>") If sLink <> "" Then Response.Write("<A href=""" & sLink & """>[ Return ]</A><BR>") End If
sSubDir = Replace(Request("path"),"\","/") If Left$(sSubDir,1) <> "/" Then sSubDir = "/" & sSubDir If Right$(sSubDir,1) <> "/" Then sSubDir = sSubDir & "/"
sScriptName = LCase(Request.ServerVariables("SCRIPT_NAME")) j = InStrRev(sScriptName,"/") If j > 0 Then sScriptName = Right$(sScriptName,Len(sScriptName)-j)
If sSubDir = "/" Then sPrevLink = sPrevLink & "/root/" Else sPrevLink = sPrevLink & "/<A class=""tdheadA"" href=""" & sScriptName & "?path=&title=" & lsTitle & "&link=" & sLink & """>root</a>/" End If j = 1 Do i = InStr(j + 1,sSubDir,"/") If i < 1 Then Exit Do If i = Len(sSubDir) Then sPrevLink = sPrevLink & Mid$(sSubDir, j+1, (i-j)-1) & "/" Else sPrevLink = sPrevLink & "<A class=""tdheadA"" href=""" & sScriptName & "?path=" & Trim(Mid$(sSubDir, 1, i-1)) & "&title=" & lsTitle & "&link=" & sLink & """>" & Mid$(sSubDir, j+1, (i-j)-1) & "</a>/" End If j = i Loop
Dim oDirInfo As New DirectoryInfo(Server.MapPath("") & Replace(sSubDir,"/","\")) Dim oFiles As FileInfo() = oDirInfo.GetFiles() Dim oDirs As DirectoryInfo() = oDirInfo.GetDirectories() Dim oDir As DirectoryInfo, oFile As FileInfo
For Each oFile In oFiles If Not (LCase(oFile.Name) = sScriptName and sSubDir = "/") Then iLen = oFile.Length If iLen >= 1048960 Then sLen = Round(iLen / 1048960,2) & " mb" Else sLen = Round(iLen / 1024,2) & " kb" End If Response.Write("<tr><td class=""tdFile""><a href=""" & Right$(sSubDir,Len(sSubDir)-1) & oFile.Name & """>" & oFile.Name & "</a></td><td class=""tdFile"">File</td><td class=""tdFile"" align=""right"">" & oFile.LastWriteTime & "</td><td class=""tdFile"" align=""right"">" & sLen & " </td></tr>") End If Next oFile
Response.Write("</tbody></table></center><br>") Catch ex as Exception RptErr(ex.Message) End Try
%> </BODY></HTML>
using System; using System.Collections; using System.ComponentModel; using System.Data; using System.Drawing; using System.Web; using System.Web.SessionState; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.HtmlControls; using New;
namespace New { /// <summary> /// Summary description for Browse. /// </summary> public class Browse : System.Web.UI.Page { public New.DatabaseFtpManagement a;
private void Page_Load(object sender, System.EventArgs e) { // Put user code to initialize the page here }
#region Web Form Designer generated code override protected void OnInit(EventArgs e) { // // CODEGEN: This call is required by the ASP.NET Web Form Designer. // InitializeComponent(); base.OnInit(e); }
/// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { this.Load += new System.EventHandler(this.Page_Load); } #endregion } }
Hmmm.... Det ser lidt specielt ud det du har lavet. Umiddelbart er det en vanlig asp-side, og en uafhængig C#-fil, som det ikke burde kunne lade sig gøre at kompilere. Dels er der ingen metode på System.Web.Ui.Page der hedder OnMouseDown, og MouseEventArgs er vist defineret i System.Windows.Forms, som ikke er refereret.
Er der nogen speciel årsag til at du laver dine sider i ASP, og ikke i ASP.NET ?
Hvis du er interesseret kan jeg godt lave et lille eksempel på hvordan det kunne se ud i .NET, og jeg vil gerne kigge på det her lidt senere i aften, hvis det skulle være.
Filen hedder "aspx" som endelse...så kan det godt være en almindelig asp-fil og ikke en asp.net? Grunden til at den er i det sprog er, at det er en fil, som jeg har fundet på nettet. Den tilhørende aspc.cs-fil har jeg så selv lavet. Jeg ved ikke om det fungerer...jeg tvivler næsten på det, da filerne er placeret i andre bibliotekker en projektbibliotekket.
Tak for tilbuddet om .net-udgaven. Hvis funktionalitetten er den samme, så vil jeg da gerne have løsningen i .net-udgaven. Men p.t. er problemet bare mousedown-funktionen. Så hvis den eneste løsning på det problem er en .net-fil - then be it! ;-)
using System; using System.IO; using System.Collections; using System.ComponentModel; using System.Data; using System.Drawing; using System.Web; using System.Web.SessionState; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.HtmlControls;
namespace cogitans { public class DirectoryBrowser : System.Web.UI.Page { protected Table tblFileView;
// metode til at smide rækkerne ind i tabellen public void AddDirectoryView(string path) { // først indsættes rækker for alle direktories i path string[] items = Directory.GetDirectories(path); foreach (string s in items) { AddItem(new DirectoryInfo(s)); }
// derefter rækker for alle filer items = Directory.GetFiles(path); foreach (string s in items) { AddItem(new FileInfo(s)); } }
// metode til at smide en enkelt række ind i tabellen private void AddItem(FileSystemInfo itemInfo) { tblFileView.Rows.Add(CreateItemRow(itemInfo)); }
// metode til at danne en række private TableRow CreateItemRow(FileSystemInfo itemInfo) { TableRow tr = new TableRow();
// lidt farveværk if(itemInfo is DirectoryInfo) tr.BackColor = Color.LightBlue;
// en linkbutton så man kan klikke på fil/dir navnet LinkButton lbtn = new LinkButton(); lbtn.Click += new EventHandler(lbtn_Click); lbtn.Text = itemInfo.Name; lbtn.CommandArgument = itemInfo.FullName; lbtn.Style.Add("text-decoration","none");
// ind med knappen tr.Cells.Add(CreateItemCell(lbtn));
// ind med en ekstra oplysning tr.Cells.Add(CreateItemCell(new LiteralControl(itemInfo.CreationTime.ToString())));
return tr; }
// metode til at danne en enekelt celle private TableCell CreateItemCell(Control content) { TableCell tc = new TableCell(); tc.Controls.Add(content); return tc; }
// håndtering af click-event fra knappen - CommandArgument skulle så gerne indeholde den fulde sti private void lbtn_Click(object sender, EventArgs e) { string selectedPath = ((LinkButton)sender).CommandArgument; }
Den slags kan laves på 100 forskellige måder... Men nu har du i hvert fald en lille blanding af en serverkontrol (tabellen), og lidt dynamisk opbygning af en tabel i kode + lidt eventhåndtering.
I aspxfilen: skal der står 'Inherits="cogitans.DirectoryBrowser" '? Ahh...'cogitans' er namespacet eller hva? Skal der ligge en aspx- og cs-fil i hvert aktuelt bibliotek for at det fungerer? Jeg har på fornemmelsen, at man ikke skal kalde filerne med noget argument, men at argumentet automatisk bliver stien hvortil filen ligger?
Ja - det er namespacet. Der skal ikke nødvendigvis ligge begge dele, men når du opretter en ny form i visual studio får du det automatisk (faktisk får du tre). Jeg fårstår ikke helt hvad du mener med det sidste... Det med at kalde filer med eller uden argument.
Med argument mener jeg: " private void Page_Load(object sender, System.EventArgs e) { AddDirectoryView(Request.PhysicalApplicationPath); } " argumentet er så: "Request.PhysicalApplicationPath" ? Det er en bug i mit Visual Studio. Når jeg tilføjer en ny form går hele programet ned. Men jeg kan komme om ved problemet ved at kopiere en aspx-fil fra projektet ind i samme projekt og så omdøbe lidt. Så jeg får ikke nogle valgmuligheder...faktisk er jeg ikke helt med på, hvad det er for nogle valgmuligheder, du snakker om?
Tjo, det ser skam godt ud. Men der mangler bare noget funktionalittet: -Når man klikker på en fil, så får man ikke muligheden for at downloade den - det var jo meningen. -Når man klkker på et bibliotek, så ryger man ikke ind i det aktuelle bibliotek, og får en ny liste over indholdet i det aktuelle bibliotek. Ved du hvordan man konstruerer disse funktionalitetter?
Men man kan stadig ikke gå et trin videre ind gennem en mappe. Jeg har forsøgt med:
private void lbtn_Click(object sender, EventArgs e) { string selectedPath = ((LinkButton)sender).CommandArgument; if (selectedPath=selectedPath.GetType){ //send et bibliotek videre ind i path
} Response.Redirect(selectedPath); }
men jeg mangler en metode, hvorpå der checkes om stien peger på en fil eller et bibliotek. Hvis den peger på et bibliotek, så kan man vel bare fyre stien/argumentet op i Page_Load hvor Request'en så bliver lig med stien/argumentet? Men jeg mangler lige en metode, hvorpå det kan gøres...?
Hvis du bruger min kode kan du når du opretter din linkbutton angive : lbtn.CommandName = itemInfo.GetType().Name;
Og du kan så spørge på det i hanlderen: ((LinkButton)sender).CommandName == "DirectoryInfo"; // dir ((LinkButton)sender).CommandName == "FileInfo"; // Fil
Du få lige led mere senere... Jeg er på vej ud af døren.
Nå... men du kan gemme information om dit nuværende dir hvor du skulle have lyst. Det kunne være i session eller viewstate - eller du kunne angive den i din Querystring.
Du kan lave en enkelt adgang til en sessionvariabel som følger :
// her returneres så startdiret fra før, hvis variablen ikke tidligere er sat protected string CurrentPath { get{return (object)Session["CurrentPath"] != null ? (string)Session["CurrentPath"] : Request.PhysicalApplicationPath;} set{Session["CurrentPath"] = value;} }
Okay - "CurrentPath" returnerer stien til det foregående bibliotek eller hva? Jeg er lidt i tvivl om koden...hvorfor er der en set-kommando i en metode, som skal returnere en string? Ah...det må være fordi, at "CurrentPath"-variablen skal opdateres efterfølgende ?
hmm...jeg har ikke lige set lyset endnu mht hvor i koden selve CurrentPath "mister" et led....altså går et bibliotek tlbage? For hvis jeg kunne se det, så havde jeg sikkert også svaret på dette spørgsmål: hvordan opdaterer man så CurrentPath, når brugeren går et skrdt dybere ned i bibliotekshierakiet?
// for den første i getteren kunne du lave sådan en her : if((object)Session["CurrentPath"] == null) { Session["CurrentPath"] = Request.PhysicalApplicationPath; } return (string)Session["CurrentPath"];
// og for den anden getter kunne du nøjes med denn lave denne : return (string)Session["CurrentPath"];
Ahh - okay. Så ':'-tegnet betyder '=' i 1-linieudgaven af if-else-sætninger (?). Men i den anden/sidste bliver Sesson["CurrentPath"] da sat til value. Det må da betyde, at det du skrev ('return (string)Session["CurrentPath"];') er forkert, og der i stedet skal stå ' if((object)Session["CurrentPath"] != null) { Session["CurrentPath"] = null; } return (string)Session["CurrentPath"]; '
Desuden står der i den korte udgave "!=null". Altså bliver statementet opfyldt, hvis det ikke er lig med. Men i din sidste forklaring har du skrevet "==null". Er det dig, som har overset, at det netop ikke skulle være lig med null, eller er det mig, som har misforstået syntax'en?
Står der i klar tekst : "Hvis det ikke er null, så sæt det til null", hvilket jo så betyder at du aldrig vil få returneret andet end null.
Hvis du tager den jeg skrev : if((object)Session["CurrentPath"] == null) { Session["CurrentPath"] = Request.PhysicalApplicationPath; } return (string)Session["CurrentPath"];
Bliver det til : "Hvis det er null, så sæt det til stien til programmet".
En property fungerer på den måde (hvis der altså både er angivet en getter og en setter), at du i kode kan skrive : string test = CurrentPath; Køres getteren for CurrentPath.
Skriver du istedet: CurrentPath = "test"; Kaldes setteren for CurrentPath.
Du skal ikke læse det som en funktion der kører fra ende til anden hver gang den kaldes.
Jo, selvfølgelig da. Nu er der jo også ret mange ændringer efterhånen:
using System; using System.IO; using System.Collections; using System.ComponentModel; using System.Data; using System.Drawing; using System.Web; using System.Web.SessionState; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.HtmlControls; using New;
namespace New { /// <summary> /// Summary description for WebForm1. /// </summary> public class Ekspertentest : System.Web.UI.Page { protected System.Web.UI.WebControls.Table tblFileView;
// metode til at smide rækkerne ind i tabellen public void AddDirectoryView(string path) { // først indsættes rækker for alle direktories i path string[] items = Directory.GetDirectories(path); foreach (string s in items) { AddItem(new DirectoryInfo(s)); }
// derefter rækker for alle filer items = Directory.GetFiles(path); foreach (string s in items) { AddItem(new FileInfo(s)); } }
// metode til at smide en enkelt række ind i tabellen private void AddItem(FileSystemInfo itemInfo) { tblFileView.Rows.Add(CreateItemRow(itemInfo)); }
// metode til at danne en række private TableRow CreateItemRow(FileSystemInfo itemInfo) { TableRow tr = new TableRow();
// lidt farveværk if(itemInfo is DirectoryInfo) tr.BackColor = Color.LightBlue;
// en linkbutton så man kan klikke på fil/dir navnet LinkButton lbtn = new LinkButton(); lbtn.Click += new EventHandler(lbtn_Click); lbtn.Text = itemInfo.Name; lbtn.CommandArgument = itemInfo.FullName; lbtn.Style.Add("text-decoration","none");
// ind med knappen tr.Cells.Add(CreateItemCell(lbtn));
// ind med en ekstra oplysning tr.Cells.Add(CreateItemCell(new LiteralControl(itemInfo.CreationTime.ToString())));
return tr; }
// metode til at danne en enekelt celle private TableCell CreateItemCell(Control content) { TableCell tc = new TableCell(); tc.Controls.Add(content); return tc; }
// håndtering af click-event fra knappen - CommandArgument skulle så gerne indeholde den fulde sti private void lbtn_Click(object sender, EventArgs e) { string selectedPath = ((LinkButton)sender).CommandArgument; if (((LinkButton)sender).CommandName == "DirectoryInfo"){ //send et bibliotek videre ind i path //Directory.GetDirectories; CurrentPath=selectedPath; this.Page_Load(); } //ellers må det være en fil if(((LinkButton)sender).CommandName == "FileInfo"){ Response.Redirect(selectedPath); } // Fil if(((LinkButton)sender).CommandName == "..") { int length=CurrentPath.Length+1; int index=CurrentPath.LastIndexOf("/");//returnerer index for slash string temp=CurrentPath.Remove(index, (length-index)); CurrentPath=temp; this.Page_Load(); } }
// her returneres så startdiret fra før, hvis variablen ikke tidligere er sat //=her gåes et skridt tilbage protected string CurrentStartPath { get{return (object)Session["CurrentPath"] != null ? (string)Session["CurrentPath"] : Request.PhysicalApplicationPath;} set{Session["CurrentPath"] = value;} }
protected string CurrentPath { get{return (object)Session["CurrentPath"] != null ? (string)Session["CurrentPath"] : null;} set{Session["CurrentPath"] = value;} } #region Web Form Designer generated code override protected void OnInit(EventArgs e) { // // CODEGEN: This call is required by the ASP.NET Web Form Designer. // InitializeComponent(); base.OnInit(e); }
/// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { this.Load += new System.EventHandler(this.Page_Load);
Ja, nu hjalp det på det - det var dejligt. Men nu er der jo så bare 2 nye spørgsmål:
1: Er det ikke muligt, at lave en lille "menu" hvis man trykker på et link med højre museknap, så man får mulighed for at gemme hele bibliotekket, istedet for at man går et trin videre ne i biblioteksstrukturen?
2: Når man så er gået et trin videre ned i biblioteksstrukturen, og man gerne vil 1 trin tilbage (eller flere trin), så har man tilsyneladende ikke mulghed for det. Og hvis man bare loader hele dukumentet ind igen, så husker den stadig hvor man var henne ad, og viser selvfølgelig det samme biblioteks indhold?
He he - jo, det har du så sandelig ret i. Jeg er blot overordentlig glad for, at jeg endelig kan få svar på mne spørgsmål her (af dig ;-) ). Det er nemlig efterhånden ret lang tid siden, at jeg oprettede adskillige andre spørgsmål, som alle handlede om mit problem her. Men der var ingen personer, som kunne hjælpe mig. Det er derfor, at jeg nyder din hjælp. Og nu er hele mit oprindelige spørgsmål også snart blevet besvaret til UG. Men jeg mangler jo som sagt bare lige at finde ud af de 2 sidste delspørgsmål. Men hvis du gerne vil have flere point for din uvurderlige hjælp, så vil jeg hellere end gerne give dig flere som tak for hjælpen...?
Hehe - bare jeg holder mig i top 8000 så er det mere end rigeligt... Det er ikke lige pointene jeg er her for :o) Jeg kigger på dine nye spørgsmål her lidt senere - jeg har gæster.
Mht. 1-eren : Den er ikke så ligetil. Hvis du skal downlaode hele foldere skal du nok lave en rigtig ftp-klient - istedet for browserløsningen. Men Internet Explorer (og sikkert også andre browsere) fungere ok som ftp-klient(er). Med IE får du et helt almindeligt explorerview (ligesom når du klikker rundt i din foldere lokalt). Begge dele kræver at du sætter en ftp-server op... Hvis du har et webhotel et eller andet sted ude i byen, har du sikkert ftp-adgang under alle omstændigheder. Højrekliksmenuer vil du typisk lave clientside, og der er masser af eksempler rundt omkring... (søg på noget med context menu, browser, javascript og den slags).
2-eren er det bedre med :o) hvis du laver lidt om på AddDirectoryView så den bliver noget i stil med :
// metode til at smide rækkerne ind i tabellen public void AddDirectoryView(string path) { // idsæt parent path som øverste link AddItem(Directory.GetParent(path));
// først indsættes rækker for alle direktories i path string[] items = Directory.GetDirectories(path); foreach (string s in items) { AddItem(new DirectoryInfo(s)); }
// derefter rækker for alle filer items = Directory.GetFiles(path); foreach (string s in items) { AddItem(new FileInfo(s)); } }
Så begynder det at ligne eller andet.
Hvis du så deruderover laver din CurrentPath-property sådan her : (sørger bare for at du starter i roden af dit C-drev)
Udvider din AddDirectoryView yderligere - til nedenstående : (sørger for at du bliver stående samme sted i filstrukturen, hvis du prøver at stikke næsen i et dir du ikke må kigge i - istedet for at fejle)
Ja, det ved jeg...men metoden "CurrentStartPath" bliver da slet ikke brugt?
Det har lært mig en masse at få hjælp af dig. Men enkelte steder i koden er jeg dog lidt i tvivl om, hvad der helt nøjagtig sker. JEg kunne vel ikke få dig til, at skrive en note-/udkommateret linie ovenover hver kodelinie, hvor du kort beskriver hvad der sker i den efterfølgende kodelinie?
Hmm - der er altså noget galt med koden. Jeg har sat:
protected string CurrentPath { get{return (object)Session["CurrentPath"] != null ? (string)Session["CurrentPath"] : @"C:\Shared";} set{Session["CurrentPath"] = value;} } Og den starter da også i et bibliotek, men jeg kan sagtens gå længere tilbage - altså ud til c-roden. Og den går jo ikke rigtig...?
Det er ikke fordi der er noget galt... Nu har du jo sådan set bare bygget en "explorer-hjemmeside".
Hvis du skal have lagt nogle restriktioner ind i programmet (ud over dem der automatisk gives af operativsystem mv.) skal du bygge det ind også, og det kan der være flere forskellige indgangsvinkler til / måder at lave på.
Nå da, jeg troede ellers, at der var noget security-haløj indbygget i C# ligesom i Java. Du skulle vel ikke vide noget om nogle restriktionsmodeller så?
Jeg bruger Xp Pro. MEn kan man egentlig ikke bare lave en if-sætning, når man går et trin tilbage i stien. Og hvis stien så bliver lig med roden af et drev, så kan stien ikke ryge det trin tilbage?
Nedenstående vil ikke kunne kompilere : parent = Directory.SetCurrentDirectory(path);
Directory.SetCurrentDirectory(...) en en void-metode (den returnerer ikke noget). Det eneste den gør er at sætte det nuværende "arbejdsdir" til det du kalder den med.
Hmm...der er et eller andet mærkeligt galt nu. Når jeg prøver at compilere hele mollevitten, så skriver den: "The namespace 'New' already contains a definition for 'FtpC'". Men jeg har ikke flere filer, af samme navn i workspacet. Skal jeg ind i en fil, og slette nogle oplysninger, som så bliver opdateret ved en ny compilering, eller skal jeg bare fysisk slette nogle filer i biblioteket? Eller hvordan skal dette problem klares?
cogitans... Kan du ikke acceptere mit svar, og begynde at oprette nogle nye spørgsmål.
Det er ikke fordi du nødvendigvis skal give point - du kan jo bare oprette dem som 0-pointere, hvis det er det der er problemet. Jeg skal nok svare alligevel.
Det virker en smulle fjollet at lade alle disse ting indgå i dette spørgsmål når man kigger på overskriften.
Det med namespaces har for øvrigt ikke noget med filer at gøre, men du får problemet hvis du f.eks. giver 2 klasser samme navn i samme namespace.
Jo, det kan du da have ret i. Det er måske lidt forvirende med alle disse delspørgsmål her. Så derfor lukkes spørgsmålet nu (dog spørger jeg dig måske senere om forklaringer på enkelte kodedele i dit eksempel), og alle pointene ryger til 'snerpet'. Mange tak for hjælpen - det var virkelig dejligt med din seriøsitet ;-)
Så fungerede det...jeg skulle åbenbart klikke på dit navn, før jeg trykkede på 'accepter'. Eksperten burde da implementere det sådan, at hvis der kun er 1 svar, så bliver det automatisk det, man vælger, når man trykker på 'accepter'...
Så har jeg kigget lidt på koden, for at forstå den også :-) Overordnet gver koden menng for mig, men der er nogle detaljer, som jeg ikke helt har styr på. Hvis jeg f.eks. vil oprette en ny kollone med filens størelse - hvordan gør jeg så det? Jeg prøvede at dote mig ind på noget med "size" gennem "fileinfo", men det gav ikke rigtig noget. Og så når jeg endelig skulle sætte selve kollonen ind på sden, så gav et også problemer. Er det noget, som du vil hjælpe mig med? ;-)
Du kan flette det ind i private TableRow CreateItemRow(FileSystemInfo itemInfo)
størrelsen af en fil kan du få ved: if(itemInfo is FileInfo) { int size = ((FileInfo)itemInfo).Length; }
Det med at sætte en ekstra celle ind kan du også gøre i den metode, men hvis du skal have flere kolonner, skal du huske også at udvide tabellen i aspx-filen. Alternativt kan du generere tabellen 100% dynamisk.
Arg - ja, selvfølgelig er "length" da det samme som "size". Hvorfor tænkte jeg ikke på det? Ændre i aspx-filen? Jeg troede egentlig, at aspx-filen blev genereret ud fra codebehindfilen? Altså at aspx-filen (=tabellen) blev genereret 100% dynamisk på nuværende tidspunkt?
Så er den gal igen.... Jeg har netop fundet ud af, at stierne til filerne ikke bliver angivet rigtigt. Når en anden bruger på netværket går ind på mn side, og klikker på et filnavn, så får brugeren at vide, at 'siden kan ikke vises'. Kan dette være fordi, at selvom aplikationen kører på serveren, så skal klienten aligevel have en URL, som når han skal have tilgang til en fil over netværket? Altså sådan at den komplette URL skal stå der med computernavn og det hele?
Jeg synes du skal sørge for at de filer du vil give lov til at folk kan downloade, ligger i en folder under dit web, og så skrive almindelige links ud til brugeren.
Er det det kode jeg har skrevet til dig du snakker om ? Hvis det er tilfældet, hvor har du så fra at den skal kunne gøre det samme - blot lettere ?
Hvis det er en anden applikation du skriver om - kan du så ikke sende et link til noget info om den. Så kan det da være at jeg kan hjælpe med hvad der skal til for at implementere den. (jeg synes du på et tidspunkt viste noget med nogle referencer til noget andet ftp-halløj).
:-) det er skam den aplikation, som du har skrevet, jeg taler om hér. Med lettere mener jeg: kræver tilsyneladende ikke så meget ram, man kan sætte andre funktionalitetter ind, man kan tage fuld kontrol over overføslerne, man kan registrere overførslerne, som man vil og man skal ikke sørge for, at alle en links hele tiden passer. Det var bare lige de argumenter, jeg kunne komme på lige nu. Men altså - skal vi ikke bare droppe den ftp-snak - den bliver aligevel ikke aktuel.
Hvis din webfolder hedder web Så kan du jo lave en folder under det der hedder filer, og så lave den her (hvis du altså er på en side der ligger i roden af dit web):
Det dér er f.eks. 1 af årsagerne til, at løsningen skal findes i en aplikation. For ikke nok med, at der langt fra er plads til filerne i den folder, så er det også utrolg upraktisk. Filerne er fordelt over 5-6 forskellige drev. Derfor ville et simpelt link være en genial løsning.
Ja det er muligt, men nu kan du altså ikke lave et filsystems-link til en fil på din maskine, med mindre du laver et link på formen :
\\<din ip>\<folder>\<filnavn>
Det indebærer så at folderene skal være delt så alle og en enhver bare kan bruge deres vanlige filsystemsbrowser til at kigge på dem, og så har du ikke meget at bruge din applikation til. (alternativt... at du opretter windows-konti til dem der må kigge).
Du kan lave virtual directories under dit root-web, og få dem til at pege på de 5-6 forskellige steder du snakker om.
Nu har jeg jo så fundet ud af at kalde det virtuelle bibliotek ordentligt. Men koden fungerer stadig ikke rigtig. Før stod der jo: protected string CurrentPath { get{return (object)Session["CurrentPath"] != null ? (string)Session["CurrentPath"] : @"D:MoviesNotBurnedYet";} set { if (value == @"D:\") Session["CurrentPath"] = @"D:MoviesNotBurnedYet"; else Session["CurrentPath"] = value; } }
men hvis jeg erstatter: "] : @"D:MoviesNotBurnedYet";} med "] : @"http://computernavn/test/";} så belastes cpu'en bare med 100%, og så loader den...og loader...og loader. Hvordan skriver man så URL'en?
Det virker skam stadigvæk ikke. Når jeg kører det nu, og jeg trykker på et link på aspx-siden, så skriver den:
Detaljer om undtagelse: System.ArgumentException: Stien til MapPath 'http://computer/Musik/abc.mp3' er ugyldig. Der forventes en virtuel sti. Og når jeg går ind i IIS, så hedder det mappede 'Musik', og inde i det bibliotek ligger abc.mp3. Så hvad kan der være galt?
Ahh... nu fik jeg lige læst din fejlmeddelelse lidt bedre. Du kan ikke lave en MapPath på noget der ikke ligger i dit web. Hvor laver du i det hele taget en MapPath når du har url-en ?
Jeg synes, at det er meget mærkeligt lige nu. Jeg har lige lavet en <A href...> udenfor al form-koden på aspx-siden. Og en fungerer fint nok. Og URL'en, den refererer til, er nøjagtig den samme, som der bliver genereret inde i formkoden i aspx-siden...
Det var fordi, at jeg ikke havde rettet koden. Der stod "Response.WriteFile(Url);", og der burde vel stå "Response.Redirect(endeligFil3);". Nu fungerer det i hvert fald på mn computer. Men hvorfor spørger den kun om man vil åbne, gemme eller annulere filen ved nogle bestemte filtyper, mens den blot direkte åbner andre?
Sådan er det bare... nogle gange for du jo muligheden for at angive at det man vælger skal være gældende fremover. Man kan styre noget omkring det ved at pille ved mimetypes på iis-en.
Du har en masse muligheder for at indstille ting og sager for iis-en. Nogle af indstillingerne har at gøre med hvad der skal angives som type i http-headers afhængig - angivet pr. fileextension. det er ikke noget jeg er særlig meget inde i.
Jeg har forsøgt, at gøre det muligt, at gå ned ad en gren i biblioteksstrukturen, for derefter at trykke på et af de opringelige links, for at gå ned ad en anden startbiblioteksstruktur. Dette var jo ikke muligt før, eftersom det siste sted bliver gemt i sessionen. Jeg prøvede så, at null-stille sessionen, når brugeren trykkede på et af start linksene. Men dette virker ikke, da on_button_click åbenbart først bliver kaldt, efter linket er aktiveret, og sessionen derfor allerede har fået en værdi. Så derfor laves der rod i hele session-tingen, hvis jeg gør det på min måde. Er der nogle andre (snepnet?), som har en god løsnng til dette problem?
Synes godt om
Ny brugerNybegynder
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.