C# 检查用户名是否可用或已使用

C# 检查用户名是否可用或已使用,c#,asp.net,visual-studio-2010,ajaxcontroltoolkit,C#,Asp.net,Visual Studio 2010,Ajaxcontroltoolkit,我在ASP.NET C中有一个简单的应用程序,使用MS SQL Server 2008。我需要注册我的网站的所有访问者用户。为此,用户必须填写表格。 问题是,当用户输入所需的用户名字段时,我应该能够在后台检查其他用户是否已经使用该用户名。我必须启动一个sql select查询来检查可用性 目前我正在使用TextBoxName\u TextChanged方法,但它不能实时工作。它只对回发有效。守则如下: protected void TextBox3_TextChanged(object send

我在ASP.NET C中有一个简单的应用程序,使用MS SQL Server 2008。我需要注册我的网站的所有访问者用户。为此,用户必须填写表格。 问题是,当用户输入所需的用户名字段时,我应该能够在后台检查其他用户是否已经使用该用户名。我必须启动一个sql select查询来检查可用性

目前我正在使用TextBoxName\u TextChanged方法,但它不能实时工作。它只对回发有效。守则如下:

protected void TextBox3_TextChanged(object sender, EventArgs e)
        {
            if (TextBox3.Text.Length == 0)
            {
                availability.Text = "";
                return;
            }

            SqlDataAdapter adp = new SqlDataAdapter("select username from users where username='" + TextBox3.Text + "'", con);
            DataSet ds = new DataSet();
            adp.Fill(ds, "users");
            if (ds.Tables["users"].Rows.Count > 0)
            {
                availability.ForeColor = System.Drawing.Color.Red;
                availability.Text = "Not Available";
            }
            else
            {
                availability.ForeColor = System.Drawing.Color.White;
                availability.Text = "Available";
            }

        }
请给我一些建议,因为我在网上搜索的都是PHP,而不是ASP.NET

<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
</asp:UpdatePanel>
    <table cellpadding="5" class="style1"> 
        <tr>
            <td class="style3">
                <asp:Label ID="Label3" runat="server" Text="Username" ForeColor="White"></asp:Label>&nbsp;&nbsp; </td>
            <td style="border:0px none #FF0000;">
                <asp:TextBox ID="TextBox3" runat="server" Width="175px" 
                    CssClass="input-control" ForeColor="Black" ontextchanged="TextBox3_TextChanged" AutoPostBack="true"></asp:TextBox></td>
        </tr>
        <tr>
            <td class="style3"></td>
            <td style="border:0px none #FF0000;"> 

                <asp:Label ID="availability" runat="server" Width="175px" CssClass="text" Text="availability"></asp:Label></td>
        </tr>
        <tr>
            <td class="style3">
                <asp:Label ID="Label4" runat="server" Text="Password" ForeColor="White"></asp:Label>&nbsp;&nbsp;&nbsp; </td>
            <td style="border:0px none #FF0000;">
                <asp:TextBox ID="TextBox4" runat="server" Width="175px" TextMode="Password" CssClass="input-control" ForeColor="Black"></asp:TextBox></td>
        </tr>
        <tr>
            <td class="style3">
                <asp:Label ID="Label5" runat="server" Text="Email" ForeColor="White"></asp:Label>&nbsp;&nbsp;&nbsp; </td>
            <td style="border:0px none #FF0000;">
                <asp:TextBox ID="TextBox5" runat="server" Width="175px" CssClass="input-control" ForeColor="Black"></asp:TextBox></td>
        </tr>

        <tr>

            <td class="style3">

            <td style="width:30%; text-align: right; padding: 10px; border:none;">
                <div class="button-set" data-role="button-set">
                    <asp:Button ID="Button2" runat="server" class="active bg-color-red" Text="Sign Up" />
                </div>
        </tr>
        </table></asp:UpdatePanel>
更新:

根据大家的评论和回答,我取得了这么大的成就,但屏幕截图中显示了一个小问题:
不知道为什么会有另一个带有状态的标签,并且可用性状态保持不变。请提供帮助。

您需要通过AJAX发出请求。连接到文本框客户端的“changed”事件并从那里触发它-最好的选择是使用jQuery,例如

<script text="text/javascript">

$(document).ready(function() {
    var searchTimer;
    ...
    $('TextBox3').change(function() {
        var searchTerm = $(this).val();
        clearTimer(searchTimer);
        searchTimer = setTimeout(1000, function() {
            $.get('findUsers', { userName: searchTerm }, function(response) {
                // process successful response
            }).error(function(error) {
                // process error response
            });
        });
    });
});
<script>

<table>
    ...
    <input type="text" id="TextBox3" />
</table>

在每次文本更改后1秒,上面的命令将向API调用findUsers发出请求。这是为了避免在用户键入时发送不必要的请求,因为您只希望在用户完成后发送请求。

文本框是否具有AutoPostBack=true?
您当然需要在文本框周围添加UpdatePanel,以防止整个页面加载。

我最近构建了此功能,您可以自己尝试

public bool IsExist(string name, string pass)  /// in your case you only need to save the textbox on a string variable
    {
        string sql = "select * from Users where UName='" + name + "' and Pass='" + pass + "'"; ; 
        DataSet ds = General.GetData(sql); // General class has function called GetData which obviouslly gets the data of the required SQL information.
        if (ds.Tables[0].Rows.Count > 0)
            return true;
        return false;
    }

我相信您的更新面板格式不好。您需要将可用性标签放入更新面板,然后为用户名文本框设置触发器,然后设置事件名称。 比如:

 <asp:UpdatePanel ID="UpdatePanel1" runat="server">
  <ContentTemplate>
    <asp:Label ID="availability" AppendDataBoundItems="true" runat="server" >                                         
    </asp:Label>
  </ContentTemplate>
  <Triggers>
   <asp:AsyncPostBackTrigger ControlID="TextBox3" EventName="TextChanged" />
    </Triggers>
 </asp:UpdatePanel>
您还需要在文本框中设置AutoPostBack=True。
我想它会起作用的

最后,多亏了所有感兴趣并尝试过的人,我终于成功了。 解决方案是对每个OnkeyUp事件进行回发,这可以使用JS完成

标记是

<asp:TextBox ID="TextBox3" runat="server" Width="175px" 
                    CssClass="input-control" ForeColor="Black" onkeyup="RefreshUpdatePanel();" ontextchanged="TextBox3_TextChanged" AutoPostBack="false"></asp:TextBox>

<asp:UpdatePanel ID="UpdatePanel1" runat="server">
                    <ContentTemplate><asp:Label ID="availability" runat="server" Width="175px" CssClass="text" Text="availability_label"></asp:Label>
                    </ContentTemplate>
                    <Triggers>
                        <asp:AsyncPostBackTrigger ControlID="TextBox3" EventName="TextChanged" />
                    </Triggers>
Javascript是:

<script type="text/javascript">
      function RefreshUpdatePanel() {
          __doPostBack('<%= TextBox3.ClientID %>', '');
      };
</script>
用于检查用户名是否存在的代码写在

TextBox3\u TextChanged方法。成功了


使用人的电子邮件不太可能被使用两次。请建议解决方案,而不是替代方案。我可能觉得还需要检查现有的电子邮件,这样就不会有重复的邮件。我添加了一个更新面板,但它仍然会在TextBox失去焦点时刷新整个页面。您可以添加声明UpdatePanel和TextBox的代码部分吗?您的UpdatePanel格式不正确。它关闭了两次。应该是这样的:标签+文本框需要在更新面板中。把你所有的表格都放进去,这样比较容易。我怎么做?我想这就是我想要的,当我键入那个文本框的时候,它一直在激发SQL查询。@ SamarthArgarwal,我正在添加一个例子,我在我的手机上,不太容易键入/格式化代码!这个例子使用的是哪种语言?它是Javascript,它也使用Javascript,这使得编写客户端AJAX请求变得简单,如示例所示。感谢您的努力。我一点也不想理解它!我有一个ASP.NET项目。我应该把它放在哪里?Op不是问如何查询他们的DB,而是问如何在不必回发的情况下查询。在UpdatePanel“UpdatePanel1”中的触发器的关联控件“TextBox3_TextChanged”上找不到名为“TextBox3_TextChanged”的事件。请仔细检查事件名称!触发器中的事件名称必须单独更改。好的,它正在工作。但它只在文本框失去焦点时更新标签。是否存在这样的情况,以便标签随我键入的每个字符更新?默认情况下,回发仅在您将焦点放在文本框上时发送,如果您希望在字符键入时触发事件,则需要在字符键入时发送回发。我以前从来没做过,但这是可能的。让我来做吧。需要一些时间,对不起。提示:我认为我们必须使用javascript手动发送回发。检查这些是否有用: