c#中JavaScript与后台代码的相互调用


问题描述:

在后台代码中,需要弹出一个对话框,让用户选择确定或者取消,用的是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. string sql = "select * from LossInfo where 线路名称='" + lineName + "' and 年份 ='" + strYear + "' and 月份='"+strMonth+"'";  
  2.             string result=PowerGisDB.GetFirstData(sql);//执行查询语句  
  3.             if (result != "")  
  4.             {  
  5.                 //在服务器端调用JavaScript代码  
  6.                 ClientScript.RegisterStartupScript(ClientScript.GetType(), "myscript""<script>houtai();</script>");  
  7.             }  
  8.  

二、前台JavaScript

  1. function houtai()  
  2.     {  
  3.          var isUpdate=confirm("已存在该线路线损记录是否更新");  
  4.         if(isUpdate)//调用后台方法  
  5.         {  
  6.                    document.getElementById("Buttonfz").click();  
  7.         }  
  8.     }  

 

增加的辅助按钮

 

  1. <asp:Button ID="Buttonfz" runat="server" Text="Button" OnClick="Button1_Click"/> 

三、后台事件处理方法:

 

  1. protected void Button1_Click(object sender, EventArgs e)  
  2.    {  
  3.        MyUpdate();//进行数据库更新操作  
  4.    } 

附加:对于辅助按钮,为了避免用户单击引发click事件,要把它设为不可见。但是如果设置了不可见,脚本中也无法调用这个事件了。解决方法:在前台首先将按钮的visible属性设置false,然后在 ClientScript.RegisterStartupScript之前,将它改为true,MyUpdate()之后再改回false。

注:其实更简单的方法是把辅助按钮的width设成0就行了。

如果是html的按钮,除了onclick事件要改为onserverclick以外,对于visible的设置可以使用这种方式:style="display:none".

补加例子,使用html的input按钮。

前台aspx代码

 

  1. <p>隐藏按钮上一行</p>  
  2.            <input type="button" id="ButtonHidden2" runat="server" value="myHidden" style="display:none" onserverclick="ButtonHidden_Click" />  
  3.        <p>隐藏按钮下一行</p> 

后台cs代码

 

  1. protected void Page_Load(object sender, EventArgs e)  
  2.     {  
  3.         if (!Page.IsPostBack)  
  4.         {  
  5.             ClientScript.RegisterStartupScript(ClientScript.GetType(), "myscript""<script>myinput();</script>");  
  6.         }  
  7.     }  
  8.     protected void ButtonHidden_Click(object sender, EventArgs e)  
  9.     {  
  10.         int i = 0;  
  11.         i++;  
  12.         Response.Write("i="+i);  
  13.     }  
  14.  

JavaScript代码:

 

  1. <script language="javascript" type="text/javascript">  
  2.    function myinput()  
  3.    {   
  4.       document.getElementById("ButtonHidden2").click();  
  5.    }   
  6.    </script>  
  7.  

运行显示结果:

i=1

隐藏按钮上一行

隐藏按钮下一行

注意:如果在input按钮里面有 fun();",事件就不继续往下执行了,将return关键字去掉,会继续往下执行。

/r/n/n本文来自CSDN博客,转载请标明出处:http://www.flatws.cn/article/program/javascript/2010-08-26/10894.html