AutoPostBack 和 RequiredFieldValidator 行为
AutoPostBack and RequiredFieldValidator behaviour
我有一个带有 AutoPostBack
属性 和 RequiredFieldValidator
的用户名文本框。问题是当我在文本框中输入内容然后退出它从而触发 AutoPostBack
现在,如果我回到文本框并删除我输入的内容,然后从文本框出来,表单会显示消息 "Username is required" 但它只会闪烁一秒钟,然后页面会刷新。
我不明白这种行为。我能否以某种方式更改表单,以便 "Username is required" 消息保留或根本不闪烁。
如果我不输入任何内容就退出文本框(我认为甚至 AutoPostBack
)
另一个问题是一样的,但我想我的疑惑有点不同:
为什么 RequiredFieldValidator
如果文本框为空并且我按下 Tab 或实际触发 RequiredFieldValidator
如果RequiredFieldValidator
无效为什么还会出现AutoPostBack
,页面生命周期之前没有检查Validators吗?
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 传递给页面,该页面然后发挥其魔力并检查是否需要显示消息。当回发事件被触发时,它会回发整个页面,并且在 return 上它会重新加载页面,从而丢失 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>
此脚本仅在用户单击按钮时才会出现,不会触发回传。此脚本将检查文本框中文本的长度,如果长度为 0,这意味着没有输入文本,将要求用户输入文本,光标将自动设置为文本框控件。
希望对您有所帮助
我有一个带有 AutoPostBack
属性 和 RequiredFieldValidator
的用户名文本框。问题是当我在文本框中输入内容然后退出它从而触发 AutoPostBack
现在,如果我回到文本框并删除我输入的内容,然后从文本框出来,表单会显示消息 "Username is required" 但它只会闪烁一秒钟,然后页面会刷新。
我不明白这种行为。我能否以某种方式更改表单,以便 "Username is required" 消息保留或根本不闪烁。
如果我不输入任何内容就退出文本框(我认为甚至 AutoPostBack
)
另一个问题是一样的,但我想我的疑惑有点不同:
为什么 RequiredFieldValidator
如果文本框为空并且我按下 Tab 或实际触发 RequiredFieldValidator
如果RequiredFieldValidator
无效为什么还会出现AutoPostBack
,页面生命周期之前没有检查Validators吗?
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 传递给页面,该页面然后发挥其魔力并检查是否需要显示消息。当回发事件被触发时,它会回发整个页面,并且在 return 上它会重新加载页面,从而丢失 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>
此脚本仅在用户单击按钮时才会出现,不会触发回传。此脚本将检查文本框中文本的长度,如果长度为 0,这意味着没有输入文本,将要求用户输入文本,光标将自动设置为文本框控件。
希望对您有所帮助