C# 自动回发和RequiredFieldValidator行为

C# 自动回发和RequiredFieldValidator行为,c#,asp.net,requiredfieldvalidator,autopostback,C#,Asp.net,Requiredfieldvalidator,Autopostback,我有一个带有AutoPostBack属性和RequiredFieldValidator的用户名文本框。问题是当我在文本框中键入内容然后从中出来时,因此触发AutoPostBack现在如果我回到文本框并删除我键入的内容,然后从文本框中出来,表单将显示消息“用户名是必需的”,但它只会闪烁一秒钟,然后页面就会刷新。我不理解这种行为。我是否可以更改表单,使“用户名是必需的”消息保持不变或根本不闪烁。 如果我没有输入就从文本框中出来,什么也不会发生(我想甚至是AutoPostBack都不会发生) 另一个问

我有一个带有
AutoPostBack
属性和
RequiredFieldValidator
的用户名文本框。问题是当我在文本框中键入内容然后从中出来时,因此触发
AutoPostBack
现在如果我回到文本框并删除我键入的内容,然后从文本框中出来,表单将显示消息“用户名是必需的”,但它只会闪烁一秒钟,然后页面就会刷新。
我不理解这种行为。我是否可以更改表单,使“用户名是必需的”消息保持不变或根本不闪烁。 如果我没有输入就从文本框中出来,什么也不会发生(我想甚至是
AutoPostBack
都不会发生)
另一个问题是相同的,但我认为我的怀疑有点不同:
如果文本框为空,我按tab键,或者实际触发了
RequiredFieldValidator
,为什么没有触发
RequiredFieldValidator

如果
RequiredFieldValidator
无效,为什么
AutoPostBack
仍会出现,在页面生命周期中之前没有检查验证程序吗?

using System;
using System.Data;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.SqlClient;
using System.Configuration;

namespace Registration_LoginPortel
{
public partial class RegistrationPage : System.Web.UI.Page
{
    int i = 0;
    protected void Page_Load(object sender, EventArgs e)
    {



    }
    protected void SubmitButton_Click(object sender, EventArgs e)
    {
        lblLoginAvailable.Visible = false;
        Response.Write("PPpostback" + (++i));
        if (!CheckLogin(Usn.Text.ToString().Trim()))
        {
            //Register the user
            try
            {
                SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["RegistrationConnectionString"].ConnectionString);
                con.Open(); string s = Usn.Text;
                string sql_insertQuery = "INSERT INTO UserData(username,password,country)values (@UName,@UPass,@UCountry)";
                //string sql_insertQuery = "INSERT into UserData(username,password,country) VALUES ('"+Usn.Text+"','"+pass.Text+"','"+country.Text+"')";
                SqlCommand com = new SqlCommand(sql_insertQuery, con);
                com.Parameters.AddWithValue("@UName", Usn.Text);
                com.Parameters.AddWithValue("@UPass", pass.Text);
                com.Parameters.AddWithValue("@UCountry", country.Text);

                com.ExecuteNonQuery();
                // Response.Redirect("Admin.aspx");
                Response.Write("Registration is successfull");
                con.Close();
            }
            catch (Exception ex)
            {
                //Response.Write("Error : " + ex.Message);
                Response.Write("\n\nError : " + ex.ToString());
            }
        }
        else
        {
            lblLoginAvailable.Visible = true;
            lblLoginAvailable.Text = "This login already exists in our system. Chooce another login please";
        }
    }
    protected bool CheckLogin(string login)
    {
        SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["RegistrationConnectionString"].ConnectionString);
        SqlCommand cmd = new SqlCommand("select count(*) from UserData where lower(username) = lower(@login)", con);
        cmd.Parameters.Add("@login", SqlDbType.VarChar).Value = login;
        string id = "";
        try
        {
            con.Open();
            id = (int)cmd.ExecuteScalar() == 0 ? "" : cmd.ExecuteScalar().ToString();
        }
        catch (Exception ex)
        {
            //...
        }
        finally
        {
            con.Close();
        }
        if (String.IsNullOrEmpty(id)) return false;
        return true;
    }


    protected void Usn_TextChanged(object sender, EventArgs e)
    {
        lblLoginAvailable.Visible = false;

    }

}

}

页面正在发回,因此返回到服务器并与RequiredFieldValidator发生冲突。在后台,RequiredFieldValidator将Javascript传递到页面,然后页面将发挥其魔力并检查是否需要显示消息。当发回事件触发时,它将发布整个页面返回,返回时会重新加载页面,从而丢失UI上的jscript消息


我建议不要使用类似的自动回发功能,因为它会将不必要的负载加载到服务器上。您希望该事件具体执行什么操作?

您可以删除您的requiredfieldvalidator,按钮的代码为:

<asp:Button ID="btnSubmit" runat="server" OnClientClick="return checkvalue();" OnClick="Button_Click" />

checkvalue()是一个javascript方法,使用它可以检查文本框的值

<script type="text/javascript">
    function checkvalue(){
        var txt = document.getElementById("yourTextboxId");
        if (txt.value.length == 0){
            alert('Insert a data');
            txt.focus();
            return false;
        }
        return true;
    }
</script>

函数checkvalue(){
var txt=document.getElementById(“yourTextboxId”);
如果(txt.value.length==0){
警报(“插入数据”);
txt.focus();
返回false;
}
返回true;
}
此脚本仅在用户单击按钮时才会出现,不会触发回发。此脚本将检查文本框内文本的长度,如果长度为0,则表示未输入文本,将要求用户输入文本,光标将自动设置为文本框控件


希望它有帮助

可能重复@MethodMan:Edited my question使用google作为示例..而且因为你没有发布.aspx,所以任何人都很难确定你在哪里犯了错误我只是想假设当我按submit并得到类似“Username exists”的东西时“然后,即使我更改了用户名,错误消息仍将保留,直到我再次按下提交按钮。这就像说“用户名存在”在屏幕上,当它实际上不存在时。这将为第一次做事情的新手用户,尤其是我的目标受众,造成混乱。我可能会避免在有帐户时通知用户,这可能是一种数据泄漏形式,如果潜在黑客知道进行黑客攻击所需凭据的一半,则可能会被认为不太安全。除此之外,我将删除回发事件,并让Javascript完成验证工作。所需的字段验证器应该停止submit事件触发的post back,前提是您已正确连接它。将autopostback设置为false(或将其删除),然后查看它是否工作。感谢所有的答案,它的工作方式与我希望的一样。@abhishekjaiswal欢迎您!如果您需要,请发布您的问题。我们会尽力帮助你。