ASP.NET的验证码问题,实在难以琢磨,很难解决,每次一打开Login.aspx这个页面,(每个页面中都有判断Session是否为空)总出现"未将对象引用设置到对象的实例。 "新建了一个页面ValidateCode.aspx,在ValidateCode.aspx.cs文件中添加如下代码private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
if (!Page.IsPostBack)
{
string checkCode = CreateRandomCode(4);
Session["CheckCode"] = checkCode;
CreateImage(checkCode);
}
} private string CreateRandomCode(int codeCount)
{
string allChar = "0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,W,X,Y,Z" ;
string[] allCharArray = allChar.Split(',');
string randomCode = "";
int temp = -1; Random rand = new Random();
for(int i = 0; i < codeCount; i++)
{
if(temp != -1)
{
rand = new Random(i*temp*((int)DateTime.Now.Ticks));
}
int t = rand.Next(35);
if(temp == t)
{
return CreateRandomCode(codeCount);
}
temp = t;
randomCode += allCharArray[t];
}
return randomCode;
}
private void CreateImage(string checkCode)
{
int iwidth = (int)(checkCode.Length * 11.5);
System.Drawing.Bitmap image = new System.Drawing.Bitmap(iwidth, 20);
Graphics g = Graphics.FromImage(image);
Font f = new System.Drawing.Font("Arial", 10, System.Drawing.FontStyle.Bold);
Brush b = new System.Drawing.SolidBrush(Color.White);
//g.FillRectangle(new System.Drawing.SolidBrush(Color.Blue),0,0,image.Width, image.Height);
g.Clear(Color.Blue);
g.DrawString(checkCode, f, b, 3, 3); Pen blackPen = new Pen(Color.Black, 0);
Random rand = new Random();
for (int i=0;i<5;i++)
{
int y = rand.Next(image.Height);
g.DrawLine(blackPen,0,y,image.Width,y);
}
            
System.IO.MemoryStream ms = new System.IO.MemoryStream();
image.Save(ms,System.Drawing.Imaging.ImageFormat.Jpeg);
Response.ClearContent();
Response.ContentType = "image/Jpeg";
Response.BinaryWrite(ms.ToArray());
g.Dispose();
image.Dispose();

}在Login.aspx页面中,验证码处加入<img src='ValidateCode.aspx'>调用ValidateCode.aspx我在Login.aspx.cs文件中,加入代码如下,只在单击按钮事件处添加如下代码
 string VNum;     VNum=Session["CheckCode"].ToString();     ViewState["VNum"]=VNum;然后又判断一下if (Request["TextBox3"]==ViewState["VNum"].ToString())
是否相等,这个倒没有问题..关键问题就是每次只要一打开这个Login.aspx页面,就出现"未将对象引用设置到对象的实例。"是不是需要在 private void Page_Load(object sender, System.EventArgs e)
{
}
事件中添加什么代码呢?请高手指点,指出问题所在,谢谢!

解决方案 »

  1.   

    我想主要是第一次运行时Session["CheckCode"]还没有生成,所以就出错了,加一个判断Session["CheckCode"]是否为null的应该可以解决:
    if (Session["CheckCode"]==null)
    {……}
    楼主可以看看QuickStart里关于Session使用的例子:
    http://chs.gotdotnet.com/quickstart/util/srcview.aspx?path=/quickstart/aspplus/samples/apps/session1/session1.src&file=CS\Global.asax&font=3
      

  2.   

    >>wgqqgw(小强) 说得对阿,你得先生成Session["CheckCode"]阿
    ======================================================
    欢迎加入.net群:13817403(如果遭拒绝则说明群已满)本人大四,下学期找工作了,各位兄弟帮帮忙
    我的简历:http://202.118.70.40/winal/introduce.aspx
    ======================================================
      

  3.   

    Session["CheckCode"] = checkCode;
    checkCode哪里来的???
      

  4.   

    按照上面的代码,我应该在private void Page_Load(object sender, System.EventArgs e)
    {
    }
    事件处,如何写,怎么写,我是初手刚刚接触这方面,请指点.
      

  5.   

    我知道应该是if (Session["CheckCode"]==null)
    {……}这样的判断,但具体写不出来,写了也测试不通过,还是出问题,请高手清楚的指出,方便理解,感谢!
      

  6.   

    再问!!!!!!!!!!!!!
    sorryname0(注注) 
    Session["CheckCode"] = checkCode;
    checkCode哪里来的???
      

  7.   

    谢谢adandelion(猪头) 解答ValidateCode.aspx这个页代码如下.
    "Session["CheckCode"] = checkCode;"
    private void Page_Load(object sender, System.EventArgs e)
    {
    // 在此处放置用户代码以初始化页面

    string checkCode = CreateRandomCode(4);
    Session["CheckCode"] = checkCode;
    CreateImage(checkCode);

    } private string CreateRandomCode(int codeCount)
    {
    string allChar = "0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,W,X,Y,Z" ;
    string[] allCharArray = allChar.Split(',');
    string randomCode = "";
    int temp = -1; Random rand = new Random();
    for(int i = 0; i < codeCount; i++)
    {
    if(temp != -1)
    {
    rand = new Random(i*temp*((int)DateTime.Now.Ticks));
    }
    int t = rand.Next(35);
    if(temp == t)
    {
    return CreateRandomCode(codeCount);
    }
    temp = t;
    randomCode += allCharArray[t];
    }
    return randomCode;
    }
    private void CreateImage(string checkCode)
    {
    int iwidth = (int)(checkCode.Length * 11.5);
    System.Drawing.Bitmap image = new System.Drawing.Bitmap(iwidth, 20);
    Graphics g = Graphics.FromImage(image);
    Font f = new System.Drawing.Font("Arial", 10, System.Drawing.FontStyle.Bold);
    Brush b = new System.Drawing.SolidBrush(Color.White);
    //g.FillRectangle(new System.Drawing.SolidBrush(Color.Blue),0,0,image.Width, image.Height);
    g.Clear(Color.Blue);
    g.DrawString(checkCode, f, b, 3, 3); Pen blackPen = new Pen(Color.Black, 0);
    Random rand = new Random();
    for (int i=0;i<5;i++)
    {
    int y = rand.Next(image.Height);
    g.DrawLine(blackPen,0,y,image.Width,y);
    }
                
    System.IO.MemoryStream ms = new System.IO.MemoryStream();
    image.Save(ms,System.Drawing.Imaging.ImageFormat.Jpeg);
    Response.ClearContent();
    Response.ContentType = "image/Jpeg";
    Response.BinaryWrite(ms.ToArray());
    g.Dispose();
    image.Dispose();

    }
      

  8.   

    是因为你的Session.Abandon()让所有变量过期了,如果有让一个变量失效,可为它赋空值,比如session("a")="",但不可以Session.Abandon();
      

  9.   

    加过了,测试一下,还一样出现问题.未将对象引用设置到对象的实例。 
    说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.NullReferenceException: 未将对象引用设置到对象的实例。不知道应该如何正确的解决....
      

  10.   

    Session["CheckCode"] 不能=null
      

  11.   

    我在Login.aspx.cs的事件中
    private void Page_Load(object sender, System.EventArgs e)
    {
                       }
    加入下面代码string VNum = "";
    if (Session["CheckCode"]!=null)
    {
    VNum=Session["CheckCode"].ToString();
    Session.Abandon();
    ViewState["VNum"]=VNum;
    }这个进修,可以执行,但不能正常登陆,我想可能是受Session.Abandon();影响吧.后来
    将Session.Abandon();换成Session["VNum"]=null;
    还是出错...搞不明白...初手不知道怎么样才能正确搞好这个问题...相信很多人都有这样类似的问题.
      

  12.   

    有一个很重要的地方要记住
    当一个对象值为null的时候,如果对它做ToString()操作的时候,就会出现"未将对象引用设置到对象的实例。"的错误.
    所以一定要先判断值是否为null值
    另外,你为什么一定要把Session["VNum"]=null呢?虽然说,可以节省一些资源,但其实起的作用微乎其微.你尝试不要设置它,或是改写为:Session["VNum"]="";看看会不会有问题.
      

  13.   

    要么在session_onstart里面预先定义好你后面程序需要用到的session变量
      

  14.   

    我在Login.aspx.cs文件中,加入代码如下,只在单击按钮事件处添加如下代码
     string VNum;if ( VNum==Session["CheckCode"] && null != Session["CheckCode"] )
         VNum=Session["CheckCode"].ToString();
         ViewState["VNum"]=VNum;
    }
      

  15.   

    首先取用时应判断是否为null,再次赋值后其它页面有没有把session清空,都要检查一下的!取用session时肯定得要判断是否为null的,因为session会超时,那样会报错的