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)
{
}
事件中添加什么代码呢?请高手指点,指出问题所在,谢谢!
{
// 在此处放置用户代码以初始化页面
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)
{
}
事件中添加什么代码呢?请高手指点,指出问题所在,谢谢!
解决方案 »
- 讨论:疑问——IBatis的优点何在,为什么要选择IBatis?
- 在线等,谢谢,快救救。
- GridView 绑定问题 在线等!
- 关于文本框输入问题
- 一个javascript验证和Button的Response.Rediect问题!没分了,还希望大家支持!
- 如何处理两个尖括号之间的内容显示到datagrid上?
- 大家帮帮忙,如何获取dataGrid中的值,包括显示出来的值和对应的url
- 新手:关于Request.Form和Request.QueryString
- vc2010,ajax
- 真心求解啊啊,新手没学过mvc就要写代码T_T
- 求救c#转换成VB.NET的工具
- file field 文件上传 文件类型
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
======================================================
欢迎加入.net群:13817403(如果遭拒绝则说明群已满)本人大四,下学期找工作了,各位兄弟帮帮忙
我的简历:http://202.118.70.40/winal/introduce.aspx
======================================================
checkCode哪里来的???
{
}
事件处,如何写,怎么写,我是初手刚刚接触这方面,请指点.
{……}这样的判断,但具体写不出来,写了也测试不通过,还是出问题,请高手清楚的指出,方便理解,感谢!
sorryname0(注注)
Session["CheckCode"] = checkCode;
checkCode哪里来的???
"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();
}
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.NullReferenceException: 未将对象引用设置到对象的实例。不知道应该如何正确的解决....
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;
还是出错...搞不明白...初手不知道怎么样才能正确搞好这个问题...相信很多人都有这样类似的问题.
当一个对象值为null的时候,如果对它做ToString()操作的时候,就会出现"未将对象引用设置到对象的实例。"的错误.
所以一定要先判断值是否为null值
另外,你为什么一定要把Session["VNum"]=null呢?虽然说,可以节省一些资源,但其实起的作用微乎其微.你尝试不要设置它,或是改写为:Session["VNum"]="";看看会不会有问题.
string VNum;if ( VNum==Session["CheckCode"] && null != Session["CheckCode"] )
VNum=Session["CheckCode"].ToString();
ViewState["VNum"]=VNum;
}