2012-11-16 26 views
5

Od dawna programista WinForm, ale nowy na scenie programowania WWW. Mam Visual Studio 2010 i stworzyłem nowy projekt WebSite. Nie mogę sprawić, by ajax wywoływał stworzony przeze mnie webmethod. Po kliknięciu przycisku na stronie nic się nie dzieje.Metoda WWW nie jest wywoływana przez jquery z funkcji javascript

Wygląda na to, że jQuery 1.4.1 zostanie automatycznie dodany w folderze Skrypty podczas tworzenia projektu WebSite.

W Default.aspx dodaję 2 tagów skryptu:

<script src="Scripts/jquery-1.4.1.js" type="text/javascript"></script> 
<script language="javascript" type="text/javascript" src="Scripts/Process.js"> 

umieścić przycisk na stronie, w którym funkcja jest zdefiniowana w onclick Process.js:

<input id="btnTest" type="button" value="Test" onclick="btnTest_onclick()" /> 

W procesie. js mam następujący kod:

function btnTest_onclick() { 

    var strData = JSON.stringify({ 
     userid: 5 
    }); 

    alert(strData); 

    $.ajax({ 
     url: 'Default.aspx/GetData', 
     type: "POST", 
     data: strData, 
     contentType: "application/json; charset=utf-8", 
     dataType: "json", 
     success: Success, 
     failure: Failure, 
     async: true 
    }); 
} 

function Success(data) { 
    alert("success"); 
} 

function Failure(data) { 
    alert("failure"); 
} 

W Default.aspx.cs:

public partial class _Default : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 

    } 

    [WebMethod()] 
    public static string GetData(int id) 
    { 
     return "hello, my id is " + id; 
    } 
} 
+0

Wiesz ... zawsze można 'jquery' Update Package w konsoli, aby uzyskać najnowszą stabilną wersję jQuery (lub użyj UI zrobić to samo, a nawet zrobić to ręcznie poprzez zastąpienie skrypt file) – MilkyWayJoe

+1

również, w [$ .ajax] (http://api.jquery.com/jQuery.ajax/) poprawne wywołanie zwrotne to "błąd", a nie "niepowodzenie". Zastąp to. – MilkyWayJoe

+0

Czy 1.4.1 nie jest stabilny? Sądzę, że ponieważ MS wydaje się automatycznie włączać to dla ciebie, zakładałem, że musi być stabilny. To działało, pokazując mi, że to zawodzi, dzięki. Teraz muszę dowiedzieć się, dlaczego to się nie udaje :) – user441521

Odpowiedz

4

ja nie wiem, czy dokonywania żądania Ajax jQuery jest wymogiem dla ciebie, ale można łatwiej zrobić ajax żądania do strony metody wykorzystujące możliwości programu ASP.NET ajax.

Przede wszystkim chcę zauważyć, że aby użyć metody PageMethods, należy dodać do niej kontrolkę menedżera skryptów i określić EnablePageMethods = "True".

Kiedy to zrobisz, ScriptManager wyświetli definicję strony PageMethods, która reprezentuje proxy zdefiniowanych metod stronicowania na stronie i możesz łatwo wywołać te metody za pomocą żądania Ajax.

Więc można spróbować następujący kod:

<asp:ScriptManager ID="ScriptManager" runat="server" EnablePartialRendering="true" EnablePageMethods="True" /> 
<input id="btnTest" type="button" value="Test" onclick="btnTest_onclick()" /> 
<script type="text/javascript"> 
    function btnTest_onclick() { 

     PageMethods.GetData(5, Success, Failure); 
    } 

    function Success(data) { 
     alert("success"); 
     alert(data); 
    } 

    function Failure(data) { 
     alert("failure"); 
    } 

</script> 

Jak widać kod ten ma mniej linii kodu i działa.

+0

To zadziałało! To pokazuje mi, że moje wywołanie ajaxowe jest pomieszane. Naprawdę chciałbym wiedzieć, co zrobiłem źle z tym. Czy możesz tego użyć tylko dla funkcji zdefiniowanych na tej stronie? Na przykład, jeśli chcę utworzyć stronę, która zasadniczo istnieje do przechowywania popularnych funkcji do użycia w dowolnym miejscu, czy to działa, ponieważ istnieją one na stronie innej niż ta, która chce się nazywać? Jedną z głównych korzyści, jaką widzę, jest to, że mogę określić stronę, na której funkcja polega z wywołaniem ajax'a za pomocą "Default.aspx/GetData". Czy mogę to zrobić za pomocą ScriptManage i PageMethods? Jeśli tak, wolę tę metodę. – user441521

+0

Aby udostępnić kod między stronami, lepiej będzie skorzystać z funkcji WCF lub usługi sieci Web obsługującej technologię Ajax. Poniższy link Dino Esposito opisuje to podejście: http://dotnetslackers.com/articles/ajax/JSON-EnabledWCFServicesInASPNET35.aspx. Jeśli przejrzysz ten artykuł, zobaczysz, że praca z usługą wcf będzie taka sama jak w przypadku metod strony. Uwaga: będziesz także miał dostęp do sesji w metodach obsługi wcf, które zaimplementowały sposób opisany w artykule. –

+0

Możesz także przejrzeć moją odpowiedź na następujące pytanie: http://stackoverflow.com/questions/12886991/calling-wcf-server-from-asp-net/12992569#12992569 –

1

Nazwy pozycji danych muszą być zgodne z argumentów metody strony:

var strData = JSON.stringify({ 
       id_MATCH: 5 
      }); 

    [WebMethod()] 
    public static string GetData(int id_MATCH) 
    { 
     return "hello, my id is " + id_MATCH; 
    } 
+0

Nazwałam oba id i nadal nie udało mi się. Również każdy wie, jak zatrzymać IE z buforowania rzeczy. Wprowadziłem zmianę, reran i alert() wciąż mówił userid. Usunąłem tymczasowe pliki internetowe i reran, a następnie pokazałem id, ale denerwujące jest ciągłe usuwanie tymczasowych plików internetowych. – user441521

+1

Spróbuj zatrzymać serwer programistyczny między testami. Kliknij prawym przyciskiem myszy ikonę powiadomienia na pasku zadań i wybierz opcję Zatrzymaj. –

+0

To działa, chociaż ma mniej więcej taką samą liczbę kliknięć, aby usunąć tymczasowe pliki internetowe:/ – user441521

0

Poniżej znajduje się po Ajax i metoda internetowej przetwarzać

<input id="btnTest" type="button" value="Test" onclick="btnTest_onclick()" /> 
<script type="text/javascript" > 
function btnTest_onclick() { 

var strData = JSON.stringify({ 
    userid: 5 
}); 

alert(strData); 

$.ajax({ 
    url: 'Default.aspx/GetData', 
    type: "POST", 
    data: strData, 
    contentType: "application/json; charset=utf-8", 
    dataType: "json", 
    success: Success, 
    failure: Failure, 
    async: true 
}); 
} 

function Success(data) { 
alert("success"); 
} 

function Failure(data) { 
alert("failure"); 
}</script> 

[System.Web.Services.WebMethod()] 
    public static string GetData(int userid) 
    { 
     return "hello, my id is " + userid; 
    } 

mógłbyś sprawdzić powyższy kod, gdzie nazwa dane wysyłane z $ .ajax jest taka sama jak w WebMethod.

Dzięki

Powiązane problemy