该怎么说好呢??下面一个生成验证码的字符串的代码,验证码图片产生的代码就不贴了public partial class Login : System.Web.UI.Page
{
    private static string sValidator = "";
    private readonly string sValitorImageUrl = "ValidateImage.aspx?Validator=";
    private StringBuilder LetterList = new StringBuilder();//可变字符串,用于生成验证码
        protected void Page_Load(object sender, EventArgs e)
    {
        lab_RegistID.Text = Session["RegistID"].ToString();
        if (!Page.IsPostBack)
        {
            sValidator = CreatValitedateString(6);
            ValidateImageLo.ImageUrl = sValitorImageUrl + sValidator;
            compValidator = sValidator;
        }
    }    private int GetRandomint(int min, int max)//获取基础字符串的随机数位
    {
        Random random = new Random();        return (random.Next(min, max));    }    private void GetLeterlist()//创建验证码的基础字符串
    {
        for (int i = 0; i < 10; i++)
        {
            LetterList.Append(i.ToString());        }
        for (int i = 0; i < 26; i++)
        {
            LetterList.Append(((char)(i + (int)'a')).ToString());
        }
        for (int i = 0; i < 26; i++)
        {
            LetterList.Append(((char)(i + (int)'A')).ToString());
        }
    }    private string CreatValitedateString(int n)
    {
        GetLeterlist();        StringBuilder vs = new StringBuilder();
        for (int i = 0; i < n; i++)
        {
            int index = GetRandomint(0, LetterList.Length - 1);
            vs.Append(LetterList[index].ToString());
            LetterList.Remove(index, 1);
        }
        return (vs.ToString());    }
    protected void btn_Login_Click(object sender, EventArgs e)
    {        if (txt_VlidateNum.Text != sValidator)
        {
            lab_ValidateMsg.Text = "请输入正确的验证码!";
                       return;        }
        else
        {
            Response.Redirect("~/HomePage.aspx");
        }
                
    }
}
情况是这样的:
进行断点测试,断点位置有:load代码全部,和 btn_Login_Click事件的if判断当登录页面打开,load过后,sValidator有一个6位字符串,如:123456然后弹出页面了,这时我在验证码框填入123456,然后按登录按钮奇怪的是,又调回load代码了,接着sValidator理所当然就变了,下面的if判断根本通过不了为什么我登录按钮的click事件会重新触发load,找了很久,还是一头雾水啊
请各为耐心看看我的问题,谢了

解决方案 »

  1.   

    1.首先这个问题应该是不会出现的,因为服务器按钮回发的确可以导致页面重新加载,然而Page.IsPostBack如果是控件触发的话应该已经为True,进不到判断,因此sValidator 应该还是第一次页面加载时候创建的字符2.验证码放在全局变量里本身就是错误的,多用户访问肯定会造成混乱,验证码一般保存在Session中,每产生一个会话,也就相应产生该会话的验证码,会话之间互不影响
      

  2.   

    为什么我登录按钮的click事件会重新触发load,找了很久,还是一头雾水啊onclick会先执行 onload事件然后在执行onclick事件服务器控件说明了一个是表单提交。POST到本页面。在if(!dopostback中不会执行POST的代码。) 直接用设个全局变量做嘛。 Session["RegistID"].ToString();
      

  3.   

    页面重新加载,但是pageload事件里面的代码不执行,如楼上所说用session储存即可
      

  4.   


    public string Text 
    {   
         get { return (string)ViewState["Text"]; }   
         set { ViewState["Text"] = value; }
    }
    用ViewState保存当前页面变量状态。不要用session...session除了保存当前登录信息,基本能不用就不用。
      

  5.   


    不明白啊,就是判断Session["RegistID"]是不是NULL就行了?
    那个load的问题解决了但,又有个不懂的:
    就是 我用一个LinkBtton想来执行刷新验证码的
    但是clik事件没发生前,RequiredFieldValidator就提示验证码不能为空了
    应该怎么做?才能绕开?
      

  6.   

    我用一个LinkBtton想来执行刷新验证码的
    但是clik事件没发生前,RequiredFieldValidator就提示验证码不能为空了
    应该怎么做?才能绕开?
    =====
    其实不用linkbutton来刷新 用啊function DianJi()//刷新验证码
        { document.getElementById("yan").src = "../include/ValidateCode.aspx" + "?" + Math.random(); }<img id="yan" alt="刷新验证码"  style=" cursor:pointer" onclick="javascript:DianJi();" src="../include/ValidateCode.aspx"  />
      

  7.   


       private string sValidator 
        {
            get
            {
                object obj = this.ViewState["sValidator "];
                return ViewState["sValidator "] == null ? "" : obj.ToString();
            }
            set
            {
                ViewState["sValidator "] = value;
            }
        }
    可以放在ViewState里面保存,代码如上
      

  8.   

    我点第一次图片可以刷新,但是点第二次就不行了
     <script type="text/javascript">
         function Change() {
        
         var a = "<%=CreatValitedateString(6)%>";
         document.getElementById("ValidateImage").src = "ValidateImage.aspx?Validator=" + a;
         
         }
     </script>  
      

  9.   

    完全没有必要啊
    你应该
    <script type="text/javascript">
      function Change() {
       
      var a = document.getElementById("ValidateImage").src;
      if(a.indexOf("&")>-1) a = a.split("&")[0]
      document.getElementById("ValidateImage").src = a + "&tmp=" + (new Date()).valueOf();
       
      }
     </script> 
      

  10.   

    本帖最后由 net_lover 于 2012-08-17 07:10:15 编辑
      

  11.   

    哦,我已经去掉Validator参数了,在CreatValitedateString(6)里生成字符串时,直接给session["validateNum"],是这样吗?
      

  12.   

    验证码的生成是在ValidateImage.aspx页面里的。在其他页面的无效