首页 新闻 会员 周边

一个头痛的问题,希望高手能帮指点下

0
悬赏园豆:5 [已关闭问题]
我现在用.NET2005做个毕业设计的网站(在线考试系统)我想在关闭浏览器的时候执行提交试卷的一个方法
方法如下:
protected void TiJiao()
    {
        string examresult = "", examresult1 = "";
        int mark = 0, mark1 = 0;
        CheckWhat("选择题");
        mark = b;//分值赋给mark
        CheckWhat("判断题");
        mark1 = b;
        float sum = 0, sum1 = 0;
        for (int i = 0; i < StringAnswer.Length; i++)
        {
            try//异常判断
            {
                examresult = examresult + ItemCheck((Page.FindControl("List" + i) as RadioButtonList).SelectedIndex) + ",";//记录该考生做过的答案
                if ((Page.FindControl("List" + i) as RadioButtonList).SelectedIndex == ABCDCheck(StringAnswer[i].Trim()))//判断该考生做过的答案是否是标准答案相同
                {
                    sum = sum + mark;//相同则加相应的分值
                }
            }
            catch
            {
                continue;
            }
        }//使考生状态表发生变化,以身改变相应的值
        for (int j = 0; j < StringAnswer1.Length; j++)
        {
            try//异常判断
            {
                examresult1 = examresult1 + ItemTFCheck((Page.FindControl("buttonlist" + j) as RadioButtonList).SelectedIndex) + ",";//记录该考生做过的答案
                if ((Page.FindControl("buttonlist" + j) as RadioButtonList).SelectedIndex == TFCheck(bool.Parse(StringAnswer1[j].Trim())))//判断该考生做过的答案是否是标准答案相同
                {
                    sum1 = sum1 + mark1;//相同则加相应的分值
                }
            }
            catch
            {
                continue;
            }
        }//
        sum = sum + sum1;
        sqlcon.Open();
        sqlcom = new SqlCommand("update 考试状态表 set 分数=" + sum + " where 编号='" + Session["StudentID"].ToString().Trim() + "'", sqlcon);
        sqlcom.ExecuteNonQuery();
        if (checkb != 2)
        {
            sqlcom = new SqlCommand(" insert into 考生答案记录表 values(@id,@examid,@studentexam,@studentexam1,@biaozhi,@timediv)", sqlcon);//在数据库中记录该考生做的答案
        }
        else
        {
            sqlcom = new SqlCommand("update 考生答案记录表 set 试卷号=@examid,考生选择题答案=@studentexam,考生判断题答案=@studentexam1,标志=@biaozhi,还剩时间=@timediv where 考生编号=@id", sqlcon);
        }
        sqlcom.Parameters.Add("@id", SqlDbType.VarChar).Value = Session["StudentID"].ToString().Trim();
        sqlcom.Parameters.Add("@examid", SqlDbType.VarChar).Value = count.ToString();
        sqlcom.Parameters.Add("@studentexam", SqlDbType.Text).Value = examresult;
        sqlcom.Parameters.Add("@studentexam1", SqlDbType.Text).Value = examresult1;
        sqlcom.Parameters.Add("@biaozhi", SqlDbType.Bit).Value = 0;
        sqlcom.Parameters.Add("@timediv", SqlDbType.Int).Value = 0;
        sqlcom.ExecuteNonQuery();
        Session["Mark"] = sum;//Session存放便于显示
        Response.Redirect("Result.aspx");
        sqlcon.Close();
    }
进入到考试的代码是:
 sqlcon.Open();
        sqlcom = new SqlCommand("select *from ExamClassStudent where 学号=@id and 姓名=@name and 班级=@class", sqlcon);
        sqlcom.Parameters.Add("@id", SqlDbType.VarChar).Value = this.id.Text.Trim();
        sqlcom.Parameters.Add("@name", SqlDbType.VarChar).Value = this.name.Text.Trim();
        sqlcom.Parameters.Add("@class", SqlDbType.VarChar).Value = this.classid.SelectedValue.Trim();
        reader = sqlcom.ExecuteReader();
        if (reader.Read())
        {
            reader.Close();
           
                Session["StudentID"] = this.id.Text.Trim();
                Session["StudentClass"] = this.classid.SelectedValue.Trim();
                Session["StudentName"] = this.name.Text.Trim();
                Response.Redirect("StudentExam.aspx");
           
        }
        else
        {
            reader.Close();
            Response.Write("<script>alert('考生信息错误!')</script>");
            return;
        }
我在考试的页面调用了一个JS是:
 <script language="javascript">
     window.onbeforeunload  =  function()  
       {  
            if((event.clientX>document.body.clientWidth&&event.clientY<0)||event.altKey)   //关闭触发

            {         
                 <%TiJiao(); %>;
            }
            else
            {
                 alert("刷新触发");
            }
        }
</script>
我点进入考试跳转到考试页面的时候,还没有考试就执行了提交方法!找不出哪里出问题了请老师您指点下!如果不用js的话是否可以有什么方法来实现关闭浏览器(考试页面)就能实现我的提交试卷的方法(TiJiao())?
问题补充: 有做个Button_click事件!,这个是没有问题的Button_click就可以交卷!现在我的问题是关闭浏览器不能交卷!登陆还可以再进行考试!这个就是不符合考试要求了!时间是用AJAX实现的!再进入考试时间是和退出的剩余的时间相同的!
清崽的主页 清崽 | 初学一级 | 园豆:121
提问于:2008-11-17 13:43
< >
分享
其他回答(3)
0

得用js写tijiao方法

可以这样实现 将提交操作放到一个ashx文件里,然后在window.unload()事件里发送ajax请求,执行tijiao函数

张荣华 | 园豆:2020 (老鸟四级) | 2008-11-17 13:48
1

嗯咳 ~~~~~~~~~

这个问题怕是不能这样问下去了,因为TiJiao()是服务器方法,你在JS中使用 <%TiJiao();%>是不会成功的,提交方法是不可以这样子写的,此路不通

如果还没考试就提交了,那我估计是在page_load或其他事件中调用了这个 TiJiao() 方法导致的,这都是不是根本问题

根本问题在于你必须在JS中重新写提交操作,而且要使用JS,而不是C#的方法,修改一下设计吧

另外:关闭浏览器时提交试卷,本身这个做法就是无法完全实现的,只能在一定程度上完成,因为浏览器进程状态是不会提交给服务器的,在关闭时,很难真正拦截到事件,拦截到了也未必能提交过去。所以建议改成一个<asp:button>来手动提交的方式,这样就可以在这个提交按钮里调用你的TiJiao()了

请注意JS属于浏览器执行部分,C#属于服务器执行部分,两个没有任何关系,无法直接互相调用

丁学 | 园豆:18730 (专家六级) | 2008-11-17 14:13
0

丁学说的很对,最好再写个Button_click函数一切就都解决了!

子夜星辰 | 园豆:1613 (小虾三级) | 2008-11-17 14:20
0

建议改成Button 来提交试卷.如楼上兄弟所讲,IE的进程关闭事件,是不会提交给Web服务器的,

虽然,用javascript 的客户端代码可以拦截到窗口即将关闭.但是窗口已经不再向服务器提交页面上的所有信息了.

所能这里就再也调不到服务器上的TiJiao()方法.

程序员老李 | 园豆:790 (小虾三级) | 2008-11-17 14:26
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册