Как я могу вызвать функцию JavaScript изнутри метода? - PullRequest
4 голосов
/ 30 сентября 2008

Я внутри ...

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

и после "некоторого кода" я хочу вызвать

[WebMethod]
public static void DoSome()
{

}

Что вызывает некоторый JavaScript. Это возможно?

Хорошо, переключите методы здесь. Я был в состоянии вызвать 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);
        }
}

}

Я получил код registerstartupscript из примера msdn. Я явно не правильно его реализую. В настоящее время vs говорит: «Ссылка на объект требуется для нестатического поля, метода или свойства System.Web.UI.Page.ClientScript.get, ссылающегося на фрагмент кода» Page.Clientscript; «Спасибо.

Ответы [ 4 ]

4 голосов
/ 30 сентября 2008

Я не уверен, что полностью понимаю последовательность того, что вы пытаетесь сделать, что на стороне клиента, а что нет ....

Однако вы можете добавить на страницу метод javascript для запуска, который затем будет вызывать WebMethod. При вызове WebMethod через javascript вы можете добавить функцию обратного вызова, которая будет вызываться при возврате WebMethod.

Если вы добавите тег ScriptManager на свою страницу, вы можете вызывать WebMethods, определенные на странице, через Javascript.

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

С помощью функции Page_Load вы можете добавить вызов к вашему WebMethod ..

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

Callback_Function представляет функцию javascript, которая будет выполняться после вызова WebMethod ...

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

EDIT:

Найдена эта ссылка для элементов управления веб-АПД . Это то, что вы используете ??

С этой страницы, похоже, что-то вроде этого будет делать обратный вызов 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);
}
3 голосов
/ 30 сентября 2008

Если описанный выше способ вызова RegisterStartupScript выше, он не будет работать, поскольку у вас нет ссылки на объект «Страница».

bgchange в вашем примере расширяет объект (предполагая, что IMapServerDropDownBoxAction является интерфейсом), что означает, что нет экземпляра страницы, на который вы можете ссылаться.

Если вы сделали то же самое со страницы Asp.Net или UserControl, это сработало бы, потому что страница была бы верной ссылкой.

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);          
    }
}
2 голосов
/ 30 сентября 2008

Вы не можете вызывать методы в браузере напрямую с сервера. Однако к ответу можно добавить функции javascript, которые будут выполнять методы в браузере.

В методе ServerAction выполните следующее

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

Page.RegisterStartupScript("ForceClientToCallServerMethod", script);

Подробнее здесь

1 голос
/ 30 сентября 2008

хммм ... вопрос сильно изменился со времени моего первоначального ответа.

Теперь я думаю, что ответ - нет. Но я могу ошибаться.

...