开发者

Call javascript function in server side

How to call a javascript function inside server side after the code is executed in page load/any events ? I am using UpdatePanel in this page. I had tried Page.RegisterStartUpScript, ClientScript.RegisterStartupScript. 开发者_开发问答None of this works.


With an UpdatePanel you need to use ScriptManager.RegisterStartupScript, like this:

var script = "alert('hi);";
ScriptManager.RegisterStartupScript(this, GetType(), "MyScript", script, true);

You have to remember in an UpdatePanel, you're not sending the whole page back to the client, so the Page versions won't work, because their content never goes anywhere on a partial update. With ScriptManager it actively shoves this into the AJAX response it's sending as a script to execute, so it's behaving a little differently.


Just yesterday I did some research to help a fellow co-worker out and came up with the following solution. It relys on some techniques used in ajax control extenders in the use of registering data items. Since I wanted this to be more of a generic approach, I placed the following code in a script block in the master page just after the scriptmanager object:

Sys.WebForms.PageRequestManager.getInstance().add_pageLoading(PageLoadingHandler); function PageLoadingHandler(sender, args) { var dataItems = args.get_dataItems(); if ($get('<%=JSBridge.ClientID%>') !== null) { eval(dataItems['<%=JSBridge.ClientID%>']); } }

Then somewhere in the markup of the master page I placed a hiddenfield as in:

asp:HiddenField ID="JSBridge" runat="server"

That's it for the master page. Now, all of my webpages inherit from a base page so I placed a method in the base page as in:

public void InvokeScriptMethod(string methodName, string[] methodArgs) { string sArgs = string.Empty; string delim = string.Empty; bool isNumeric = false; int iArg = 0;

        if (methodArgs != null && methodArgs.Length > 0)
        {
            foreach (string arg in methodArgs)
            {
                isNumeric = int.TryParse(arg, out iArg);
                sArgs += delim + ((isNumeric) ? arg : "'" + arg + "'");
                delim = ",";
            }
        }

        ScriptManager manager = (ScriptManager)Master.FindControl("ScriptManager1");

        if (manager.IsInAsyncPostBack)
        {
            manager.RegisterDataItem(Master.FindControl("JSBridge"), methodName + "(" + sArgs + ")");
        }
    }

So, assuming your content is inside an update panel, any button clicks or any event for that matter, on any web page, you can simply do the following:

protected void MyButton_Click(object sender, EventArgs e) { //-- Call base page method to invoke javascript call InvokeScriptMethod("ShowMessage", new string[] { "David", "Whitten", "44" }); }

This is assuming you have a javascript method out there somewhere called "ShowMessage" with the necessary parameters. Obviously, one can specify any method name and any numbers of parameters.

Just wanted to share my findings. Maybe there is even a better way but I find this pretty simple and flexible.

David


ScriptManager.RegisterStartupScript

Registers a startup script block for a control that is inside an UpdatePanel by using the ScriptManager control, and adds the script block to the page.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜