问题描述:
在后台代码中,需要弹出一个对话框,让用户选择确定或者取消,用的是confirm。接下来的代码需要根据用户的选择情况进行调用。
这里就涉及到怎么取到confrim值的问题。
首先我想到的是,在Response.write()里面写confrim,它的返回值无法直接赋给后台代码的变量,就在前台加了一个辅助用的文本框,通过它的id号在JavaScript中给它赋值,然后在后台代码中通过id取值。很不幸,在Response.write()里面写的语句如果除了内部函数(如alert(),confirm())还有其他的语句,比如赋值的语句,它就不执行了。
第二,还是使用Response.write()。准备在Response.write()里面直接调用前台定义的JavaScript的函数。这个方法也不行,用Response.write()调用JavaScript的方法,这个方法只能是它内部的函数,自己定义的函数是不行的。
第三,放弃Response.write()。使用 ClientScript.RegisterStartupScript(ClientScript.GetType(), "myscript","<script>函数名();</script>");这个方式是能调用自己定义的 JavaScript的方法,当然“函数名()”要求是已经是定义过的。确定能调用这个方法后,准备如原先想的那样,通过id去取辅助用的文本框的值。这时候就发现,又出现了另外一个问题。通过ClientScript.RegisterStartupScript的方式是能调用自定义的脚本方法了,但是它的调用是发生在服务器代码执行完之后。也就是说,预想的执行顺序是,ClientScript.RegisterStartupScript--立即调用脚本方法--取得文本框的值--根据取到的值判断接下来要执行的服务器端代码。而实际顺序是,ClientScript.RegisterStartupScript--取得文本框的值(没变)--根据文本框的值判断接下来要执行的服务器端代码--调用脚本方法。结论,更改原先的设想,改为:通过ClientScript.RegisterStartupScript调用自定义脚本方法,在脚本方法里获取到用户的反馈信息,根据不同信息,在脚本里调用服务器的代码。
问题变为怎样在脚本里调用后台代码。
1.使用document.write("<%方法名()%>");使用这种方式的结果是,后台的“方法名()”方法被多次调用,不清楚document.write()做了什么,对方法的作用域、触发时机有什么影响。
2.将要调用的后台代码作为前台按钮事件处理方法。在脚本里通过调用按钮事件去调用后台代码。可行。
综上所述,为了能在后台加一个confirm并且根据它的返回值决定接下来的流程,首先要在后台使用 ClientScript.RegisterStartupScript调用JavaScript的方法,然后在页面上添加一个辅助用的按钮,再把根据 confirm返回值的不同而要执行的后台代码作为按钮的事件处理方法,最后,在JavaScript方法里调用按钮的事件处理方法。
代码要实现的功能是:检查数据库里是否已有某条记录,如果已经有,弹出confrim框让用户选择是否更改记录。如果点击确定,进行数据库更新操作。部分代码如下:
一、后台代码
1 | 1. string sql = "select * from LossInfo where 线路名称='" + lineName + "' and 年份 ='" + strYear + "' and 月份='" +strMonth+ "'" ; |
2 | 2. string result=PowerGisDB.GetFirstData(sql); |
6 | 6. ClientScript.RegisterStartupScript(ClientScript.GetType(), "myscript" , "<script>houtai();</script>" ); |
二、前台JavaScript
3 | # var isUpdate=confirm("已存在该线路线损记录是否更新"); |
6 | # document.getElementById("Buttonfz").click(); |
增加的辅助按钮
1 | 1. <asp:Button ID= "Buttonfz" runat= "server" Text= "Button" OnClick= "Button1_Click" /> |
三、后台事件处理方法:
1 | 1. protected void Button1_Click( object sender, EventArgs e) |
附加:对于辅助按钮,为了避免用户单击引发click事件,要把它设为不可见。但是如果设置了不可见,脚本中也无法调用这个事件了。解决方法:在前台首先将按钮的visible属性设置false,然后在ClientScript.RegisterStartupScript之前,将它改为 true,MyUpdate()之后再改回false。
注:其实更简单的方法是把辅助按钮的width和borderwidth设成0就行了。
如果是html的按钮,除了onclick事件要改为onserverclick以外,对于visible的设置可以使用这种方式:style="display:none".
补加例子,使用html的input按钮。
前台aspx代码
2 | 2. <input type= "button" id= "ButtonHidden2" runat= "server" value= "myHidden" style= "display:none" onserverclick= "ButtonHidden_Click" /> |
后台cs代码
01 | 1. protected void Page_Load( object sender, EventArgs e) |
03 | 3. if (!Page.IsPostBack) |
05 | 5. ClientScript.RegisterStartupScript(ClientScript.GetType(), "myscript" , "<script>myinput();</script>" ); |
08 | 8. protected void ButtonHidden_Click( object sender, EventArgs e) |
12 | 12. Response.Write( "i=" +i); |
JavaScript代码:
1 | # <script language="javascript" type="text/javascript"> |
4 | # document.getElementById("ButtonHidden2").click(); |
运行显示结果:
i=1
隐藏按钮上一行
隐藏按钮下一行
注意:如果在input按钮里面有 fun();",事件就不继续往下执行了,将return关键字去掉,会继续往下执行。
/r/n/n本文来自CSDN博客,转载请标明出处:http://www.flatws.cn/article/program/javascript/2010-08-26/10894.html