发现在客户端能实行的js代码有时在服务器端没法实行;如:
<input id="Button2" type="button" value="button" onclick="javascript:window.location.href='http://www.sina.com.cn'"/>

<asp:Button ID="Button1" runat="server"  Text="Button" OnClientClick="javascript:window.location.href='http://www.sina.com.cn'"/>
求解。

解决方案 »

  1.   

    你可以在cs文件中写如下:
    Button1.Attributes.Add("onclick","return func()")
    客户端js代码
    function func()
    {
    window.location.href="http://www.sina.com.cn";
    }
    试试
      

  2.   

    我也没有看到OnClientClick事件啊?你的是?
      

  3.   

    其实没有客户端控件这种东西。asp.net控件可以细分为3类,WebControl、HTMLControl、UserControl。他们全都是Control,既全都是在服务器端执行全部控件处理流程(Init、ProcessState、ProccessPostData、Load、RaiseCallbackEvent、RaisePostDataEvent、RaisePostbackEvent、Render等等,每一个控件都有不下30个“关”需要过)。<input id="Button2" type="button" value="button" onclick="javascript:window.location.href='http://www.sina.com.cn'"/>上面这个被asp.net解释成这样的代码:LiteralControl ctrl=new LiteralControl();
    ctrl.Text="<input id=\"Button2\" type=\"button\" value=\"button\" onclick=\"javascript:window.location.href='http://www.sina.com.cn'\"/>";之后,就作为普通的服务器控件处理了。因此,这里的onclick仅仅是个毫无疑义的字符串!服务器才不管它是什么东西,仅仅把它传给客户端去处理。因此,实际上目前没有理由、不用类比地推理出 OnClientClick。
      

  4.   

    安全吗?这么说那个要在button里实现<a></a>功能的是没法实现的??
      

  5.   

    所有的control都有一个Attributes集合,几乎所有的control的控件都会去处理这个集合(但是LiteralControl等少数几个不会)。你可以把你想要让控件输出在tag后边的自定义属性写入这个集合。例如你可以写:myButton.Attributes["one"]="第一个提示";
    myButton.Attributes["tow"]="第二个提示";
    myButton.Text=myButton.Attributes["one"];
    myButton.Attributes["onclick"]="if(this.value==this.one)this.value=this.two;else thsi.value=this.one;";对于<asp:Button>,这个控件在输出html给客户端的时候会把你写的onclick脚本代码与它自己产生的组合在一起输出。但是对于有些,如果你在Attributes中使用了控件要使用的,那么控件也许会删除你写的。对于ID这个属性则几乎所有控件都要删除你写的,而用自己的ClientID代替。
      

  6.   

    使用htmlControl不是不需要刷新页面的吗?服务器也要处理它?那返回的是什么呀?应该是首次访问时才需要到服务器上处理下的吧?
    那webControl的postback为false,也应该相当于一个htmlControl吧?客户端处理时只把它当作htmlControl,只不过属性上多了几个js事件吧?
    那为何还有差异呢?
      

  7.   

    恩,经sp1234(这是最后最艰苦的斗争,加油!) 一番详细的解答,让我对一些东西有了更加深的理解,同时我也有和楼主楼上同样的疑问,期待sp1234(这是最后最艰苦的斗争,加油!) 的解惑
      

  8.   

    控件不一定都要刷新页面的,只是设计者让它回发,它才回发,不让它回发,它就不回发。作为一种分类方法,asp.net控件将界面和操作都模拟传统的html标记的控件叫做htmlControl,并且都不产生回发的代码。而功能比较强的控件,也许回发也许不回发,叫做WebControl。使用任何一个Webcontrol,如果你根本不提供后台处理程序,例如对Button根本不注册响应Click事件的代码,它就不输出那个调用著名的 __doPostback 函数的脚本,这个Button就跟 htmlButton 没有什么两样。因此说WebControl是htmlControl扩展。是否回发,不是因为你使用的是哪种控件。htmlControl限制你写那些服务器端的事件处理程序(你仅能处理page_load等等非交互的事件),因此你就几乎看不到页面回发。webControl提供了大量可以在服务器端处理的事件,但是如果你提供处理代码,它就不会多此一举地回发到服务器上跑一趟,因此这也是没有回发的。因此WebControl在是否回发的问题上你有更大自主权和功能。另外,从技术上说,所有处理回发事件的控件都要具有 IPostbackEventHandler 接口,而 webControl这个父类使用了这个接口供子类继承,HtmlControl父类没有使用这个接口。
      

  9.   

    最后我说我预测的一点,Ajax可能是web应用程序的将来。此时回发、事件编程软件设计概念会原封不动地被使用在将来的所有控件上,只不过此时是自动感知哪些控件改变了从而仅仅从服务器上下载改变了的控件的客户端界面(达到局部刷新),而那些靠客户端重定向来改变局部界面的编程方法会被淘汰。
      

  10.   

    如果处理代码中不涉及到与服务器的交互等操作,比如只是改变某个textbox的值,那为虾米整个页面还要刷新次呢?htmlControl里用JS时好像就没刷新了嘛。?
      

  11.   

    嗯,我举button的click可能有混淆的嫌疑,因为所有 button 如果是 submit 的,根本不走 __doPostBack 的逻辑,直接使用客户端脚本 Form.Submit 就提交了。因为我现在所有的postback都变成Ajax的了,所以这方面有点考虑不到了。呵呵。你可以通过察看控件在客户端上产生的,看看产生的html标签的客户端事件中有没有 __doPostBack(...) 代码,来验证事件和_doPostBack客户端代码的关系。