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 ...
随机推荐
- EntityFramework执行SQL语句
在EF中执行Sql语句. using (var context = new EFRecipesEntities()) { string sql = @"insert into Chapter ...
- Snort规则中的逻辑关系
0x01 看一条规则alert tcp any any -> any any (content:"union";http_uri;nocase;content:"s ...
- error = Error Domain=NSCocoaErrorDomain Code=3840
json解析,同样的请求,有一个请求,无反应.纠结了几天,终于解决了. error = Error Domain=NSCocoaErrorDomain Code=3840 "Unescape ...
- 我的工具箱之Putty
这是类似于SecureCrt的终端仿真软件,个人感觉比SecureCrt差一点. 下载地址是:http://pan.baidu.com/s/1sko0GrF SecureCrt网址在我的工具箱之Sec ...
- iOS:使用Github托管自己本地的项目代码方式三(命令行方式: Terminal Line)
使用终端命令行将本地项目代码上传到github上进行托管 对于IOS开发者来说,Github的使用是必须要掌握的一种技能,而把项目由本地上传到Github有多种方式 1.开发工具Xcode配置Git, ...
- WebApi 找到了与该请求匹配的多个操作
在同一个命名空间内,报错 错误的路由代码: namespace CRM4S { public static class WebApiConfig { public static void Regist ...
- 启用Service Broker
2015-10-20 17:31 整理,未发布数据库邮件配置向导,在选择配置任务页面点击下一步时,弹出"数据库邮件依赖于 Service Broker...".点击是,整个SSMS ...
- CL.exe的 /D 选项, Preprocessor Macro预处理器宏定义
在看"Inside COM"第10章的代码. MAKEFILE里面有几个标记我没看懂. 去网上搜也搜不到. /D_OUTPROC_SERVER_ /DWIN32 /DREGISTE ...
- redhat centos yum源的安装
redhat centos yum源的安装 1.除旧 #cd /etc/yum.repos.d #mv rhel-debuginfo.repo rhel-debuginfo.repo.bak 此处将其 ...
- :“boost/serialization/string.hpp”: No such file or directory 错误
主要原因是没有安装和配置boost库. 解决:http://www.programlife.net/boost-compile-and-config.html