Asp.net ScriptManager PageMethods - undefined

Я хочу вызвать статические серверные методы из JS, поэтому я решил использовать элемент управления ScriptManager на своем сайте. Итак, у меня есть главная страница с такой структурой:

<%@ Master Language="C#" AutoEventWireup="true" CodeBehind="TopLevelMasterPage.Master.cs"
    Inherits="Likedrive.MasterPages.TopLevelMasterPage" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:fb="http://ogp.me/ns/fb#">

<head runat="server">
    <title></title>
        <script type="text/javascript">
            function getGiftFileUrl() {
                function OnSuccess(response) {
                    alert(response);
                }
                function OnError(error) {
                    alert(error);
                }

                PageMethods.GetGiftFileUrl("hero", 1024, 768, OnSuccess, OnError);
            }

            getGiftFileUrl();

        </script>
    </asp:ContentPlaceHolder>
</head>
<body>
    <form id="form1" runat="server">
    <asp:ScriptManager ID="ScriptManagerMain"
            runat="server"
            EnablePageMethods="true" 
            ScriptMode="Release" 
            LoadScriptsBeforeUI="true">
    </asp:ScriptManager>
    <asp:ContentPlaceHolder ID="MainContent" runat="server"> 
    </asp:ContentPlaceHolder>
    </form>
</body>
</html>

Но когда страница загружается, у меня есть исключение JS - PageMethods - undefined. Я предположил, что объект будет создан неявным, поэтому я могу использовать его в своем javascript.

Ответ 1

Я понял, почему объект PageMethod не был определен, потому что компонент ScriptManager размещен рядом с script, который использует PageMethod, поэтому, когда страница отображается и script выполнена, в данный момент не существует PageMethod. Поэтому мне нужно вызвать getGiftFileUrl() при нажатии кнопки или при загрузке окна, когда все скрипты на странице готовы к использованию.

Ответ 2

Чтобы использовать PageMethods, вам необходимо выполнить следующие действия:

  • Вам нужно использовать ScriptManager и установить EnablePageMethods. (Вы сделали).
  • Создайте метод static в вашем коде и используйте атрибут [WebMethod].
  • Вызовите свой метод в javascript, как вы должны делать на С#, но у вас есть больше параметров для заполнения, обратные вызовы sucess и error. (Вы сделали).

Пропустили ли вы какие-либо из этих шагов?

Изменить: Просто понял, что вы это сделали:

            function getGiftFileUrl() {
            function OnSuccess...

У вас есть свои обратные вызовы внутри функции. Вам нужны ваши обратные вызовы:

            function OnSuccess(response) {
               alert(response);
            }
            function OnError(error) {
                alert(error);
            }

PageMethods.GetGiftFileUrl("hero", 1024, 768, OnSuccess, OnError);

И вы закомментируете код, вероятно, закончится чем-то вроде этого:

[WebMethod]
public static string GetGiftFileUrl(string name, int width, int height)
{
    //... work
    return "the url you expected";
}

Бонус: поскольку это метод static, вы не можете использовать this.Session["mySessionKey"], но вы можете сделать HttpContext.Current.Session["mySessionKey"].

Ответ 3

В вашем коде создайте этот метод:

[WebMethod]
public static void GetGiftFileUrl(string value1, int value2, int value3)
{
    // Do Stuff
}

ваш js script тоже должен выглядеть:

<script type="text/javascript">
    function getGiftFileUrl() {
        PageMethods.GetGiftFileUrl("hero", 1024, 768, OnSucceeded, OnFailed);
    }

    function OnSucceeded(response) {
        alert(response);
    }
    function OnFailed(error) {
        alert(error);
    }


    getGiftFileUrl();
</script>

Ответ 4

 <script type="text/javascript">
       function Generate()
       {              
           var result = PageMethods.GenerateOTP(your parameter, function (response)
           {
               alert(response);
           });
       }
</script>

Будет работать 100%.