Использование JQuery для вызова WebMethod

У меня возникли проблемы с проникновением в мой Search WebMethod из моего вызова JQuery. Может быть, кто-то может помочь указать мне в правильном направлении.

Я также запаковал все в zip-файл на случай, если кто-то захочет проверить его поближе.

http://www.filedropper.com/jsonexample

Спасибо, Райан.

    <%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default.aspx.vb" Inherits="_Default" %>

<!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">
<head runat="server">
    <title>JSON Example</title>
    <script type="text/javascript" language="JavaScript" src="jquery-1.3.1.min.js"></script>

<script type="text/javascript" language="javascript">

function Search() {
    var search = $("#searchbox").val();
    var options = {
        type: "POST",
        url: "Default.aspx/Search",
        data: "{text:" + search + "}",
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function(msg) {
            alert('Success!');
        }
    };
    $.ajax(options);
}
</script>

</head>
<body>
    <form id="form1" runat="server">
        <input type="text" id="searchbox" size="40" />
        <a href="#" onclick="Search()" id="goSearch">Search</a>
        <br />        
        <div id="Load" />
    </form>
</body>
</html>

А вот код для default.aspx

 Imports System.Data
    Imports System.Web.Services
    Imports System.Web.Script.Serialization

    Partial Class _Default
        Inherits System.Web.UI.Page

        <WebMethod()> _
        Public Shared Function Search(ByVal text As String) As IEnumerable
            Return "test"
        End Function

    End Class

person Community    schedule 18.02.2009    source источник
comment
Что вы имеете в виду, проникая внутрь своего WebMethod, например, не нажимая на точку останова? Почему бы вам просто не использовать код, созданный для вас с помощью MS Ajax PageMethods? В противном случае вызов его через jQuery ничего не спасет.   -  person Quintin Robinson    schedule 19.02.2009
comment
Я понимаю, что есть несколько других способов доступа к методам через javascript, например PageMethods. Я также понимаю, что этот пример ничего не делает. Но я сделал самую простую нерабочую версию для всеобщего ознакомления. Я просто не могу попасть в свою точку останова для метода поиска.   -  person    schedule 19.02.2009
comment
в том числе вы открываете/закрываете теги script в той же строке, что усекает ваш код. Пожалуйста, обновите свой вопрос и поместите разрыв строки между тегами open и close script.   -  person bendewey    schedule 19.02.2009


Ответы (2)


Чтобы решить такую ​​проблему, первое, что нужно сделать, это посмотреть ее в Firebug.

Если вы нажмете ссылку «Поиск» и посмотрите запрос/ответ POST в консоли Firebug, вы увидите, что он выдает ошибку сервера 500: Invalid JSON Primitive.

Причина этого в том, что идентификаторы ключа/значения в вашем литерале JSON «данные» не заключены в кавычки. Строка 17 должна быть:

data: "{'text':'" + search + "'}",

Тогда все будет работать как положено.

Примечание. Предлагаемые данные { test: search } не работают. Если вы предоставите jQuery фактический литерал JSON вместо строки, он преобразует его в пару ключ/значение test=search и POST вместо JSON. Это также приведет к тому, что ASP.NET AJAX ScriptService или PageMethod выдаст ошибку Invalid JSON Primitive.

person Dave Ward    schedule 18.02.2009
comment
FireBug и Fiddler — находка. - person Quintin Robinson; 19.02.2009
comment
Это исправило это! Спасибо, Дэйв, мне нравится твой блог и те замечательные вещи, о которых ты пишешь. - person ; 19.02.2009

Вам нужно сделать следующее (С#):

  • Веб-метод должен быть public static
  • Он должен быть украшен атрибутом [WebMethod]
  • Вам нужен ScriptManager на вашей странице .aspx
  • Установите EnablePageMethods="true" ScriptManager'а

А вот пример javascript:

$().ready(function() {
    $(yourDropDownList).change(LoadValues);
});


function LoadValues() {
    PageMethods.YourMethod(arg1, CallSuccess, CallFailed);
}

function CallFailed(result) {
    alert('AJAX Error:' + result.get_message());
}

function CallSuccess(result) {
    //do whatever you need with the result
}
person flesh    schedule 18.02.2009
comment
Я использую общий метод. Метод, который вы описываете, является другим способом доступа к веб-методам. Я получил свой пример на основе encosia.com/2008/05/29/ - person ; 19.02.2009