如何用js调用后台方法

这事儿我得跟你唠唠。
我之前搞.net的时候,也遇到过这种调用后台代码的前台问题。
你说的这四种方法,我都在不同的项目里用过,给你讲讲我的亲身经历。

方法一,用按钮点击事件。
这招最直接。
我记得去年在杭州做一个电商网站,用户点击“立即购买”按钮,我就把处理逻辑放进了 Button1 _Click 里面。
后台代码是这么写的:
csharp protected void Button1 _Click(object sender, EventArgs e) { this.TextBox1 .Text = "voodooer"; }
前台就是简单的按钮:
<input type="button" value="访问C的方法" onclick='document.getElementById("Button1 ").click();' />
这招的好处是,用户点一下按钮,后台直接执行,前台和后台交互清晰。
但缺点是,每次点击都请求服务器,有点浪费资源。
当时那个项目,用户量不大,也就几百人,还好。
要是用户量大的话,我可能就考虑其他方法了。

方法二,用函数声明为 public 或 protected。
这招我在一个报表系统里用过。
当时需要在前台显示一个固定的字符串,我就把字符串返回函数写成了 public 的:
csharp public string ss() { return ("voodooer"); }
前台调用就是:
var a = "<%=ss()%>"; alert(a);
这招的好处是,字符串是静态的,不需要每次都请求服务器。
但缺点是,如果字符串需要动态变化,这招就不行了。
当时那个报表系统,数据是每天更新的,所以我就没采用这招。

方法三,用 __doPostBack。
这招我在一个复杂的表单提交里用过。
记得当时做一个在线报名系统,用户填写完表单,点击“提交”按钮,需要触发后台的保存操作。
我就用了 __doPostBack:
前台代码:
[xss_clean] function __doPostBack(eventTarget, eventArgument) { var theForm = document.Form1 ; // 指runat=server的form theForm.__EVENTTARGET.value = eventTarget; theForm.__EVENTARGUMENT.value = eventArgument; theForm.submit(); } [xss_clean] <input type="button" value="按钮" onclick=__doPostBack('Button1 ', 'submit');" />
后台接收到 __EVENTTARGET 和 __EVENTARGUMENT,然后执行相应的操作。
这招的好处是,可以触发后台的事件,但不直接调用函数。
当时那个报名系统,表单复杂,需要保存多个字段,用这招正好。

方法四,用 keyCode 触发提交。
这招我在一个输入框回车提交的场景里用过。
记得当时做一个在线搜索框,用户输入关键词,按回车键触发搜索。
我就用了 keyCode:
[xss_clean] function SubmitKeyClick() { if (event.keyCode == 1 3 ) { event.cancelBubble = true; event.returnValue = false; document.all.FunName.value = "要调用的函数名"; document.form[0].submit(); } } [xss_clean] <INPUT type="text" onkeydown=SubmitKeyClick()"> <input type="hidden" id="FunName">
这招的好处是,用户按回车键,可以直接触发后台的搜索操作。
但缺点是,需要处理键盘事件,代码稍微复杂一点。
当时那个搜索框,用户量很大,每天搜索次数上万次,用这招效果正好。

总的来说,这四种方法各有优缺点,选择哪种方法,得看你的具体需求。
要是用户量不大,简单直接的方法就行;要是用户量大,就需要考虑性能优化。
我当时就是根据项目需求,选择了合适的方法。

不过,你要是遇到特别复杂的情况,我这块老骨头也没啥不敢讲的。
你跟我说说,我再想想。

如何在 JavaScript 中实现链式调用函数?

上周有个客人问我,怎么在JavaScript里实现链式调用。
我跟他解释了,这其实就是一个设计模式,主要是利用了函数的返回值来形成调用链。

首先,每个方法执行后都要返回当前对象实例(this),这样你才能继续调用这个实例上的其他方法。
比如,我这里有个简单的例子:
javascript function Sum(...args) { this.value = args.reduce((a, b) => a + b, 0); }
Sum.prototype.add = function(value) { this.value += value; return this; };
Sum.prototype.subtract = function(value) { this.value -= value; return this; };
你看,add和subtract方法执行完后都返回了this,这就允许你继续调用它们。

然后,你可以这样使用:
javascript const result = new Sum(1 , 2 , 3 ).add(4 ).subtract(1 ).value; console.log(result); // 输出: 9
这就形成了链式调用。

如果你想更高级一点,可以通过代理(Proxy)来重写对象的默认行为,比如在运算或输出时自动返回value。
但这通常不是必须的,除非你有特殊需求。

javascript function Sum(...args) { this.value = args.reduce((a, b) => a + b, 0); }
Sum.prototype.add = function(value) { this.value += value; return this; };
Sum.createProxy = function(...args) { const instance = new Sum(...args); return new Proxy(instance, { get(target, prop) { if (prop === Symbol.toPrimitive) { return () => target.value; } return target[prop]; }, }); };
const proxied = Sum.createProxy(1 , 2 ).add(3 ); console.log(proxied + 1 0); // 输出: 1 6
这里,createProxy方法通过代理重写了对象的默认行为。

总之,基础链式调用很简单,就是通过return this来实现的。
而高级链式调用则结合了代理机制,可以让你在需要的时候重写对象的默认行为。
不过,我一般建议优先使用基础实现,除非你有特别的需求。

如何实现JavaScript中的链式调用?

等一下,我昨天调试代码时遇到个怪事。
有个链式调用,突然发现中间方法忘了return this,结果整个链条断了,后面方法直接报错。
当时在公司的工位,代码就停在浏览器控制台,红叉叉对着那个方法。
所以啊,写链式调用时,最好每个方法都确认一下,是不是最后一句return this。
比如这个Calculator类,每个方法最后都return this,像multiply方法,算完乘法就直接return this.value,连标点符号都没多想。