Avatar billede bac Nybegynder
24. maj 2009 - 19:50 Der er 24 kommentarer

Threads

Redirecting i en webform

Jeg har lavet en webform og når man trykker på en knap skal den starte en tråd som kalder en metode og redirecter mig

Thread trd = new Thread(new ThreadStart(Thread2));
trd.IsBackground = true;
trd.Start();


Metoden den kalder er denne:

public void Thread2()
{       
    Thread.Sleep(2000);
    Response.Redirect("google.com");
}

Men det kan jeg ikke og jeg får en fejl der hedder:

"Response is not available in this context."
Avatar billede bac Nybegynder
24. maj 2009 - 19:51 #1
Nogen der kan se hvad problemet umiddelbart er, og hvordan jeg løser dette?
Avatar billede thesurfer Nybegynder
24. maj 2009 - 19:52 #2
Har du prøvet med?:

HttpContext.Current.Response.Redirect
Avatar billede bac Nybegynder
24. maj 2009 - 20:00 #3
Ja det har jeg
Avatar billede bac Nybegynder
24. maj 2009 - 20:02 #4
System.Web.HttpContext.Current.Response.Redirect("google.com"); Har jeg prøvet med
Avatar billede thesurfer Nybegynder
24. maj 2009 - 20:06 #5
HttpContext.Current.Response.Redirect("http://www.google.com");
Avatar billede thesurfer Nybegynder
24. maj 2009 - 20:07 #6
Eller:

System.Web.HttpResponse.Redirect("http://www.google.com");
Avatar billede bac Nybegynder
24. maj 2009 - 20:09 #7
Den siger til det
"The name "HttpContext" does not exist in the current context"
Avatar billede thesurfer Nybegynder
24. maj 2009 - 20:11 #8
Smid lige hele koden og hele fejlbeskrivelsen her ind.. så er det nemmere at se hvad det er der går galt..
Avatar billede bac Nybegynder
24. maj 2009 - 20:12 #9
"An object reference is required for the non-static field, method, or property 'System.Web.HttpResponse.Redirect(string)"

Til den sidste.
Avatar billede bac Nybegynder
24. maj 2009 - 20:13 #10
using System;
using MySql.Data.MySqlClient;
using System.Text.RegularExpressions;
using System.Threading;
using System.Collections;

namespace WebApplication4
{

    public partial class WebForm1 : System.Web.UI.Page
    {
       

        protected void Page_Load(object sender, EventArgs e)
        {
            if (DateTime.Now.Month < 10)
            {
                TextBox4.Text = DateTime.Now.Day.ToString() + "-" + "0" + DateTime.Now.Month.ToString() + "-" + DateTime.Now.Year.ToString();
            }
            else
            {
                TextBox4.Text = DateTime.Now.Day.ToString() + "-" + DateTime.Now.Month.ToString() + "-" + DateTime.Now.Year.ToString();
            }
            TextBox4.ReadOnly = true;

           
           
        }

        protected void Button1_Click(object sender, EventArgs e)
        {
            TextBox1.Text = "";
            TextBox2.Text = "";
            TextBox3.Text = "";
            TextBox5.Text = "";
            TextBox6.Text = "";
        }

        public bool isEmail()
        {
            string inputEmail = TextBox6.Text.ToString();
           
           
            string strRegex = @"^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}" +
                  @"\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\" +
                  @".)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$";
           
            //indbygget metode til at tjekke en regular expression
            Regex mail = new Regex(strRegex);
            if (mail.IsMatch(inputEmail))
                return true;
            else
                return false;
        }


        public bool isValidNavn()
        {
            string inputText = TextBox2.Text.ToString();
            if (inputText.Length > 45)
            {
                return false;
            }
            else
            {
                return true;
            }
        }

   

        public bool isValidOverskrift()
        {
            string inputText = TextBox1.Text.ToString();
            if (inputText.Length > 45)
            {
                return false;
            }
            else
            {
                return true;
            }
        }

        public static void Thread2()
        {
           
                Thread.Sleep(2000);
                System.Web.HttpResponse.Redirect("http://www.google.com");
               
            An object
           
        }

        protected void Button2_Click(object sender, EventArgs e)
        {

            isEmail();
            isValidNavn();
            isValidOverskrift();
         

            if (TextBox1.Text.Equals("") || TextBox2.Text.Equals("") || TextBox3.Text.Equals("") || TextBox4.Text.Equals("") || TextBox5.Text.Equals("") || TextBox6.Text.Equals(""))
            {
                //doNothing
            }
            else if (isEmail() == false)
            {
                TextBox6.Text = "Din email var ikke korrekt indtastet!";
            }
            else if (isValidNavn() == false)
            {
                Label1.Text = "Dit navn er for langt";
            }
            else if(isValidOverskrift() == false)
            {
                Label1.Text = "Dit overskrift er for lang";

            }
           

            else
            {

                Thread trd = new Thread(new ThreadStart(Thread2));
                trd.IsBackground = true;
                trd.Start();

               

                //connection string
                string MyConString = "SERVER=localhost;" + "DATABASE=CMS;" + "UID=root;" + "PASSWORD=password;";
               
                //ny connection
                MySqlConnection connection = new MySqlConnection(MyConString);
                MySqlCommand command = connection.CreateCommand();

                //åben connection
                connection.Open();

                //SQL kald
                command.CommandText = "INSERT INTO Nyhed(Overskrift, SkrevetAf, Undertitel, Dato, Artikel, Email) VALUES('" + TextBox1.Text + "','" + TextBox2.Text + "','" + TextBox3.Text + "','" + TextBox4.Text + "','" + TextBox5.Text + "','" + TextBox6.Text + "')";
               
                //Betyder at det er et kald som skriver TIL databasen.
                command.ExecuteNonQuery();

                //Lukker forbindelsen
                connection.Close();

               

            }

           
        }

        protected void Button3_Click(object sender, EventArgs e)
        {

           

            isEmail();
            isValidNavn();
            isValidOverskrift();


            if (TextBox1.Text.Equals("") || TextBox2.Text.Equals("") || TextBox3.Text.Equals("") || TextBox4.Text.Equals("") || TextBox5.Text.Equals("") || TextBox6.Text.Equals(""))
            {
                //doNothing
            }

            else if (isEmail() == false)
            {
                Label1.Text = "Din email var ikke korrekt indtastet!";
            }
            else if (isValidNavn() == false)
            {
                Label1.Text = "Dit navn må have max 50 karakterer";
            }
            else if (isValidOverskrift() == false)
            {
                Label1.Text = "Din overskrift må være på maks 45 tegn";

            }
            else
            {
                Label1.Text = "Det ser fint ud";
            }

           
        }

    }
}
Avatar billede bac Nybegynder
24. maj 2009 - 20:16 #11
Væk med "An object" her self :)

public static void Thread2()
        {
           
                Thread.Sleep(2000);
                System.Web.HttpResponse.Redirect("http://www.google.com");
               
            An object
           
        }
Avatar billede thesurfer Nybegynder
24. maj 2009 - 20:20 #12
Når man opretter en almindelig webside, har man adgang til web-delen via følgende namespaces:


using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

Dem har du ikke.

Som minimum skal man vel have System.Web.. mener jeg.. men tilføj dem alle, og prøve med:

HttpContext.Current.Response.Redirect("http://www.google.com");

og derefter (hvis det ikke virker):

System.Web.HttpResponse.Redirect("http://www.google.com");
Avatar billede bac Nybegynder
24. maj 2009 - 20:26 #13
1)

Jeg får en System.NullReferenceException efter at have tilføjet de forskellige usings. {"Object reference not set to an instance of an object."}

2)

Den anden giver en rød streg og siger jeg mangler en reference.
Avatar billede thesurfer Nybegynder
24. maj 2009 - 20:31 #14
Hvor? Hvad? - Du skal tænke på, at jeg ikke sidder ved siden af dig.. :)

Mere info.. heller for mange oplysninger end for få..
Avatar billede bac Nybegynder
24. maj 2009 - 20:37 #15
1) HttpContext.Current.Response.Redirect("http://www.google.com");

Jeg kan compile med den første, men når jeg prøver at få den til at køre får jeg fejlen "System.NullReferenceException efter at have tilføjet de forskellige usings. dertil er fejlet i debugging -> {"Object reference not set to an instance of an object."}"

2) System.Web.HttpResponse.Redirect("http://www.google.com");

Den anden får jeg en fejl med inden jeg skal compile:

Error 1 An object reference is required for the non-static field, method, or property 'System.Web.HttpResponse.Redirect(string)'
Avatar billede thesurfer Nybegynder
24. maj 2009 - 20:40 #16
og hvilke linier peger fejlene på ?
Avatar billede bac Nybegynder
24. maj 2009 - 20:44 #17
1) På denne når tråden er færdig med at sleepe (i run mode)

HttpContext.Current.Response.Redirect("http://www.google.com"); med fejlen "System.NullReferenceException"

2) og på den anden

System.Web.HttpResponse.Redirect("http://www.google.com"); med en rød streg under og fejlen

Error 1 An object reference is required for the non-static field, method, or property 'System.Web.HttpResponse.Redirect(string)'
Avatar billede sirius Nybegynder
24. maj 2009 - 20:56 #18
Er det ikke fordi at din HttpContext eksisterer inden for din hovedtråd og ikke på den nye tråd du opretter.

Så enten skal du sende en reference med til din tråd eller også skal du lave et callback til hovedtråden som så redirecter.
Avatar billede bac Nybegynder
24. maj 2009 - 20:59 #19
Hvordan vil du give tråden en reference med?
Avatar billede sirius Nybegynder
24. maj 2009 - 21:09 #20
Quick and dirty:
protected void Button1_Click(object sender, EventArgs e)
{
    Thread trd = new Thread(new ParameterizedThreadStart(Thread2));
    trd.IsBackground = true;
    trd.Start(HttpContext.Current);
}

private void Thread2(object context)
{
    Thread.Sleep(2000);
    ((HttpContext)context).Response.Redirect("http://google.com");
}

men dette vil selvfølgelig ikke virke da du ikke bare kan redirecte en klient på den måde :-)
Avatar billede sirius Nybegynder
24. maj 2009 - 21:17 #21
En løsning ville være at bytte om hvad der foregår i hovedtråden og i den tråd du opretter.

Altså så din databaseforespørgelse bliver udført i childtråden og din response.redirect foregår i hovedtråden
Avatar billede bac Nybegynder
24. maj 2009 - 21:18 #22
Hehe og kønt er det nu heller ikke :P

Er der virkelig ikke nogen nemmere måde at redirecte til en side med en Thread?
Avatar billede sirius Nybegynder
24. maj 2009 - 21:28 #23
Tror ikke det er helt nemt. Normalt foregår webkommunikation jo ved at en klient spørger og serveren svarer.

Så det er ikke så nemt at få serveren til at sende kommandoer til klienten når en eller anden tråd nu bliver færdig med sit arbejde.

Hvis det er fordi du ikke vil have at din klient skal vente på at serveren er færdig med at behandle din forespørgelse vil jeg anbefale at du fra klienten (via javascript) sender din forespørgelse til serveren asynkront.
Avatar billede windcape Praktikant
26. maj 2009 - 18:48 #24
Man benytter ikke threading til webapplications, den er ikke længerere! Og Det er noget værre rodekodet i har fået skrevet.

Løsningen er at benytte Javascript til formålet, hvis det skal være clientside, og ellers benytter Response.Redirect.

Og begge dele har intet med Threading at gøre.
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