PageMethods没有从codebehind调用函数 - undefined

时间:2013-01-07 23:19:16

标签: javascript asp.net ajax pagemethods

我正在建立一个网站来建立自己的蛋糕。每个蛋糕都有基本价格和某些选项。一些选项(例如草莓馅)为蛋糕增加了额外的价格。此价格位于数据库中,由功能ID找到。

我正在尝试编写一个函数,只要你选择一些新选项就会更新价格。要选择功能,我有下拉框和复选框列表。它们显示选项的文本,但选项的值是功能ID。我有一个JS函数来获取每个所选项的值。

我的想法是每当更改ddl / cbl时调用additionalPrice,它将使用功能ID查询数据库,并添加额外的价格。问题是PageMethods未定义。当我在VS2012中输入时,它不会自动填充,并且颜色为黑色而不是浅蓝色。我已经读过这样的其他问题了,我很确定我做的一切都是正确的。这是我的代码......

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

<script>
$('.featureDropDown').change(function (a) {
            //var price = $.ajax({ url: 'ajax/totalproductprice.ashx', async: false }).responseText;
            var price = PageMethods.additionalPrice();
            alert(price);
</script>

...代码隐藏

 [WebMethod] public static int additionalPrice()
    {
        return 77; 
    }

一旦我开始工作,additionalPrice将拥有更多逻辑。使用此代码,当您更改下拉列表时,它会发出“未定义”警报。

编辑:现在第一个问题已经解决,我有另一个问题。我试图将保持最终价格的标签设置为additionalPrice返回的值。我正在尝试在PageMethods中的onSuccess方法中执行此操作。我在页面顶部只有一个通用标签 -

<asp:Label ID="lblPrice" runat="server" />

这是我的onSuccess,以及我尝试的不同内容。他们都没有对标签做任何事情。

function onSuccess(result) {
            alert(result + "worked");
            $('.lblPrice').attr("text", result);
            $('.lblPrice').attr('text', function () {
                $(this).attr('text', result);
            })
            $('.lblPrice').text(result);
            document.getElementById('lblPrice').value = result;
            document.all('lblPrice').innerHTML = result;
        }

2 个答案:

答案 0 :(得分:1)

使用ASP.NET AJAX PageMethods时,可以通过将两个附加参数传递给调用来订阅成功和失败回调函数。在这种情况下,您将要使用

$(function () {
    $('.featureDropDown').change(function (a) {
        //var price = $.ajax({ url: 'ajax/totalproductprice.ashx', async: false }).responseText;
        PageMethods.additionalPrice(onSuccess, onFailure);
    });

    function onSuccess(result) {
        alert(result);
    }

    function onFailure(error) {
        alert(error);
    }
});

答案 1 :(得分:0)

要通过JavaScript调用网络方法,请确保使用网络方法所在的<System.Web.Script.Services.ScriptService()> class进行通话。此外,如果您决定将Web方法添加到sperate文件中,为了实现可伸缩性,您需要添加对脚本管理器的引用。

<asp:ScriptManager ID="scriptManager" runat="server">
    <Services>
        <asp:ServiceReference Path="~/WebServices/SomeWebServices.asmx" />
    </Services>
</asp:ScriptManager> 

是的,然后如前所述。如果它仍然给你问题,请告诉我。

$(function () {
    $('.featureDropDown').change(function (a) {
        //var price = $.ajax({ url: 'ajax/totalproductprice.ashx', async: false }).responseText;
        PageMethods.additionalPrice(onSuccess, onFailure);
    });

    function onSuccess(result) {
        alert(result);
    }

    function onFailure(error) {
        alert(error);
    }
});