最近一直在做一个电话拨号的系统,系统不大,但是做的时间有点长了。其中用到了一个技术:js调用后台方法。解决这个问题花了不少时间,现如今仍然还有些不明白的地方,今天跟大家分享一下。真正明白的同学欢迎指正。

其实,在vs里面,这种前台调用后台方法还是很常见的,只不过是被vs封装了。

我们在界面拖一个button,双击后,vs会自动为在前台调用这个button的Click事件,同时在后台生成好这个button的Click方法。

或者说我们不用vs替我们办这些,我们自己来写,方法当然也很简单:

在前台在 建立一个按钮,在后台将调用或处理的内容写入button_click中;然后在前台写一个js函数,内容为 document.getElementById("btn1").click(); 最后在前台或后台调用js函数,激发click事件,等于访问后台c#函数。

我们遇到的都不是上面的情况,而是类似于下面的这种方法:

后台:

public string receiveCall(string strNum)
{
strNum = "小明" + strNum;
return strNum;
}

前台js方法:

    function Init()
{
var v = "来电";
var s = '<%=receiveCall("'+v+'") %>';
alert(s);
}

然后在前台调用就可以了。

我最初写这个方法的时候,程序总是出错。前台在js方法里面写好了调用后台的方法,但是没有调用,结果它仍然会执行。有时候错误出的甚至有点莫名其妙。一会儿能调用一会儿不能调用。

后来在网上找了半天,看见很多人都将后台方法写成protected,然后我照做了,将Demo里面的后台方法改成protected类型,程序果然就ok了,再没有出现过类似上面的问题。然后我以为找到答案了,可是在系统里面的问题仍然没有解决。

电话系统里面仍然会出现未调用后台方法,而自己调用的情况。而且这种情况非常不稳定。一些地方未调用执行,一些地方未调用不执行。这个问题我们的解决办法 就是将未调用执行的部分去掉,换成用vs里面的AJAX方法实现。

这个为问题貌似是解决了,但是新问题有出现了。先看下面图片:

问题出来了:每当鼠标划到图中[联系我]的时候,弹出框中每次显示的电话号码都是一样的。也就是说,当你划到另一个[联系我]的时候,弹出框的电话号码跟上一次相同。

分析之后得出结论:

1、在没有使用js调用后台方法的时候,弹出框显示的信息是正常的;在使用js调用后台方法之后,会出现该问题;

2、弹出框显示的信息也有规律,每次显示的值是后台默认绑定的值。

也就是说,上面所说的问题其实并没有解决。在js方法中,在没有调用的情况下,还是偷偷执行了后台方法,而且尽管代码写的是动态绑定,而执行的后台方法却像是变成了一个常量,每次调用,都只执行默认绑定。

问题分析到这里,也就快结局了。其实之所以会出现这种问题,是跟页面的加载原理有关。由于js是在客户端运行的,页面加载完html页面后,仍然会加载 js代码,当加载到调用后台方法部分的时候,就会对后台方法进行调用,也就出现了上面发生的问题。试验一下也能证 明,<%=receiveCall()%>在页面绑定的时候就会计算值。加个断点调试一下,结果是,只有在页面刷新时,才会就算& lt;%=receiveCall()%>的值。

如果要在页面刷新时执行某个函数时用这个方法还可以,也就是说使用autopostback,而这里这么用是多此一举。另外,js解释执行的时 候,<%=receiveCall()%>已经赋值,可以看作是常量,因此这时的值不是想象中触发后才执行后台事件。

到现在问题已经介绍清楚了,依上面所述,类似于<%=receiveCall()%>这样的调用方式,其实也说不上错误。想要正确的使用它,你需要了解页面的加载原理,能够容忍执行的后台方法变成一个常量,你也就可以使用它了。

转自:http://blog.csdn.net/liu765023051/article/details/8518342

js调用后台方法(如果你能容忍执行的后台方法变成一个常量)的更多相关文章

  1. jquery、js调用iframe父窗口与子窗口元素的方法整理

    1. jquery 在iframe子页面获取父页面元素代码如下: $("#objid", parent.document) 2. jquery在父页面 获取iframe子页面的元素 ...

  2. js调用.net后台事件,和后台调用前台等方法以及js调用服务器控件的方法

    http://blog.csdn.net/deepwishly/article/details/6670942  ajaxPro.dll基础教程(前台调用后台方法,后台调用前台方法) 1. javaS ...

  3. AjaxPro.dll,asp.net 前台js调用后台方法(无刷新)

    1.什么是Ajax Ajax是异步Javascript和XML(Asynchronous JavaScript and XML)的英文缩写."Ajax"这个名词的发明人是Jesse ...

  4. js调用.net后台事件,和后台调用前台等方法总结(转帖)

    js调用.net后台事件,和后台调用前台等方法总结 原文来自:http://hi.baidu.com/xiaowei0705/blog/item/4d56163f5e4bf616bba16725.ht ...

  5. js调用后台,后台调用前台等方法总结

    1. javaScript函数中执行C#代码中的函数:方法一:1.首先建立一个按钮,在后台将调用或处理的内容写入button_click中;        2.在前台写一个js函数,内容为docume ...

  6. [iOS Hybrid实践:UIWebView中Html中用JS调用OC方法,OC执行JS代码]

    原理: 1.JS调用OC 每次webview执行跳转时都会被iOS给拦截,执行下面函数获得系统允许. 因此可以根据跳转信息转给系统,执行相应功能,比如打开相册等. // 网页中的每一个请求都会被触发 ...

  7. UIWebView中Html中用JS调用OC方法及OC执行JS代码

    HTML代码: <html> <head> <title>HTML中用JS调用OC方法</title> <meta http-equiv=&quo ...

  8. ajaxpro——js调用后台的方法

    前提:添加并引用类库ajaxpro.dll 1.把引用的类库改为自己(如果是自己的话,就不用修改): <%@ Page Language="C#" AutoEventWire ...

  9. 关于datagrid中控件利用js调用后台方法事件的问题

    前台调用后台方法除了用button的click事件,还可以用js调用  一.前台页面如图 需求点击这个按钮触发后台事件,从而能够调用存储过程 <epoint:HyperLinkColumn He ...

随机推荐

  1. Magento PHP Extension "curl" must be loaded解决方法

    我记得我第一次在xampp装magento的时候,进入后台时提示PHP Extension "curl" must be loaded 在网页上查了下原因和解决方法,发现是mage ...

  2. C++经典编程题#4:单词翻转

    总时间限制:  1000ms  内存限制:  65536kB 描述 输入一个句子(一行),将句子中的每一个单词翻转后输出. 输入 只有一行,为一个字符串,不超过500个字符.单词之间以空格隔开. 输出 ...

  3. android ScrollView中嵌套GridView,ListView只显示一行的解决办法

    http://blog.csdn.net/young0325/article/details/9831587

  4. ELK-Python(二)

    不具有通用性,留作纪念. [root@GXB-CTRLCENTER python]# cat insert_pv.py #!/usr/bin/env python # -*- coding:utf-8 ...

  5. robot framework数据库操作

    1.连接数据库 2.数据库查询操作 3.断开数据库连接 4.对数据库进行读取,实现登录功能实例

  6. 由一个Servlet 看java入门常犯的几个错误

    安装完java环境后,cmd-javac 报错           ------------->环境变量配错了,最后全配成系统变量,ok了 能浪费一天的时间 写一个最简单的Servlet ,to ...

  7. python_如何建立包

    步骤: (1)包的名称为drawing (2)drawing中建立模块color和shape 视图: 备注: (1) E:/python_script/已经加入到系统变量path中 (2) 建立包时, ...

  8. iOS 瀑布流的Demo

    /** * 瀑布流Demo的主要代码,若想看完整的代码请到下面链接去下载 * * 链接: https://pan.baidu.com/s/1slByAHB 密码: r3q6 */ #import &l ...

  9. 为什么Button点击了没反应,反而其他事件反应了

  10. linux 硬件信息

    1. 查看物理CPU的个数 #cat /proc/cpuinfo |grep "physical id"|sort |uniq|wc -l 2. 查看逻辑CPU的个数 #cat / ...