我有一个用来修改password的页面,里面有一个CustomValidator在服务器端检查用户填写的email和旧的password是否合法。然后如果Page.IsValid,就把新的password更新到数据库,然后javascript:alert()通知用户密码更新成功。但现在这个页面出了点问题,就是在密码被更新之后,页面又在进行了一次Page.Validate,然后显示旧的password错误,其实是password已被更新。主要有关的部分如下:private void Page_Load(object sender, System.EventArgs e)
{
if (Page.IsPostBack)
{
Page.Validate();
\\这里的检查证明Page.IsValid=true了才更新password的。
if (Page.IsValid)
{
dataProvider.Execute(@"Update [User] Set [TimeStamp]=Now, UserPassword='"+FormsAuthentication.HashPasswordForStoringInConfigFile(txtNewPassword.Text,"md5").Replace("'","''")+"' Where UserEmail='"+txtEmail.Text.Replace("'","''")+"' And UserPassword='"+FormsAuthentication.HashPasswordForStoringInConfigFile(txtOldPassword.Text,"md5").Replace("'","''")+"'");
Response.Write(@"<script language=""javascript"">alert(""Password updated."");</script>");
}
}
}\\这是验证旧password是否正确的过程。
private void cvEmailPassword_ServerValidate(object source, System.Web.UI.WebControls.ServerValidateEventArgs args)
{
DataSet ds=dataProvider.Query(@"Select UserEmail From [User] Where UserEmail='"+txtEmail.Text.Replace("'","''")+"' And UserPassword='"+FormsAuthentication.HashPasswordForStoringInConfigFile(txtOldPassword.Text,"md5").Replace("'","''")+"'");
if (ds.Tables[0].Rows.Count==0)
args.IsValid=false;
else
args.IsValid=true;
}

解决方案 »

  1.   

    if (!Page.IsPostBack)
    {
    if (Page.IsValid)
    {
    //////
    }
    }
      

  2.   

    为什么是(!Page.IsPostBack)呢?或许我没有把问题说清楚。我现在的问题是:
    明明已经显性调用了一次Page.Validate(),而且也通过了,才更新数据库的password的,而且javascript:alert()也显示了,理论上也就应该这样完成这次请求。
    但之后肯定又被隐性的调用了一次Page.Validate(),于是cvEmailPassword的警告信息被显示出来了,这到底是怎么回事呢?是什么又驱动了一次Page.Validate()呢?而且是在if (Page.IsValid)语句之后。
      

  3.   

    if (Page.IsPostBack)
    {
    Page.Validate();
    \\这里的检查证明Page.IsValid=true了才更新password的。
    if (Page.IsValid)
    {
    Page_Loae(Object sender,EventArgs e)方法可由页面的很多动作来引发,只要有EventArgs的事件源,就有可能引发。
      

  4.   

    你的意思是因为Page_Load多触发,所以其中调用的Page.Validate()也多触发了?另外我通过Response.Write(@"<script language=""javascript"">alert(""something"");</script>");的方法,证明了cvEmailPassword_ServerValidate第一次被调用并返回true,然后password被更新,然后cvEmailPassword_ServerValidate再次被调用并返回false。这个问题有什么解决方法吗?除了另外增加一个变量来标记password是否已经手动更新过而不再需要校验了——因为这样看起来影响程序的结构。
      

  5.   

    这个问题,只能散分……到底是不是ASP.NET的bug啊。