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 ...
随机推荐
- Python PIL ImageDraw 和ImageFont模块学习
ImageDraw 新建一个空白图片为本文作示例,新建空白文件的方法 见Image模块,Image.new: import Image blank = Image.new("RGB" ...
- Codeforces Round #367 (Div. 2)---水题 | dp | 01字典树
A.Beru-taxi 水题:有一个人站在(sx,sy)的位置,有n辆出租车,正向这个人匀速赶来,每个出租车的位置是(xi, yi) 速度是 Vi;求人最少需要等的时间: 单间循环即可: #inclu ...
- MacOX-001- 远程连接 windows 客户端
至如下地址下载 windows 远程工具: http://www.microsoft.com/zh-CN/download/confirmation.aspx?id=18140 下载完成后,依据向导进 ...
- MVC中”从客户端检测到有潜在危险的Request.Form值“的解决方法
从客户端检测到有潜在危险的Request.Form值: 在webForm中,可以在aspx页面顶部 <%@ Page Language="C#" AutoEventWireu ...
- [转]ANDROID L——Material Design详解(动画篇)
转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! 转自:http://blog.csdn.net/a396901990/article/de ...
- App Store idfa被拒检查办法
最近应用因为这个问题被拒两次,理由如下: PLA 3.3.12We found your app uses the iOS Advertising Identifier but does not in ...
- Useful bat command
1.Start and stop the windows services net stop <service name>net start <service name>net ...
- php命名空间详解
index.php: <?php include 'demo.php'; use A\demo as test; use B\demo as test2; use C\demo; $obj = ...
- SoapUI接口测试·第一个HTTP Request接口请求和断言
一.新建SOAP项目 [File]-[New SOAP Project],在[Project Name]输入{工程名},点击[OK]. 二.新建TestSuite 选中项目,右键选择[New Te ...
- SQL-Server2008 数据库发布订阅
参考博客园文章http://www.cnblogs.com/tyb1222/archive/2011/05/31/2064944.html 添加安全数据库 更改数据库名称 SQL语句 select @ ...