最近一直在做一个电话拨号的系统,系统不大,但是做的时间有点长了。其中用到了一个技术: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. nccmp - 比较netcdf的文件内容 - 编译安装

    1. 简介 Compares two NetCDF files in-place to find specific variables, dimensions and/or attributes th ...

  2. Selenium2学习-011-WebUI自动化实战实例-009-JavaScript 在 Selenium 自动化中的应用实例之一(赋值)

    通常在编写 Selenium 的 WebUI 自动化脚本时,有些元素不易定位元素,或有些元素为隐藏的(此时用 WebElement.getText() 获取其值的时候,返回的结果为空),对日常的 UI ...

  3. MFC之向导页、消息框、文件选择、字体、颜色(三)

    属性页对话框的分类 属性页对话框想必大家并不陌生,XP系统中桌面右键点属性,弹出的就是属性页对话框,它通过标签切换各个页面.另外,我们在创建MFC工程时使用的向导对话框也属于属性页对话框,它通过点击“ ...

  4. imx6 RGB LCD

    imx6dl需要支持lcd接口的屏,imx6dl的datasheet并没有明确的说明lcd相关的配置,只在Display Content Integrity Checker (DCIC)一章中介绍.本 ...

  5. net Datable 基本操作

    net Datable 基本操作 using System; using System.Collections.Generic; using System.Text; using System.Dat ...

  6. less 命令(转)

    less 工具也是对文件或其它输出进行分页显示的工具,应该说是linux正统查看文件内容的工具,功能极其强大.less 的用法比起 more 更加的有弹性.在 more 的时候,我们并没有办法向前面翻 ...

  7. nohup和&的区别

    nohup和&的区别http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=4241330&fromuid=21288388 ...

  8. 不连数据库List分页

    package com.jpsycn.kfwggl.common.crawl; import java.util.ArrayList; import java.util.List; public cl ...

  9. C++内存未释放的情况

    以下例子中,存储了整数123的记亿体空间不能被删除,因为地址丢失了.这些空间已无法再使用. #include <iostream> using namespace std; int mai ...

  10. 无法定位程序输入点 crtis tailoredApp 于动态链接库MSVCR110.dll

    最近 在安装完   PHP开发,集成环境 WAMP  后,运行老是提示 “无法定位程序输入点 crtis tailoredApp 于动态链接库MSVCR110.dll”  网上百度,大多说是重新下载“ ...