none
网页无法得到数据 RRS feed

  • 问题

  • 我用一个专门读取数据库的类,在网页程序实例化该类后调用它的一个返回数组的方法。该数组将和网页读取的用户输入比较后,一起显示在网页上。我在网页上添加了一个AJAX控件来显示从数据库读取的数据。

    我的问题是无法返回一个数组,在逐句执行到 return answerOfExam;返回数组时,在网页的

    tempStandantAnswer = ExamData.ReadAnswer(thisTime);这一句代码没有得到要返回的数组。tempStandantAnswer仍然为null。请问这是什么地方出问题了?


    新手学习,再学习......
    2010年6月3日 6:18

答案

  • 不是的,使用标准的HTML控件也是可以获取到值的,从你代码里面来看。

    //从网页收集用户填写的上一题答案
    tempAnswer = Request.Params.GetValues("userAnswer"); 

    是可以获取到页面上所有<input name="userAnswer" />的用户输入值的。

    我大概看了下你的代码,要注意的地方是,在ASP.NET后台代码类里的那些成员,当用户点了“下一题”之后,会重新产生一次Request,页面也会重新填充成员变量的值。比如:

    private int rate = 0;//回答正确率
    string[] tempStandantAnswer;
    string[] tempAnswer;
    string thisTime;
    

    这些值在Submit_Click执行后,会重新赋值。

    最好能用调试模式进行单步分析,看看到底是哪一步出错,因为这代码的确挺多的,我也没有一步一步来试验。


    Facing problems, think first, then search, finally ask.
    2010年6月12日 5:38
    版主

全部回复

  • 可能在 ExamData.ReadAnswer 方法体内并没有给变量 answerOfExam 赋值。

    最好能提供下 ExamData.ReadAnswer 方法的内部代码,这样更容易帮您解决问题。

    另外在设计方法的时候有一些最佳做法,比如返回列表的方法应该始终返回实例化后的列表,尽管可能没有任何实体数据填充,也应该返回一个空列表;还有返回对象的方法,在方法体内确定了没有任何实体数据时,应该返回 null 。


    Facing problems, think first, then search, finally ask.
    2010年6月3日 7:05
    版主
  • 我估计你在ExamData.ReadAnswer(thisTime); 这个方法内部 使用了try catch直接把错误过滤掉了,还有可能就是 ExamData.ReadAnswer(thisTime); 并没有返回具体的内容,所以仔细看看ExamData.ReadAnswer(thisTime); 方法内部,再不行 贴下 ,我们一起看看

    2010年6月3日 7:24
  • public string[] ReadAnswer(string ContentTime)
            {
                string select = @"SELECT DaAn FROM DaAn WHERE (ShiJian='" + ContentTime + "') ORDER BY Xuhao;";
                string selectCount = @"SELECT COUNT(DaAn) FROM DaAn WHERE (ShiJian='" + ContentTime + "');";

                SqlConnection ExamAnswerConnection = new SqlConnection(DataSourceString);
                ExamAnswerConnection.Open();

                SqlCommand ExamAnswerCommandCount = new SqlCommand(selectCount, ExamAnswerConnection);
                int numberOfAnswer = (int)ExamAnswerCommandCount.ExecuteScalar();

                SqlCommand ExamAnswerCommand = ExamAnswerConnection.CreateCommand();
                ExamAnswerCommand.CommandText = select;

                SqlDataReader ExamAnswerRead = ExamAnswerCommand.ExecuteReader();

                string[] answerOfExam = new string[numberOfAnswer];

                int i = 0; //数组的索引
                while (ExamAnswerRead.Read())
                {
                    answerOfExam[i] = ExamAnswerRead["DaAn"].ToString();
                    i++;
                }
                ExamAnswerConnection.Close();
                return answerOfExam;//返回一个答案数组
            }

    在ResdData类中 answerOfExam中是有数据的。


    就是ResdData类读取的数组不能传给网页程序。我试着用在网页程序中:

    tempStandantAnswer = ExamData.ExamAnswer;

    在ReadData类中:

    public string[] ExamAnswer
            {
                get
                {
                    return ContentAnswer;
                }
            }

    还是不行,在tempStandantAnswer.Length出现异常。

    2010年6月3日 7:28
  • 这个方法在编译上没问题的,但有设计缺陷。

    现在可以确认的是这个方法本身是能返回值的,只是在网页上无法获取到,对吗?


    Facing problems, think first, then search, finally ask.
    2010年6月3日 7:40
    版主
  • 对,请指点一下怎么解决,并请告诉我设计缺陷在哪里?我是边学边做的,基础知识不扎实。
    我做的是网页试卷,用了asp.net的AJAX的UpdatePanel控件,在该控件内显示试题,从网页读取回答结果,从数据库读取试题和答案,在回答完毕后将题目、标准答案和用户答案同时显示到UpdatePanel控件中。
    2010年6月3日 7:41
  • 请问你在 UpdatePanel 里面用的什么来绑定数据的呢?

    现在来说说那个方法吧。:)先说说我从代码理解到的意图(需求),根据指定的时间获取到 DaAn 表中满足条件的那些 DaAn,并把 DaAn 按照 XuHao 排序。

    数据库无论在什么系统里都是稀缺资源,非常耗费计算时间的,所以要少用,用完即主动归还。下面分析下代码。

    问题:为什么要两句SQL呢?

    第一句是查询结果集,第二句是查询结果的记录数。其实第一条语句查询返回结果已经有记录数了啊。我知道你的意图是用来初始化数组大小。

    解决:请使用泛型的列表,比如List<T>,会动态伸缩的改变容量。代码做如下更改即可:

    List<string> answerOfExam = new List<string>();

    while (ExamAnswerRead.Read())
    {
          answerOfExam.Add(ExamAnswerRead["DaAn"].ToString());
    }

    当然,返回类型也要改成List<string>。

     


    Facing problems, think first, then search, finally ask.
    2010年6月3日 9:27
    版主
  • 感谢shiny zhu的帮助。

     UpdatePanel 没有绑定数据,我用<div id="T_Content" runat="server"></div>  

    在.cs中写 T_Content.InnerHtml = ExamContent; ExamContent是考题内容,我将要显示出来的内容都赋给 T_Content.InnerHtml 。

    你提到的泛型,我试一下哈,因为不怎么熟,我学习学习。

    请帮我分析分析为什么网页的代码不能接到数据,用属性也不行。郁闷。

    感谢中......


    目前我只找到使用<div id>.InnerHtml 的方法向网页传递数据,有没有更好的方式,请教教我。谢谢
    2010年6月3日 9:40
  • 谁能帮我分析一下,怎么样才能找到问题的原因,谢谢。
    新手学习,再学习......
    2010年6月4日 6:00
  • 指定InnerHtml是可以执行的,你检查下ExamContent是否在绑定之前有值。

    其实最好的是把<div id="T_Content" runat="server"></div>换成一个更好用的ASP.NET 服务端控件,如果绑定列表,可以使用<asp:ListView ...>,如果绑定一个字符串,可以使用<asp:Label...>或<asp:Literal...>


    Facing problems, think first, then search, finally ask.
    2010年6月4日 6:08
    版主
  • protected void Submit_Click(object sender, EventArgs e)
            {
                string ExamContent = null;//显示在网页上的题目内容

                switch(Submit.Text)
                {
                    case "开始做题":
                        //题目显示和存储参考答案
                        ExamContent = ExamData.ReadDataContent(ContentOrder[i]);
                        thisTime = ExamData.CurrentTime;
                        //tempStandantAnswer = ExamData.ReadAnswer(thisTime);
                        tempStandantAnswer = ExamData.ExamAnswer;
                        T_Content.InnerHtml = ExamContent;
                        Submit.Text = "下一题";
                        i++;
                        break;

                    case "下一题":                   
                        //从网页收集用户填写的上一题答案
                        tempAnswer = Request.Params.GetValues("userAnswer");                                       
                        //核对上一题的答案
                        for (int ii = 0; ii < tempStandantAnswer.Length; ii++)
                        {
                            if (tempStandantAnswer[ii] == tempAnswer[ii])
                            {
                                rate++;
                                string tempstring = ExamContent + @"<br />" + "您的回答是:" + tempAnswer[ii] + @"<br />";
                                ExamAnswer.Enqueue(tempstring);
                            }
                            else
                            {
                                string tempstring = ExamContent + @"<br />" + "您的回答是:" + tempAnswer[ii] + @"<br />" + "参考答案是:" + tempStandantAnswer + @"<br />";
                            }
                        }

                        //读取一道新题
                        ExamContent = ExamData.ReadDataContent(ContentOrder[i]);
                        //tempStandantAnswer = ExamData.ExamAnswer;
                        thisTime = ExamData.CurrentTime;
                        tempStandantAnswer = ExamData.ReadAnswer(thisTime);
                        T_Content.InnerHtml = ExamContent;
                        //题目序号数组索引自增1
                        i++;
                        //判断是否做完题
                        if (i == ExamData.ExamCount)
                            Submit.Text = "提交答题结果";
                        break;

                    case "提交答题结果":
                        //从网页收集用户填写的最后一题答案
                        tempAnswer = Request.Params.GetValues("userAnswer");
                        //tempStandantAnswer = ExamData.ExamAnswer;
                        //最后一题的答案
                        for (int ii = 0; ii < tempStandantAnswer.Length; ii++)
                        {
                            if (tempStandantAnswer[ii] == tempAnswer[ii])
                            {
                                rate++;
                                string tempstring = ExamContent + @"<br />" + "您的回答是:" + tempAnswer[ii] + @"<br />";
                                ExamAnswer.Enqueue(tempstring);
                            }
                            else
                            {
                                string tempstring = ExamContent + @"<br />" + "您的回答是:" + tempAnswer[ii] + @"<br />" + "参考答案是:" + tempStandantAnswer + @"<br />";
                            }
                        }
                        //想网页打印本套卷子的题目、答案和正确率
                        string answerRate = "您回答正确的题数是:" + rate + @"/" + ExamData.ExamAnswer.Length;
                        string printContent = answerRate;
                        //读取所有回答结果
                        for (int jj = 0; jj < ExamAnswer.Count; jj++)
                        {
                            string tempContent = @"<p>" + ExamAnswer.Dequeue() + @"</p>";
                            printContent += tempContent;
                        }
                        //打印所有回答内容
                        T_Content.InnerHtml = printContent;
                        break;

                    default:
                        break;
                }

    请看代码,ExamContent只是要显示内容,我碰到的问题是tempStandantAnswer得不到ReadData类读取到的Answer数据。

    我使用InnerHtml是因为我的ExamContent内容是含有HTML控件的字符串,即ExamContent会含有<input type = "text" name = "userAnswer" />等,这些字符需要在网页上被识别为HTML标签。这样做的原因是,我显示的每道考题有不用数量的回答框(<input />),我为了方便显示,就采用InnerHtml。


    新手学习,再学习......
    2010年6月4日 6:24
  • 请高手帮助检查一下,我不知道哪里出错了!
    新手学习,再学习......
    2010年6月7日 1:34
  • 你好,

    你是否确定ReadAnswer这个方法真的获得了数据?这个你可以通过调试验证。

    Submit_Click这个方法是干嘛的,哪个触发的?你最好把你的逻辑说一下,这样我们才有一些上下文背景方面的了解。

    比如页面上跟这个有关的一些代码,怎么去触发这个事件的等。

     


    Microsoft Online Community Support
    2010年6月7日 2:16
  • KeFang Chen

    你好,我做一个考题网页,Submit_Click方法作用是:开始做题(读取第一道考题)、下一题(读取下一道考题)、提交回答结果(当读取最后一道题时,对比答案)。这个方法就是做题时切换考题、提交结果和显示结果的作用。ReadAnswer这个方法读取的数据我用调试看到了他读取的数据,出错在他返回该数据时网页那边没有接收到,网页接收数据的数组仍然是null。

    我读取ReadData类的属性也不行,该属性由同样ReadAnswer方法返回并赋给。

    我的想法是,在网页上使用AJAX控件局部更新显示考题的部分网页,最后将所有结果显示出来。


    新手学习,再学习......
    2010年6月10日 2:50
  • 你好,

    说实话从你上面提供的代码中看不出什么问题。

    如果可以提供下你的页面代码和后台代码,我可以试试看能不能找出点什么问题。


    Microsoft Online Community Support
    2010年6月10日 3:47
  • 你好

    不知道你页面是怎么返回数据:

    public string[] ExamAnswer

    {

       get

       { return 类名.ReadAnswer(string ContentTime);}

    }

    感觉是你在页面未对ContentAnswer赋值,或者是赋值后状态没有保存。返回数据为null.

    2010年6月10日 6:07
  • shizhusz110

    你好,那只是部分代码。


    新手学习,再学习......
    2010年6月10日 6:12
  • 回复KeFang Chen

    代码如下--------------------------------------------------------------------------------------------------------------------------

    default.aspx:

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebTest._Default" %>

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head runat="server">
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div><h3>第一单元测试</h3>
        <asp:ScriptManager ID="ScriptManager1" runat="server">
            </asp:ScriptManager>
        </div>
        <asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">  
        <ContentTemplate>
       
        <div id="T_Content" runat="server">
           
            </div>  
        <div><asp:Button ID="Submit" runat="server" onclick="Submit_Click" Text="开始做题"
                Width="111px" /></div>
        </ContentTemplate>
       
                    <Triggers>
                        <asp:AsyncPostBackTrigger ControlID="Submit" EventName="Click" />
            </Triggers>
       
                    </asp:UpdatePanel>
                   
       
        <div id="Div1" runat="server">
           
            </div>  
       
        </form>
    </body>
    </html>

    --------------------------------------------------------------------------------------------------------------------------------------------

    default.aspx.cs:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;

    namespace WebTest
    {
        public partial class _Default : System.Web.UI.Page
        {
            protected void Page_Load(object sender, EventArgs e)
            {
                //ContentOrder = ExamData.ExamContentOrder;
               
            }

            static private string bookISBN = "978-7-5415-3584-0/G.2672";//此书号应在这本书读取时调用,由书的首页(ChildHome)发送过来
            static private string bookLocation = "unit1";//本套题在书中的位置       

            ReadData ExamData = new ReadData(bookISBN,bookLocation);
            string[] ContentOrder;
           
            //存储核对回答的结果
            private Queue<string> ExamAnswer = new Queue<string>();
            //存储题目序号的数组
           
            int i = 0;//题目序号数组索引

            private int rate = 0;//回答正确率
            string[] tempStandantAnswer;
            string[] tempAnswer;
            string thisTime;

            protected void Submit_Click(object sender, EventArgs e)
            {
                string ExamContent = null;//显示在网页上的题目内容
                ContentOrder = ExamData.ExamContentOrder;
                switch(Submit.Text)
                {
                    case "开始做题":
                        //题目显示和存储参考答案
                        ExamContent = ExamData.ReadDataContent(ContentOrder[i]);
                        //tempStandantAnswer = ExamData.ExamAnswer;
                        thisTime = ExamData.CurrentTime;
                        //tempStandantAnswer = ExamData.ReadAnswer(thisTime);
                        tempStandantAnswer = ExamData.ExamAnswer;
                        T_Content.InnerHtml = ExamContent;
                        Submit.Text = "下一题";
                        i++;
                        break;

                    case "下一题":                   
                        //从网页收集用户填写的上一题答案
                        tempAnswer = Request.Params.GetValues("userAnswer");                                       
                        //核对上一题的答案
                        for (int ii = 0; ii < tempStandantAnswer.Length; ii++)
                        {
                            if (tempStandantAnswer[ii] == tempAnswer[ii])
                            {
                                rate++;
                                string tempstring = ExamContent + @"<br />" + "您的回答是:" + tempAnswer[ii] + @"<br />";
                                ExamAnswer.Enqueue(tempstring);
                            }
                            else
                            {
                                string tempstring = ExamContent + @"<br />" + "您的回答是:" + tempAnswer[ii] + @"<br />" + "参考答案是:" + tempStandantAnswer + @"<br />";
                            }
                        }

                        //读取一道新题
                        ExamContent = ExamData.ReadDataContent(ContentOrder[i]);
                        //tempStandantAnswer = ExamData.ExamAnswer;
                        thisTime = ExamData.CurrentTime;
                        tempStandantAnswer = ExamData.ReadAnswer(thisTime);
                        T_Content.InnerHtml = ExamContent;
                        //题目序号数组索引自增1
                        i++;
                        //判断是否做完题
                        if (i == ExamData.ExamCount)
                            Submit.Text = "提交答题结果";
                        break;

                    case "提交答题结果":
                        //从网页收集用户填写的最后一题答案
                        tempAnswer = Request.Params.GetValues("userAnswer");
                        //tempStandantAnswer = ExamData.ExamAnswer;
                        //最后一题的答案
                        for (int ii = 0; ii < tempStandantAnswer.Length; ii++)
                        {
                            if (tempStandantAnswer[ii] == tempAnswer[ii])
                            {
                                rate++;
                                string tempstring = ExamContent + @"<br />" + "您的回答是:" + tempAnswer[ii] + @"<br />";
                                ExamAnswer.Enqueue(tempstring);
                            }
                            else
                            {
                                string tempstring = ExamContent + @"<br />" + "您的回答是:" + tempAnswer[ii] + @"<br />" + "参考答案是:" + tempStandantAnswer + @"<br />";
                            }
                        }
                        //想网页打印本套卷子的题目、答案和正确率
                        string answerRate = "您回答正确的题数是:" + rate + @"/" + ExamData.ExamAnswer.Length;
                        string printContent = answerRate;
                        //读取所有回答结果
                        for (int jj = 0; jj < ExamAnswer.Count; jj++)
                        {
                            string tempContent = @"<p>" + ExamAnswer.Dequeue() + @"</p>";
                            printContent += tempContent;
                        }
                        //打印所有回答内容
                        T_Content.InnerHtml = printContent;
                        break;

                    default:
                        break;
                }           
               
            }       
                   
        }
    }
    -------------------------------------------------------------------------------------------------------------------------------------------------

    ReadDate.cs:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Data;
    using System.Data.SqlClient;
    using System.Text.RegularExpressions;
    using System.IO;

    namespace WebTest
    {
        public class ReadData
        {
            private int ExamContentCount;//当前套题的题目总数
            //private int CurrentOrder;//当前题目的序号
            private string ISBN;//书号
            private string Location;//套题在书中的序号
            private string[] ContentOrder;//一组题目序号
            private string[] ContentAnswer;//存储从数据库读取的答案
            private string[] ContentChoiced;//存储从数据库读取的选项
            //private string[] ContentFormula;//存储从数据库读取的公式
            private string dateTime;//获取题目的时间序列

            private string DataSourceString = @"Data Source=localhost\SQLEXPRESS;Initial Catalog = ourexam;Integrated Security = True";

            public string CurrentTime
            {
                get
                {
                    return dateTime;
                }
            }

            public ReadData(string thisisbn, string thislocation)
            {
                ISBN = thisisbn;
                Location = thislocation;
                ContentOrder = ReadContentOrder();
            }

            //一组题目序号属性
            public string[] ExamContentOrder
            {
                get
                {
                    return ContentOrder;
                }
            }

            //属性设置
            //总题数的属性
            public int ExamCount
            {
                get
                {
                    return ExamContentCount;
                }
            }

            //当前题目的序号属性
            //public int ExamCurrentOrder
            //{
            //    get
            //    {
            //        return CurrentOrder;
            //    }
            //}

            public string[] ExamAnswer
            {
                get
                {
                    return ContentAnswer;
                }
            }

            //书号属性,可以从图书子主页获得
            //public string BookISBN
            //{
            //    set
            //    {
            //        ISBN = value;
            //    }
            //}

            //套题位置属性,可以从图书子主页获得
            // public string BookLocation
            //{
            //    set
            //    {
            //        Location = value;
            //    }
            //}              

            //读取本套题目的所有序号
            private string[] ReadContentOrder()
            {
                string select = "SELECT XuHao FROM Timu WHERE (ISBN = '" + ISBN + "') AND (WeiZhi = '" + Location + "') ORDER BY XuHao;";
                string selectCount = "SELECT COUNT(XuHao) FROM Timu WHERE (ISBN = '" + ISBN + "') AND (WeiZhi = '" + Location + "') ;";
                SqlConnection ExamOrderConnection = new SqlConnection(DataSourceString);
                ExamOrderConnection.Open();


                //该命令是获取符合查询条件的行数
                SqlCommand ExamOrderCommandCount = new SqlCommand(selectCount, ExamOrderConnection);
                int numberOfTable = (int)ExamOrderCommandCount.ExecuteScalar();

                SqlCommand ExamOrderCommand = new SqlCommand(select, ExamOrderConnection);
                SqlDataReader ExamOrderRead = ExamOrderCommand.ExecuteReader();

                string[] orderOfExam = new string[numberOfTable];

                int i = 0; //数组的索引
                while (ExamOrderRead.Read())
                {
                    orderOfExam[i] = ExamOrderRead["XuHao"].ToString();
                    i++;
                }

                ExamContentCount = orderOfExam.Length;//得到本套题的总题数       
                ExamOrderConnection.Close();
                return orderOfExam;//返回一个序号数组
            }

            //读取题目内容、题型、图片地址和题目时间
            private string[] ReadContent(string order)
            {

                string select = @"SELECT TiMu,TiXing,Tupian,ShiJian FROM Timu WHERE (ISBN='" + ISBN + "') AND (WeiZhi='" + Location + "') AND (XuHao='" + order + "') ;";
                SqlConnection ExamContentConnection = new SqlConnection(DataSourceString);
                ExamContentConnection.Open();

                SqlCommand ExamContentCommand = ExamContentConnection.CreateCommand();
                ExamContentCommand.CommandText = select;

                SqlDataReader ExamContentRead = ExamContentCommand.ExecuteReader();

                string thisContent;//题目内容
                string thisContentClass;//题型
                string thisPicPath = null;//如有图片,图片地址
                string thisContentTime;//读取当前题目的 时间
                //while(

                ExamContentRead.Read();
                //{
                thisContent = ExamContentRead["TiMu"].ToString();
                thisContentClass = ExamContentRead["TiXing"].ToString();
                thisPicPath = ExamContentRead["Tupian"].ToString();
                thisContentTime = ExamContentRead["ShiJian"].ToString();
                dateTime = thisContentTime;
                //}
                string[] returnContent = { thisContent, thisContentClass, thisPicPath, thisContentTime };
                ExamContentConnection.Close();
                return returnContent;
            }

            //读取相应的答案
            public string[] ReadAnswer(string ContentTime)
            {
                string select = @"SELECT DaAn FROM DaAn WHERE (ShiJian='" + ContentTime + "') ORDER BY Xuhao;";
                string selectCount = @"SELECT COUNT(DaAn) FROM DaAn WHERE (ShiJian='" + ContentTime + "');";

                SqlConnection ExamAnswerConnection = new SqlConnection(DataSourceString);
                ExamAnswerConnection.Open();

                SqlCommand ExamAnswerCommandCount = new SqlCommand(selectCount, ExamAnswerConnection);
                int numberOfAnswer = (int)ExamAnswerCommandCount.ExecuteScalar();

                SqlCommand ExamAnswerCommand = ExamAnswerConnection.CreateCommand();
                ExamAnswerCommand.CommandText = select;

                SqlDataReader ExamAnswerRead = ExamAnswerCommand.ExecuteReader();

                string[] answerOfExam = new string[numberOfAnswer];

                int i = 0; //数组的索引
                while (ExamAnswerRead.Read())
                {
                    answerOfExam[i] = ExamAnswerRead["DaAn"].ToString();
                    i++;
                }
                ExamAnswerConnection.Close();
                return answerOfExam;//返回一个答案数组
            }

            //读取选项
            private string[] ReadChoicedPart(string ContentTime)
            {
                string select = @"SELECT Xuanxiang FROM XuanZeTi WHERE (ShiJian='" + ContentTime + "') ORDER BY Xuhao;";
                string selectCount = @"SELECT COUNT(Xuanxiang) FROM XuanZeTi WHERE (ShiJian='" + ContentTime + "');";

                SqlConnection ExamChoicedPartConnection = new SqlConnection(DataSourceString);
                ExamChoicedPartConnection.Open();

                SqlCommand ExamChoicedPartCommandCount = new SqlCommand(selectCount, ExamChoicedPartConnection);
                int numberOfChoicedPart = (int)ExamChoicedPartCommandCount.ExecuteScalar();

                SqlCommand ExamChoicedPartCommand = ExamChoicedPartConnection.CreateCommand();
                ExamChoicedPartCommand.CommandText = select;

                SqlDataReader ExamChoicedPartRead = ExamChoicedPartCommand.ExecuteReader();

                string[] ChoicedPart = new string[numberOfChoicedPart];

                int i = 0; //数组的索引
                while (ExamChoicedPartRead.Read())
                {
                    ChoicedPart[i] = ExamChoicedPartRead["Xuanxiang"].ToString();
                    i++;
                }
                return ChoicedPart;//返回一个选项数组
            }

            //读取公式
            private string[] ReadFormula(string ContentTime)
            {
                string select = @"SELECT GongShi FROM GongShi WHERE (ShiJian='" + ContentTime + "') ORDER BY Xuhao;";
                string selectCount = @"SELECT COUNT(GongShi) FROM GongShi WHERE (ShiJian='" + ContentTime + "')";

                SqlConnection FormulaConnection = new SqlConnection(DataSourceString);
                FormulaConnection.Open();

                SqlCommand FormulaCommandCount = FormulaConnection.CreateCommand();
                FormulaCommandCount.CommandText = selectCount;
                int numberOfFormula = (int)FormulaCommandCount.ExecuteScalar();

                SqlCommand FormulaCommand = FormulaConnection.CreateCommand();
                FormulaCommand.CommandText = select;

                SqlDataReader FormulaRead = FormulaCommand.ExecuteReader();

                string[] Formula = new string[numberOfFormula];

                int i = 0;//数组索引
                while (FormulaRead.Read())
                {
                    Formula[i] = FormulaRead["GongShi"].ToString();
                    i++;
                }
                FormulaConnection.Close();
                return Formula;//返回题目的公式
            }

            public string ReadDataContent(string thisorder/*需要读取题目的序号*/)
            {
                string[] ReadDataContent;//从数据库读取到的题目信息:题目内容、题型、图片地址和题目时间
                ReadDataContent = ReadContent(thisorder);

                string thisContent = ReadDataContent[0];
                string thisContentClass = ReadDataContent[1];
                string thisPicPath = ReadDataContent[2];
                string thisContentTime = ReadDataContent[3];

                //替换{input}
                thisContent = DataRegexReplace_input(thisContent);

                //替换{formula}
                Regex TryFormulaRegex = new Regex(thisContent);
                MatchCollection TryFormulaMatches = TryFormulaRegex.Matches(thisContent);
                if (TryFormulaMatches.Count >= 0)
                {
                    thisContent = DataRegexReplace_formula(thisContent, thisContentTime);
                }

                //读取题目图片数据库
                if (thisPicPath != null)
                {
                    thisContent = thisContent + @"<br />" + thisPicPath;
                }

                //将选项读出并接在题目后面           
                if (thisContentClass == "选择" || thisContentClass == "选择题")
                {
                    ContentChoiced = ReadChoicedPart(thisContentTime);

                    for (int i = 0; i < ContentChoiced.Length; i++)
                    {
                        ContentChoiced[0] = ContentChoiced[i] + @"<br />";
                    }

                    thisContent = thisContent + @"<br />" + ContentChoiced[0];
                }

                //读取答案数据库
                ContentAnswer = ReadAnswer(thisContentTime);

                return thisContent;
            }

            //替换{input}字符串的方法
            private string DataRegexReplace_input(string needreplacecontent)
            {
                string replacedAfterString = "<input type = \"text\" size=\"6\" name = \"userAnswer\" />";//用来替换的字符串
                string replacedBeforeString = "{input}";//需要替换的字符串

                Regex InputRegex = new Regex(replacedBeforeString);
                MatchCollection InputMatches = InputRegex.Matches(needreplacecontent);

                //for (int i=0; i<InputMatches.Count; i++)
                while (needreplacecontent.IndexOf(replacedBeforeString) >= 0)
                {
                    needreplacecontent = needreplacecontent.Replace(needreplacecontent.Substring(needreplacecontent.IndexOf(replacedBeforeString), replacedBeforeString.Length), replacedAfterString);
                }

                string replacedContent = needreplacecontent;
                return replacedContent;
            }

            //替换{formula}字符串的方法
            private string DataRegexReplace_formula(string needreplacecontent, string ContentTime)
            {
                string[] sourceFormula = ReadFormula(ContentTime);//此处公式是以前在开发计算机上的绝对地址,需要进行一次相对地址处理,把地址变成服务器上的地址。
                string[] newPathFormula = NewPath(sourceFormula);//处理绝对地址问题
                string replacedBeforeString = "{formula}";

                Regex FormulaRegex = new Regex(replacedBeforeString);
                MatchCollection FormulaMatches = FormulaRegex.Matches(needreplacecontent);
                int i = 0;
                while (needreplacecontent.IndexOf(replacedBeforeString) >= 0)
                {
                    needreplacecontent = needreplacecontent.Replace(needreplacecontent.Substring(needreplacecontent.IndexOf(replacedBeforeString), replacedBeforeString.Length), "<img src=" + newPathFormula[i] + "\" alt=\"公式\"/>");
                    i++;
                }

                string replacedContent = needreplacecontent;
                return replacedContent;
            }

            //图片、公式新地址转换------------------------------------------------------
            //若是在服务器上传的题目图片、公式,则可以不运行这个方法
            private string[] NewPath(string[] oldpathsource)
            {
                //图片文件夹
                string directory = "Picture";
                //获取现在的目标路径
                string thisPhysicalDirectoryPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, directory);
                //获取文件名
                for (int i = 0; i < oldpathsource.Length; i++)
                {
                    string imageName = Path.GetFileName(oldpathsource[i]);
                    oldpathsource[i] = thisPhysicalDirectoryPath + "\\" + imageName;//将新的绝对路径保存在原有数组中
                }

                string[] returesting = oldpathsource;
                return returesting;
            }

        }

    }


    请诸位帮我分析一下是不是我什么地方没有考虑到,教教我怎么分析这个问题。

    我从数据库中读取考题的内容是:1.圆柱有{input}条高,圆锥有{input}条高。

    {input}是考题填写答案的地方,我将它替换为<input type="text" name="useranser">.

    2010年6月10日 6:19
  • 在ASP.NET里使用服务端控件是非常方便的,无论是事件处理还是保存状态。

    比如你的输入框,请用<asp:TextBox ID="tbAnswerInput" .../>来代替<input.../>,这样就可以在后台代码里直接使用tbAnswerInput.Text获取到用户的输入值。

    使用VS IDE来实现事件处理也非常方便的,比如<asp:Button ID="btnSubmit" .../>必须给它加一个实践触发的属性。就变成了<asp:Button ID="btnSubmit" OnClick="OnSubmitClick" .../>,这样必须在后台代码里有一个protected void OnSubmitClick(object sender, EventArgs e);的事件处理方法。


    Facing problems, think first, then search, finally ask.
    2010年6月12日 0:50
    版主
  • Shiny Zhu你好

    在我的考题中所需填写的回答框数量是不固定的,就是说有些题有一个<input />,有些题有四个<input />,我如果使用<asp:TextBox ID="tbAnswerInput" .../>是不是必须在网页上固定该控件,而我是想让网页根据 {input}标志的数量,自动生成相应数量的<input />输入框来实现用户输入回答结果。我使用Request可以从网页读取<input />中的数据。是因为我使用了<input />,导致网页不能读取到 ExamData.ReadAnswer(thisTime)的返回值吗?


    新手学习,再学习......
    2010年6月12日 3:05
  • 不是的,使用标准的HTML控件也是可以获取到值的,从你代码里面来看。

    //从网页收集用户填写的上一题答案
    tempAnswer = Request.Params.GetValues("userAnswer"); 

    是可以获取到页面上所有<input name="userAnswer" />的用户输入值的。

    我大概看了下你的代码,要注意的地方是,在ASP.NET后台代码类里的那些成员,当用户点了“下一题”之后,会重新产生一次Request,页面也会重新填充成员变量的值。比如:

    private int rate = 0;//回答正确率
    string[] tempStandantAnswer;
    string[] tempAnswer;
    string thisTime;
    

    这些值在Submit_Click执行后,会重新赋值。

    最好能用调试模式进行单步分析,看看到底是哪一步出错,因为这代码的确挺多的,我也没有一步一步来试验。


    Facing problems, think first, then search, finally ask.
    2010年6月12日 5:38
    版主
  • 感谢ShinyZhu的回答。

    我想再问一下,我怎样做才能将下面的类似的值保持不变,或者根据我的需要变化,网页的局部更新会影响这些值的变化吗?而且这下面的值都是后台类的字段,这样还是不能保证变量、数组等保持原来的值吗?我应该怎样做才能保持一部分变量保持数据?

    private int rate = 0;//回答正确率
    string[] tempStandantAnswer;
    string[] tempAnswer;
    string thisTime;

    我的想法是:每次点击Submit,都进行一次switch(Submit.Text){}的判断,确定执行哪一段代码。每次代码执行完毕后,上面的变量被操作的就会发生变化。我不希望将上面的整个网页跟着变化。请问有什么办法吗?


    新手学习,再学习......
    2010年6月12日 8:06