我有一个带有JavaScript的网页,可以使用jQuery和AJAX调用C#方法。这很好用。我想知道如何在C#代码中调用JavaScript函数,如果可能的话。如果不可能,那还有一个明智的选择吗?
答案 0 :(得分:3)
通常,服务器端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
)的文字引用JavaScript对象属性,或使用括号语法和属性名称的字符串(obj["propName"] = 42
),其中在后一个例子中,字符串可以是任何表达式,包括变量或属性引用(name = "propName"; obj[name] = 42;
) - 这就是我们在functions
地图上查看函数的方式。
我不是建议你这样做,只是说这是可能的。
如果您希望服务器转而使用浏览器,则必须在它们之间建立一些通信渠道,使用新的(和不同支持的)web sockets API或各种{{ 3}}
答案 1 :(得分:0)
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);