js调用后台方法(如果你能容忍执行的后台方法变成一个常量)
最近一直在做一个电话拨号的系统,系统不大,但是做的时间有点长了。其中用到了一个技术: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调用后台方法(如果你能容忍执行的后台方法变成一个常量)的更多相关文章
- jquery、js调用iframe父窗口与子窗口元素的方法整理
1. jquery 在iframe子页面获取父页面元素代码如下: $("#objid", parent.document) 2. jquery在父页面 获取iframe子页面的元素 ...
- js调用.net后台事件,和后台调用前台等方法以及js调用服务器控件的方法
http://blog.csdn.net/deepwishly/article/details/6670942 ajaxPro.dll基础教程(前台调用后台方法,后台调用前台方法) 1. javaS ...
- AjaxPro.dll,asp.net 前台js调用后台方法(无刷新)
1.什么是Ajax Ajax是异步Javascript和XML(Asynchronous JavaScript and XML)的英文缩写."Ajax"这个名词的发明人是Jesse ...
- js调用.net后台事件,和后台调用前台等方法总结(转帖)
js调用.net后台事件,和后台调用前台等方法总结 原文来自:http://hi.baidu.com/xiaowei0705/blog/item/4d56163f5e4bf616bba16725.ht ...
- js调用后台,后台调用前台等方法总结
1. javaScript函数中执行C#代码中的函数:方法一:1.首先建立一个按钮,在后台将调用或处理的内容写入button_click中; 2.在前台写一个js函数,内容为docume ...
- [iOS Hybrid实践:UIWebView中Html中用JS调用OC方法,OC执行JS代码]
原理: 1.JS调用OC 每次webview执行跳转时都会被iOS给拦截,执行下面函数获得系统允许. 因此可以根据跳转信息转给系统,执行相应功能,比如打开相册等. // 网页中的每一个请求都会被触发 ...
- UIWebView中Html中用JS调用OC方法及OC执行JS代码
HTML代码: <html> <head> <title>HTML中用JS调用OC方法</title> <meta http-equiv=&quo ...
- ajaxpro——js调用后台的方法
前提:添加并引用类库ajaxpro.dll 1.把引用的类库改为自己(如果是自己的话,就不用修改): <%@ Page Language="C#" AutoEventWire ...
- 关于datagrid中控件利用js调用后台方法事件的问题
前台调用后台方法除了用button的click事件,还可以用js调用 一.前台页面如图 需求点击这个按钮触发后台事件,从而能够调用存储过程 <epoint:HyperLinkColumn He ...
随机推荐
- TCP协议中的三次握手和四次挥手
转自: http://blog.csdn.net/whuslei/article/details/6667471/ 建立TCP需要三次握手才能建立,而断开连接则需要四次握手.整个过程如下图所示:
- Insecure world writable dir /usr/local in PATH, mode 040777
/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/universal-darwin14/rbconfi ...
- EGO Refresh小总结
这几天项目做完,有点闲,正好可以用来做做总结. 忘了是哪位博客大牛说:不能因为知识点小.少而不做总结. 那么现在就开始实践一把吧~ 总的来说,EGO有几点需要设置,设置完之后,就能够自如地用了. 1. ...
- SpringMVC中的controller默认是单例的原因
http://lavasoft.blog.51cto.com/62575/1394669/ 1.性能 :单例不用每次new浪费资源时间. 2.不需要:一般controller中不会定义属性这样单例就不 ...
- MEF 松耦合
MEF天生就有解耦合的特性,虽然它不是为解耦而生,而主要是为插件类应用的开发而设计.如果主要是为了解除耦合的话可以使用IoC,Unity等. Unity 微软的IOC 代码: using System ...
- box2dweb基础
简介 大名鼎鼎的物理引擎box2d基本上大家都听说过,网上有两个javascript版本的box2d库,一个时box2djs,已经停止维护,一个是box2dweb.下面就来介绍一下box2dweb的基 ...
- JavaScript学习笔记之BOM
BOM的核心对象是window,它既表示浏览器窗口以及页面可见区域,同时也是ECMAScript中的Globe对象,所有的全局变量和函数都是它的属性,并且所有的原声函数以及其他函数也都存在于它的命名空 ...
- 解决Regsvr32: DllRegisterServer entry point was not found
原因: 虽然项目里面包含了DEF文件, 但是尼玛没有配置项目属性让链接器处理它啊! 解决方案: 项目属性->链接器->输入->模块定义文件->{输入文件名}
- LUA 模块化编程例子
LUA module lua语言中module接口用于定义一个模块, 将模块的实现封装到一个文件中, 开放的 函数 和 数据, 不以local标识,然后在其他文件中, 引用此模块, 使用模块名(一个命 ...
- Nginx实现多重IF判断的办法
在YII框架中如果访问的图片不存在,会记录大量的错误,于是我想了个办法,凡是访问不存在的图片,直接返回404,不经过YII框架 location / { set $if_img N; if ($r ...