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%.