Jump to content

Nespēju atrasts kļūdu ASP.NET kodā


dobbleextra
 Share

Recommended Posts

Sveiki!

Izmēģināju  uzkodēt ko ASP.net, kurā esmu pilnīgs iesācējs izmantojot c#(ar kuru gan arī vēl esmu iesācējs, bet esmu jau izveidojis vairākas daudz sarežģītākas programmas). Bet uzdūros uz problēmas tieši ar c#, kuru nespēju atrast jau sazin cik ilgi. Programma ir vienkārša forma, kur jāievada savi dati jāatbild uz jautājumiem, kuri tiek paņemti randomā no saraksta un tad rezultāts tiek ievietots līderbordā ar sql serveri(to daļu vēl neesmu izdarījis, bet tai nevajadzētu būt problēmai). Kautkur ir kļūda, bet nespēju atrast tāpēc ceru, ka kādam izdosies man palīdzēt(Tālāki skaidrojumi kodā komentos un zem koda, lai vieglāk saprast).

 public partial class WebForm1 : System.Web.UI.Page
    {        
        
        public struct question
        {
            public string q, a1, a2, a3, ans;
        }
        protected void Page_Load(object sender, EventArgs e)
        {
            QList = new List<question>() { new question() {
 q = "Cik ir 1+1", a1 = "1", a2 = "2", a3 = "3", ans = "2" }, 
new question() { q = "Cik mēnešu ir gadā?", a1 = "12", a2 = "10", a3 = "5", ans = "12" } };
//Jautājumi tikai tādi pagidām testa pēc
            int pos1 = 100;
            int pos2 = 200;
            for (int i = 0; i < 1; i++,pos1+=300,pos2 +=300)

//Šeit tiek izveidots noteikts skaits jautājumu
            {
                Random rand = new Random();
                Label l = new Label();
                l.Style[HtmlTextWriterStyle.Position] = "Absolute";
                l.Style[HtmlTextWriterStyle.Top] = pos1.ToString() + "px";
                l.Style[HtmlTextWriterStyle.Left] = "347px";
                question q = QList.ElementAt(rand.Next(0, QList.Count));
                answers.Add(q.ans);
                l.Text = q.q;
                CheckBox cb1 = new CheckBox();
                cb1.Style[HtmlTextWriterStyle.Position] = "Absolute";
                cb1.Style[HtmlTextWriterStyle.Top] = pos2.ToString() + "px";
                cb1.Text = q.a1;
                cb1.Style[HtmlTextWriterStyle.Left] = "250px";
                CheckBox cb2 = new CheckBox();
                cb2.Style[HtmlTextWriterStyle.Position] = "Absolute";
                cb2.Style[HtmlTextWriterStyle.Top] = pos2.ToString() + "px";
                cb2.Text = q.a2;
                cb2.Style[HtmlTextWriterStyle.Left] = "450px";
                CheckBox cb3 = new CheckBox();
                cb3.Style[HtmlTextWriterStyle.Position] = "Absolute";
                cb3.Style[HtmlTextWriterStyle.Top] = pos2.ToString() + "px";
                cb3.Text = q.a3;
                cb3.Style[HtmlTextWriterStyle.Left] = "650px";
                l.Visible = true;
                cb1.Visible = true;
                cb2.Visible = true;
                cb3.Visible = true;
                Button1.Style[HtmlTextWriterStyle.Position] = "Absolute";
                Button1.Style[HtmlTextWriterStyle.Top] = "4px";
                Button1.Style[HtmlTextWriterStyle.Top] = 
(Convert.ToInt32(Button1.Style[HtmlTextWriterStyle.Top].Substring(0, Button1.Style[HtmlTextWriterStyle.Top].IndexOf('p'))) + 300).ToString() + "px"; 
                form1.Controls.Add(cb1);
                form1.Controls.Add(cb2);
                form1.Controls.Add(cb3);
                form1.Controls.Add(l);
                questions.Add(q);
                Button1.Attributes.Add("onclick", "return false;");
            }
        }
        List<question> questions = new List<question>();
        List<question> QList;
        List<string> answers = new List<string>();
        protected void Button1_Click(object sender, EventArgs e)
        {
            if (TextBox4.Text == "Vārds" || TextBox2.Text == "Uzvārds" ||
 TextBox3.Text == "Dzimšanas gads")
            {
                System.Web.HttpContext.Current.Response.Write("<SCRIPT LANGUAGE='JavaScript'>alert('Lūdzu aizpildiet visus laukumus')</SCRIPT>");
            }
            int gads;
            if(!int.TryParse(TextBox3.Text, out gads)) 
            {
                System.Web.HttpContext.Current.Response.Write("<SCRIPT LANGUAGE='JavaScript'>alert('Lūdzu ievadiet pareizu gadu')</SCRIPT>");     
            }
            else if (gads > 2013 || gads < 1915)
            {
                System.Web.HttpContext.Current.Response.Write("<SCRIPT LANGUAGE='JavaScript'>alert('Lūdzu ievadiet pareizu gadu')</SCRIPT>");  
            }
            List<CheckBox> CheckBoxes = new List<CheckBox>();
            foreach(Control c in form1.Controls)
            {
                if (c is CheckBox) 
                {
                    CheckBoxes.Add(c as CheckBox);
                    System.Web.HttpContext.Current.Response.Write("<SCRIPT LANGUAGE='JavaScript'>alert('" + (c as CheckBox).Text +"')</SCRIPT>");
//Šeit uzliku pārbaudi, un vinš citreiz met atšķirīgu rezultātu kā parādā uz ekrāna  
                }
            }
            int score = 0;
            for (int i = 0; i < CheckBoxes.Count/3; i++) 
            {
                System.Web.HttpContext.Current.Response.Write("<SCRIPT LANGUAGE='JavaScript'>alert('" + CheckBoxes.ElementAt(0).Text + " " +
 CheckBoxes.ElementAt(1).Text + " " + CheckBoxes.ElementAt(2).Text + " " + answers.ElementAt(0)  + "')</SCRIPT>");  
//vēl viens tests tā pati problēma
                if(CheckBoxes.ElementAt(i).Checked && CheckBoxes.ElementAt(i).Text == answers.ElementAt(i)) 
                {
                    score++;
                }
                else if (CheckBoxes.ElementAt(i + 1).Checked && CheckBoxes.ElementAt(i+1).Text == answers.ElementAt(i)) 
                {
                    score++;
                }
                else if (CheckBoxes.ElementAt(i + 2).Checked && CheckBoxes.ElementAt(i+2).Text == answers.ElementAt(i)) 
                {
                    score++;
                }
            }
            System.Web.HttpContext.Current.Response.Write(
"<SCRIPT LANGUAGE='JavaScript'>alert('Jūsu rezultāts ir " + 
score.ToString() + "/" + (CheckBoxes.Count/3).ToString() + "')</SCRIPT>");  
            //Server.Transfer("WebForm2.aspx");
        }
    }

Doma ir tāda, ka no questions list programma izlozē vienu jautājumu un uztaisa visas kontroles priekš tā, tad atblides uz jautājumiem tiek ieliktas answers list(šajā gadījumā tikai vienu atbildi). Tad checkboxes list<Checkbox> saliek visus checkboxus un pārbauda, ja noteiktais checkbox, kura texts ir vienāds ar atbildi ir atķeksēts, tad pieskaita punktu, bet citreiz punktu nepieskaita vai pieskaita, ja ir atbildēts nepareizi. Izmantojot javascript alert atklāju, ka citreiz iegūto checkbox teksts ir savādāks kā lietotājam rakstīts pie checkbox. Tāpat arī answers<string> saraksts citriez rāda citu atbildi kā jautājumam uz ekrāna.

Labots - dobbleextra
Link to comment
Share on other sites

Pirmkārt, ieteikums - neķēpājies ar WebFormām un sāc ar MVC. Tas tagad vairāk modē, un pamatoti.

 

Otrkārt, problēma tāda, ka Tu neesi izpratis WebFormu pamatus un dzīves ciklu. Uz Tavu pogas spiedienu visa lapa tiek radīta no jauna, ieskaitot Page_Load, tāpēc arī visi jautājumi tiek vēlreiz randomizēti. Vispār, likt kontroles klāt "ar roku" (nevis aprakstīt .aspx failā) ir samērā piņķerīgi, tāpēc ieteiktu tā nedarīt, kamēr neizproti visu to sistēmu labāk. Labāk uzliec .aspx failā fiksētas kontroles, kurām maini Text, Visible, utml.

 

Iesaku arī atrast kādu labu tutoriāli. Un uzmeklē "asp.net webforms page life cycle" - to ir kritiski izprast, ja grib strādāt ar webformām.

Link to comment
Share on other sites

dobbleextra

Paldies, es tā arī domāju, ka vaina ir tajā, ka uz pogas spiedienu page load aktivizējas otreiz,bet lai to novērstu uzliku Button1.Attributes.Add("onclick", "return false;"). Varbūt tas nedarbojas.

Tādā gadījumā varbūt ir arī labāks variants. Kontroles liku klāt kodā nevis editorā, jo vēlējos,lai jautājumu skaitu un tos var pamainīt vienkārši nomainot skaitli un QLlist saturu.  

Link to comment
Share on other sites

To nevar novērst - tas ir nepieciešams, lai vispār notiktu button click events. Vēlreiz atkārtoju - met šito pie malas un pievērsies MVC. Tur šitādas lietas būs DAUDZ vieglāk izdarīt.

Link to comment
Share on other sites

Izveido kontu, vai pieraksties esošajā, lai komentētu

Jums ir jābūt šī foruma biedram, lai varētu komentēt tēmas

Izveidot jaunu kontu

Piereģistrējies un izveido jaunu kontu, tas būs viegli!

Reģistrēt jaunu kontu

Pierakstīties

Jums jau ir konts? Pierakstieties tajā šeit!

Pierakstīties tagad!
 Share

×
×
  • Izveidot jaunu...