我有一个带有JavaScript的网页,它使用jQuery和AJAX调用C#方法。这可以很好地工作。如果可能的话,我想知道如何从C#代码中调用JavaScript函数。如果这是不可能的,有没有一个明智的替代方案?
发布于 2011-11-28 00:48:32
假设浏览器启动了交互
通常,您的服务器端C#代码将响应由客户端代码发起的交互。如果您正在寻找C#代码可以在没有浏览器请求的情况下启动交互的方法,请参阅下一节。
如果您正在处理整个页面响应,那么您当然可以只输出包含您希望发生的调用的script
标记。确保script
在它调用的函数已经由前面的script
标记定义之后进行调用,如果要进行DOM交互,请确保将该脚本放在页面的底部(或者使用jQuery的ready
特性)。
响应Ajax调用,C#代码可以返回包含JavaScript代码的字符串,然后页面中的代码将执行这些字符串(例如,通过eval
或类似的方式),但通常最好避免这种情况。
相反,让C#代码返回数据以响应Ajax调用,并让页面内代码通过调用适当的函数来响应该数据。
两者的一种混合是让您的C#代码返回数据,该数据指示要调用的函数以及要为其提供的参数,并具有函数的映射,您可以使用函数名对其进行索引,例如:
var functions = {
foo: function(arg0, arg1) {
alert("foo called with " + arg0 + "," + arg1);
},
bar: function(arg) {
alert("bar called with " + arg);
}
};
$.ajax({
url: "/path/to/resource",
dataType: "json",
success: function(data) {
if (data && data.fname && data.args) {
functions[data.fname].apply(undefined, data.args);
}
}
});
在那里,您的C#代码将返回一个包含以JSON编码的信息的字符串,作为一个具有fname
属性(给定函数名称的字符串)和args
属性(要传递给函数的参数数组)的对象,jQuery将为您将其反序列化为对象。然后,我们使用其名称(functions[data.fname]
)在映射中查找函数对象,并使用内置的Function#apply
调用它并传入参数。这是可行的,因为您可以使用点分语法和文字作为属性名称(obj.propName = 42
),或者使用括号语法和字符串作为属性名称(obj["propName"] = 42
)来引用JavaScript对象属性,在后一个示例中,字符串可以是任何表达式,包括变量或属性引用(name = "propName"; obj[name] = 42;
)-这就是我们在functions
映射中查找函数的方式。
我不是建议你这么做,只是说这是可能的。
如果您尝试让服务器启动交互
如果您希望服务器访问浏览器,则必须使用新的(不同支持的) web sockets API或各种Comet techniques在它们之间建立某种通信通道。
发布于 2011-11-28 01:00:08
Javascript函数不能直接从C#调用,相反,Javascript函数/代码块可以从C#代码中注册到页面,这些代码在渲染后调用或在必要时调用。
//Register Script block for JS code
Page.ClientScript.RegisterClientScriptBlock(GetType(), "ScriptBlockKey",
"<script> alert('JS alert written in C# code behind.');</script>", false);
//Register Script block for calling JS function
Page.ClientScript.RegisterClientScriptBlock(GetType(), "ScriptBlockKey",
"SomeJSFunction();</script>", false);
https://stackoverflow.com/questions/8287133
复制相似问题