Avatar billede mosekongen Nybegynder
22. september 2002 - 11:44 Der er 12 kommentarer og
2 løsninger

Response i codebehind

Hej Eksperter

Jeg vil lave et histogram, hvor data hentes fra databasen. Det er heller ikke noget problem hvis jeg laver det hele i en aspx fil, men det tillader mit design ikke. Jeg vil min aspx fil kun have en page_Load, hvor jeg kalder default constructoren, som så står for at udføre det hele. Problemet kommer når jeg vil anvende Response.ContentType og Response.OutputStream.
Her er noget af min kode:

aspx filen.
<%@ Page Language="C#" autoeventwireup="false" codebehind="HistogramSpike.cs" Inherits="PCV.HistogramSpike" Trace="True" Debug="True" %>
<%@ Import Namespace="PCV" %>

<script runat="server">

  void Page_Load(Object sender, EventArgs e)
    {   
      HistogramSpike h = new HistogramSpike();
    }

</script>
mm.
Og den er der jo ingen ben i.

Min codebehind:
public HistogramSpike() {
            b = new Bitmap(width, height, PixelFormat.Format16bppRgb555);           
            Response.ContentType= "Image/jpeg";
            int []input= DBTilgang();
            Graphics g = Graphics.FromImage(b);           
            doState( input );//henter og forbereder data fra db.                   
            drawHistogram(XVal, YVal, max, width, height, g);//tegner histogram           
            b.Save(Response.OutputStream, ImageFormat.Jpeg);   
            b.Dispose();
        }
Klassen arver selvfølgelig fra Page, og using en hel masse.

Kører jeg dette får jeg fejlen:

Response is not available in this context.

Exception Details: System.Web.HttpException: Response is not available in this context.

Source Error:
Line 55:        #line default
Line 56:       
Line 57:        public histogram_aspx() {
Line 58:            System.Collections.ArrayList dependencies;
Line 59:            if ((ASP.histogram_aspx.__intialized == false)) {

Kan nogen hjælpe???

Jeg har desuden prøvet med noget HttpResponse, men det vil have en Object reference (Fra aspx filen går jeg ud fra), og det kan jeg ikke finde ud af.
Jeg har også prøvet at kalde metoden vha. en on_Click på en Button (on_Click lå i cs filen)og det virker mærkeligt nok, men det er ikke sådan det skal være.

Det er af stor vigtighed at jeg får dette til at virke, derfor de mange points.
Avatar billede odegaard Nybegynder
22. september 2002 - 11:56 #1
Din Page_Load bør da også være i codebehind.
Jeg forstår heller ikke helt den måde hvorpå du kalder HistrogramSpike.
Det burde være nok at skrive
    HistogramSpike();
...istedet for at oprette et HistogramSpike-objekt.
Avatar billede simon.ulsnes Nybegynder
22. september 2002 - 13:41 #2
Du kan ikke bruge Response i contructoren, fordi Response-objektet ikke er oprettet på det tidspunkt, du bliver nødt til at gøre det i Page_Load, som også, som odegaard siger, bør være i din CodeBehind-fil.

// Simon
// This sentence no verb.
Avatar billede tknudsen Nybegynder
23. september 2002 - 09:17 #3
jeg har lavet noget lignende, hvor jeg sendte Response-objektet med over i min klasse som parameter til constructoren:

public HistogramSpike(objResponse as object) {
...
objResponse.ContentType= "Image/jpeg";
b.Save(objResponse.OutputStream, ImageFormat.Jpeg);
}

void Page_Load(Object sender, EventArgs e){   
HistogramSpike h = new HistogramSpike(Response);
}


... det var godt nok i vb.net, og det virkede UDEN at type-cast den objResponse (?)
Avatar billede mosekongen Nybegynder
23. september 2002 - 13:18 #4
Undskyld det sene svar.
Nu har jeg prøvet noget af det i foreslå, og uden held.
Ang. det forslag om at lave min Page_Load i min cs fil, så lader det ikke til at jeg kommer ind i den ???????

noget af min cs fil:
public void Page_Load(Object sender, EventArgs e)
      {
            Trace.Write("Test 1");
            b = new Bitmap(width, height, PixelFormat.Format16bppRgb555);           
            Response.ContentType= "Image/jpeg";
            int []input= DBTilgang();
            Graphics g = Graphics.FromImage(b);           
            doState( input );//henter og forbereder data fra db.                   
            drawHistogram(XVal, YVal, max, width, height, g);//tegner histogram           
            b.Save(Response.OutputStream, ImageFormat.Jpeg);             
            b.Dispose();
            Trace.Write("Test 2");
      }

Hele min aspx fil:
<%@ Page Language="C#" Inherits="PCV.HistogramSpike" codebehind="HistogramSpike.cs" Trace="True" Debug="True" %>
<%@ Import Namespace="PCV" %>

<script runat="server">

</script>
<html>
<head>
</head>
<body>
    <form runat="server">       
    </form>
</body>
</html>

Er der noget galt i ovenstående?

Hvad angår tknudsen's ide, så får jeg at vide, at Object ikke indeholder en definition for ContentType og outputstream (under kompilering af min cs fil):
Koden i cs se sådan ud:
public HistogramSpike(Object obj) {
            Trace.Write("Her 2");
            b = new Bitmap(width, height, PixelFormat.Format16bppRgb555);           
            obj.ContentType= "Image/jpeg";
            int []input= DBTilgang();
            Graphics g = Graphics.FromImage(b);           
            doState( input );//henter og forbereder data fra db.                   
            drawHistogram(XVal, YVal, max, width, height, g);//tegner histogram           
            b.Save(obj.OutputStream, ImageFormat.Jpeg);   
            b.Dispose();
        }
Avatar billede mosekongen Nybegynder
23. september 2002 - 13:29 #5
Hvorfor er det egentlig, at min Page_Load bør være i min cs i stedet for min aspx???
Avatar billede tknudsen Nybegynder
23. september 2002 - 14:15 #6
i vb.net skal man fortælle hvilken event der skal hæftes på:

Page_Load(...) Handles MyBase.Load
Avatar billede tknudsen Nybegynder
23. september 2002 - 14:16 #7
Mht typecast af object til response, så kender jeg ikke den type response-objektet er en instans af !?!
Avatar billede tknudsen Nybegynder
23. september 2002 - 14:27 #8
Prøv med HttpResponse...:

public HistogramSpike(objResponse as HttpResponse) {
...
objResponse.ContentType= "Image/jpeg";
b.Save(objResponse.OutputStream, ImageFormat.Jpeg);
}

void Page_Load(Object sender, EventArgs e){   
HistogramSpike h = new HistogramSpike(Response);
}
Avatar billede tknudsen Nybegynder
23. september 2002 - 14:28 #9
husk lige "uses System.Web" hvis du ikke allerede har den
Avatar billede simon.ulsnes Nybegynder
23. september 2002 - 16:32 #10
Det hedder ikke codebehind="..." men src="..."
...
Hoppede selv i den engang...

// Simon
// This sentence no verb.
Avatar billede simon.ulsnes Nybegynder
23. september 2002 - 16:34 #11
Har du i øvrigt husket at inherite fra Page i din CodeBehind klasse?
Avatar billede mosekongen Nybegynder
24. september 2002 - 09:07 #12
Det virker nu fint med codebehind istedet for src. Desuden fik jeg en fejl når jeg kompilerede om at min fil var initialiseret multible steder.
Jeg har også læst et sted (kan desværre ikke huske hvor) at man efter at have kompileret en gang skulle slette src i page direktivet (spørg mig ikke hvorfor, men det virkede). Hvad angår at arve fra Page i CodeBehind, så er det gjort.
Jeg vil lige afprøve forslaget for tknudsen før jeg giver pointene.
Avatar billede mosekongen Nybegynder
25. september 2002 - 18:03 #13
tknudsen: Hvordan vil du sende dit HttpResponse obj med fra aspx filen?

HistogramSpike h = new HistogramSpike(????????);
Kan man bare oprettet et HttpResponse?
Avatar billede mosekongen Nybegynder
26. september 2002 - 16:31 #14
Jeg har givet de fleste af pointene til simon.ulsnes, da det var hans forslag jeg fik til at virke. tknudsen får også lidt for sine forslag. Jeg har dog ikke fået det til at virke endnu, som min sidste kommentar nok illustrerer.
Tak for hjælpen
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