使用Web服务(.NET)中的C#调用javascript

时间:2011-11-27 16:41:56

标签: c# javascript jquery ajax

我有一个带有JavaScript的网页,可以使用jQuery和AJAX调用C#方法。这很好用。我想知道如何在C#代码中调用JavaScript函数,如果可能的话。如果不可能,那还有一个明智的选择吗?

2 个答案:

答案 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);