C# 如何从方法内部调用 javascript 函数?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/153776/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-03 15:53:32  来源:igfitidea点击:

How can I call a javascript function from inside a method?

提问by mrjrdnthms

I am inside of...

我在里面...

public class bgchange : IMapServerDropDownBoxAction
{
    void IServerAction.ServerAction(ToolbarItemInfo info)
    {
     Some code...

and after "some code" I want to trigger

在“一些代码”之后我想触发

[WebMethod]
public static void DoSome()
{

}

Which triggers some javascript. Is this possible?

这会触发一些 javascript。这可能吗?

Ok, switch methods here. I was able to call dosome(); which fired but did not trigger the javascript. I have tried to use the registerstartupscript method but don't fully understand how to implement it. Here's what I tried:

好的,这里切换方法。我能够调用 dosome(); 哪个触发但没有触发javascript。我曾尝试使用 registerstartupscript 方法,但并不完全了解如何实现它。这是我尝试过的:

public class bgchange : IMapServerDropDownBoxAction
{

void IServerAction.ServerAction(ToolbarItemInfo info)
{
    ...my C# code to perform on dropdown selection...
        //now I want to trigger some javascript...
        // Define the name and type of the client scripts on the page.
        String csname1 = "PopupScript";
        Type cstype = this.GetType();

        // Get a ClientScriptManager reference from the Page class.
        ClientScriptManager cs = Page.ClientScript;

        // Check to see if the startup script is already registered.
        if (!cs.IsStartupScriptRegistered(cstype, csname1))
        {
            String cstext1 = "alert('Hello World');";
            cs.RegisterStartupScript(cstype, csname1, cstext1, true);
        }
}

}

}

I got the registerstartupscript code from an msdn example. Clearly I am not implementing it correctly. Currently vs says "An object reference is required for the non-static field, method, or property 'System.Web.UI.Page.ClientScript.get' refering to the piece of code "Page.Clientscript;" Thanks.

我从 msdn 示例中获得了 registerstartupscript 代码。显然我没有正确实施它。当前 vs 表示“非静态字段、方法或属性 'System.Web.UI.Page.ClientScript.get' 需要一个对象引用,引用代码段“Page.Clientscript;”谢谢。

采纳答案by Scott Nichols

I'm not sure I fully understand the sequence of what you are trying to do, what's client-side and what's not....

我不确定我是否完全理解你想要做的事情的顺序,什么是客户端,什么不是......

However, you could add a Start-up javascript method to the page which would then call the WebMethod. When calling a WebMethod via javascript, you can add a call-back function, which would then be called when the WebMethod returns.

但是,您可以向页面添加启动 javascript 方法,然后该方法将调用 WebMethod。当通过 javascript 调用 WebMethod 时,您可以添加一个回调函数,然后在 WebMethod 返回时调用该函数。

If you add a ScriptManager tag on your page, you can call WebMethods defined in the page via Javascript.

如果在页面上添加 ScriptManager 标记,则可以通过 Javascript 调用页面中定义的 WebMethods。

<asp:ScriptManager ID="scriptManager1" 
    runat="server" EnablePageMethods="true" />

From the Page_Load function you can add a call to your WebMethod..

从 Page_Load 函数中,您可以添加对 WebMethod 的调用。

Page.ClientScript.RegisterStartupScript(
    this.GetType(), 
    "callDoSome",
    "PageMethods.DoSome(Callback_Function, null)", 
    true);

Callback_Function represents a javascript function that will be executed after the WebMethod is called...

Callback_Function 表示调用 WebMethod 后将执行的 javascript 函数...

<script language="javascript" type="text/javascript">
    function Callback_Function(result, context) {
        alert('WebMethod was called');
    }
</script>

EDIT:

编辑:

Found this link for Web ADF controls. Is this what you are using??

找到此Web ADF 控件的链接。这是你用的吗??

From that page, it looks like something like this will do a javascript callback.

从那个页面,看起来像这样会做一个 javascript 回调。

public void ServerAction(ToolbarItemInfo info) {
    string jsfunction = "alert('Hello');";
    Map mapctrl = (Map)info.BuddyControls[0];
    CallbackResult cr = new CallbackResult(null, null, "javascript", jsfunction);
    mapctrl.CallbackResults.Add(cr);
}

回答by mrjrdnthms

hmmm... the question changed dramatically since my original answer.

嗯……自从我最初的回答以来,这个问题发生了巨大的变化。

Now I think the answer is no. But I might be wrong.

现在我认为答案是否定的。但我可能错了。

回答by Scott Nichols

You cannot call methods within a browser directly from the server. You can, however, add javascript functions to the response that will execute methods within the browser.

您不能直接从服务器调用浏览器中的方法。但是,您可以将 javascript 函数添加到将在浏览器中执行方法的响应。

Within the ServerAction method, do the following

在 ServerAction 方法中,执行以下操作

string script = "<script language='javascript'>\n";
script += "javascriptFunctionHere();\n";
script += "</script>";

Page.RegisterStartupScript("ForceClientToCallServerMethod", script);

More info here

更多信息在这里

回答by Scott Nichols

If the above is how you are calling RegisterStartupScript, it won't work because you don't have a reference to the "Page" object.

如果以上是您调用 RegisterStartupScript 的方式,它将不起作用,因为您没有对“Page”对象的引用。

bgchange in your example extends Object (assuming IMapServerDropDownBoxAction is an interface), which means that there is no Page instance for you to reference.

bgchange 在您的示例中扩展了 Object (假设 IMapServerDropDownBoxAction 是一个接口),这意味着没有 Page 实例供您参考。

This you did the exact same thing from a Asp.Net Page or UserControl, it would work, because Page would be a valid reference.

您从 Asp.Net Page 或 UserControl 执行完全相同的操作,它会起作用,因为 Page 将是有效的参考。

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        Page.ClientScript.RegisterStartupScript(
            this.GetType(),
            "helloworldpopup",
            "alert('hello world');",
            true);          
    }
}