none
asp:button控件点击弹出提示窗口会刷新页面的问题 RRS feed

  • 问题

  • 有个用javascript控制的显示与隐藏层(一个TABLE),
    这个层默认是显示的

    同一页面中有登录框。
    假如此时控制层是隐藏的,
    输入用户名和密码之后点击服务器控件(登录按钮)asp:button之后,会判断一下,如果密码错误,则弹出提示窗口:
    Response.Write("<script language=javascript>alert('密码错误,请重新输入!')</script>");
    这个时候页面会刷新一次,而控制层的状态也将变成显示的(默认),
    而我需要的是控制层还维持在弹出提示窗口之前的状态

    请问如何解决解决这个问题?

    2009年9月28日 2:53

答案

  • 用ASP.NET做的页面里有一个服务端的Form,所有服务端的控件在这个Form里执行的服务端事件都要提交这个表单,然后服务端执行程序,这就叫PostBack。
    这就是你看到页面刷新的原因。

    一般做客户端验证就是在提交这个Form之前,这样就不存在刷新了。

    我给一段页面代码看看:

    <body>
    <form id="form1" runat="server">
    <div>
        <asp:TextBox ID="tbInput" runat="server" />
        <asp:Button ID="btnSubmit" runat="server" Text="提交" OnClick="OnSubmitButtonClick" />
    </div>
    </form>
    
    <script type="text/javascript" src="http://www.google.com/jsapi"></script>
    <script type="text/javascript">
        google.load('jquery', '1.3.2');
        google.setOnLoadCallback(function() {
            $('#<%= btnSubmit.ClientID %>').click(function() {
                var input = $('#<%=tbInput.ClientID %>').val();
    
                if (input == '') {
                    alert('输入不完整,请重新输入。');
                    return false;
                } else {
                    return true;
                }
            });
        });
    </script>
    </body>
    

    Facing problems, think first, then search, finally ask.
    • 已标记为答案 黄昏 2009年9月28日 8:55
    2009年9月28日 6:36
    版主

全部回复

  • 不要PostBack,让js在客户端执行验证。

    一般的过程是客户端js会截获Button的提交,判断客户端的输入是否符合前端验证规则,如果判断失败,仅仅用js来提示用户,而不是用服务端的输出来提示。

    如果你要判断用户登录信息的正确性,这个无法用客户端脚本来验证,因为可能还要查数据库。可以使用ajax执行一个异步验证,但一般不建议这么做,客户端仅仅验证简单的输入合法性就可以了。


    Facing problems, think first, then search, finally ask.
    2009年9月28日 3:01
    版主
  • 你好!

    你可以试试使用 Label 来显示错误信息的方式来代替 js 的 alert

    知识改变命运,奋斗成就人生!
    2009年9月28日 3:07
    版主
  • 你好!
    我试过了,即使button按钮事件里没有代码也会刷新页面的。
    2009年9月28日 3:19
  • 你好!

    PostBack 就会刷新,如果你想不刷新 Shiny Zhu 已给出方法了。

    知识改变命运,奋斗成就人生!
    2009年9月28日 3:21
    版主
  • 能否说的具体点吗?
    我是直接使用的服务器button按钮,在它的点击事件里写的输出代码.
    你说的不要PostBack,让JS在客户端执行验证?没看明白。
    这个PostBack不就是回发吗?我并没有设置它啊
    br/>至于ajax还没用过呢。
    2009年9月28日 3:23
  • 你可以将你需要隐藏的东西放倒一个Panel里,点击Button后在cs文件里设置Panel的Visiable属性为false。
    做最好的自己
    2009年9月28日 5:44
  • 建议学习学习ajax,现在web的开发ajax已经是一种基本的技术了。
    ajax能够让你节省很多服务器资源。
    做最好的自己
    2009年9月28日 5:45
  • 你可以将显示\隐藏的状态放在隐藏的文本框里传递回去。在服务器端设置你的层的显示与隐藏
    【孟子E章】
    2009年9月28日 6:11
    版主
  • 你可以将你需要隐藏的东西放倒一个Panel里,点击Button后在cs文件里设置Panel的Visiable属性为false。
    做最好的自己

    你好,我现在就是用的这种方法,只是用JS控制的层看起来更舒服一些而已,所以才想使用JS的方式的。
    2009年9月28日 6:11
  • 顺带问一下。
    Shiny Zhu 已给出的方法中,关于 “不要PostBack,让js在客户端执行验证”这句话是什么意思?
    现在我都是自己摸索的,很多东西都不明白。

    2009年9月28日 6:15
  • 用ASP.NET做的页面里有一个服务端的Form,所有服务端的控件在这个Form里执行的服务端事件都要提交这个表单,然后服务端执行程序,这就叫PostBack。
    这就是你看到页面刷新的原因。

    一般做客户端验证就是在提交这个Form之前,这样就不存在刷新了。

    我给一段页面代码看看:

    <body>
    <form id="form1" runat="server">
    <div>
        <asp:TextBox ID="tbInput" runat="server" />
        <asp:Button ID="btnSubmit" runat="server" Text="提交" OnClick="OnSubmitButtonClick" />
    </div>
    </form>
    
    <script type="text/javascript" src="http://www.google.com/jsapi"></script>
    <script type="text/javascript">
        google.load('jquery', '1.3.2');
        google.setOnLoadCallback(function() {
            $('#<%= btnSubmit.ClientID %>').click(function() {
                var input = $('#<%=tbInput.ClientID %>').val();
    
                if (input == '') {
                    alert('输入不完整,请重新输入。');
                    return false;
                } else {
                    return true;
                }
            });
        });
    </script>
    </body>
    

    Facing problems, think first, then search, finally ask.
    • 已标记为答案 黄昏 2009年9月28日 8:55
    2009年9月28日 6:36
    版主