Как вызвать методы страницы .net из JavaScript без JQuery? - PullRequest
2 голосов
/ 14 октября 2008

Я пытался вызвать методы страницы из моего собственного кода JavaScript, но это не работает. Если я использую jQuery AJAX, я могу успешно вызывать методы страницы, но мне нужно сделать это из моего собственного кода JavaScript, потому что мы не можем использовать сторонние библиотеки (мы создаем нашу собственную библиотеку).

Всякий раз, когда я использую методы jQuery AJAX, я получаю результат метода страницы, а когда я использую свои собственные методы JS, я получаю целую страницу обратно из запроса AJAX.

Должно быть что-то другое в том, как jQuery обрабатывает запросы AJAX. Кто-нибудь знает, что это может быть?

Ниже приведен код, который я использую для вызова того же метода страницы с jQuery, который работает, и код, который я использую для его вызова самостоятельно.

JQuery

// JScript File
$(document).ready(function() {
  $("#search").click(function() {
    $.ajax({
      type: "POST",
      url: "Account.aspx/GetData",
      data: "{}",
      contentType: "application/json; charset=utf-8",
      dataType: "json",
      success: function(msg) {
        // Substitui o conteúdo da DIV vom o retorno do Page Method.
        displayResult(msg);
      }
    });
  });
});

Пользовательский JS

function getHTTPObject() {
    var xhr = false;
    if (window.XMLHttpRequest) {
        xhr = new XMLHttpRequest();
    } else if (window.ActiveXObject) {
        try {
            xhr = new ActiveXObject("Msxml2.XMLHTTP");
        } catch(e) {
            try { 
                xhr = new ActiveXObject("Microsoft.XMLHTTP");
            } catch(e) {
                xhr = false;
            }
        }
    }
    return xhr;
}

function prepareLinks() {
    var btn  = document.getElementById("search");
    btn.onclick = function() {
        var url = "Account.aspx/GetData"
        return !grabFile(url);
    }    
}

function grabFile(file) {
    var request = getHTTPObject();
    if (request) {
        displayLoading(document.getElementById("result"));
        request.onreadystatechange = function() {
            parseResponse(request);
        };
        //Abre o SOCKET
        request.open("GET", file, true);
        //Envia a requisição
        request.send(null);
        return true;
    } else {
        return false;
    }
}

function parseResponse(request) {
    if (request.readyState == 4) {
        if (request.status == 200 || request.status == 304) {
            var details = document.getElementById("result");
            details.innerHTML = request.responseText;
            fadeUp(details,255,255,153);
        }
    }
}

function addLoadEvent(func) {
    var oldonload = window.onload;
    if (typeof window.onload != 'function') {
        window.onload = func;
    } else {
        window.onload = function() {
        if (oldonload) {
            oldonload();
        }
            func();
        }
    }
}

addLoadEvent(prepareLinks);

ОБНОВЛЕНИЕ: Я решил принять Стивемегсона, так как его ответ был фактической причиной моей проблемы. Но я хотел бы поделиться с вами несколькими альтернативами, которые я нашел для этой проблемы.

Ответ Стивемегсона : Все, что мне нужно было сделать, это перейти на POST-запрос и установить заголовок запроса на JSON, что решило мою проблему при запросе методов страницы, но сейчас у меня трудные времена при обработке ответа (я расскажу об этом подробнее) на другой вопрос).

Вот правильный код, чтобы получить этот материал:

print("function prepareLinks() {
var list = document.getElementById("search");
list.onclick = function() {
    var url = "PMS.aspx/GetData"
        return !grabFile(url);
    } }");

print("function grabFile(file) {
var request = getHTTPObject();
if (request) {
    //Evento levantado pelo Servidor a cada mudança de Estado na 
    //requisição assíncrona
    request.onreadystatechange = function() {
        parseResponse(request);
    };        
    //USE POST
    request.open('POST', file, true);
    //SET REQUEST TO JSON
    request.setRequestHeader('Content-Type', 'application/json');
    // SEND REQUISITION
    request.send(null)
    return true;
} else {
    return false;
}
}");

Ответ Брендана : Благодаря ответу Брендана я провел небольшое исследование интерфейса ICallBack и ICallBackEventHandler. К моему удивлению, это способ разработки aspx-страниц с использованием Microsoft AJAX Request. Это оказывается действительно интересным решением, так как для этого не требуется никакой библиотеки JS, и она находится внутри .Net Framework, и я полагаю, что об этом знают только немногие люди (по крайней мере, те, которые были вокруг меня, не знали). не знаю об этом вообще). Если вы хотите узнать больше о ICallBack, проверьте этот текст ссылки в MS или просто скопируйте и вставьте ответ Брендана.

Третье решение: Другое решение, которое я нашел, состояло в том, чтобы вместо создания ASPX-страниц для обработки моего кода на стороне сервера я реализовывал HTML-страницы и вызывал файлы ASHX, которые выполняли бы те же функции, но использовали бы меньше полоса, чем страница ASPX. Одним из преимуществ этого решения является то, что я смог заставить его работать с запросами POST и GET. Ниже приведен код.

ASHX код:

print("Imports System.Web
       Imports System.Web.Services
       Public Class CustomHandler
         Implements System.Web.IHttpHandler
          Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest
context.Response.ContentType = "text/plain"
Dim strBuilder As New System.Text.StringBuilder
strBuilder.Append("<p>")
strBuilder.Append("Your name is: ")
strBuilder.Append("<em>")
strBuilder.Append(context.Request.Form(0))
strBuilder.Append("</em>")
strBuilder.Append("</p>")
context.Response.Write(strBuilder.ToString)
End Sub
ReadOnly Property IsReusable() As Boolean Implements IHttpHandler.IsReusable
Get
  Return False
End Get End Property End Class");

Файл JavaScript:

print("function prepareLinks() {
var list = document.getElementById("search");
list.onclick = function() {
    var url = "CustomHandler.ashx"
        return !grabFile(url);
    }    
}");

print("function grabFile(file) {
var request = getHTTPObject();
if (request) {
    request.onreadystatechange = function() {
        parseResponse(request);
    };
    //VERSÃO do POST
    request.open('POST', file, true);
    request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    request.send('name=Helton Valentini')
    return true;
} else {
    return false;
} }");

Используя любой из этих трех вариантов, мы можем совершать асинхронные вызовы без использования JQuery, используя наш собственный Javacript или используя ресурсы, встроенные в Microsoft .Net Framework.

Надеюсь, это поможет некоторым из вас.

Ответы [ 3 ]

2 голосов
/ 15 октября 2008

Вы запрашиваете URL с помощью GET, а код jQuery использует POST. Я ожидаю, что метод страницы может быть вызван только через POST, чтобы позволить вам включить любые параметры в тело вашего запроса. Вам также может понадобиться установить Content-Type вашего запроса на application / json, как это делает код jQuery - я не знаю, будет ли .NET принимать другие типы контента.

2 голосов
/ 14 октября 2008

Одним из сравнительно простых решений является реализация вашего кода позади ICallbackEventHandler. Это немного грубовато по сравнению с jQuery, но работает.

Partial Public Class state
    Implements ICallbackEventHandler

    Private _callbackArg As String

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        RegisterCallbackScript()
    End Sub

    Private Sub RegisterCallbackScript()  
        Dim cbRef As String = Page.ClientScript.GetCallbackEventReference(Me, "args", "RecieveServerData", "context")
        Dim cbScript As String = "function CallServer(args, context) {" & cbRef & "; }"
        ClientScript.RegisterClientScriptBlock(Me.GetType(), "CallServer", cbScript, True)
    End Sub

    Public Sub RaiseCallbackEvent(ByVal eventArgs As String) Implements ICallbackEventHandler.RaiseCallbackEvent
        _callbackArg = eventArgs
    End Sub

    Private Function GetCallbackResults() As String Implements ICallbackEventHandler.GetCallbackResult
        Dim args As String() = _callbackArg.Split(CChar("~"))
        If args(0) = "search"
            Return args(0) + "~" + GetSearchResults(args(1))
        End If
    End Function

    Private Function GetSearchResults(ByVal keyword As String) As String
        Dim htmlResults As String
        //Build your html here
        Return htmlResults 
    End Function

End Class

// JavaScript

function searchButtonClicked(keyword) {
    CallServer('search~' + keyword);
}

function RecieveServerData(arg, context) {
    var args = arg.split('~');
    switch(args[0]){
        case 'search':
            document.getElementById('result').innerHTML = args[1]
            break;
    }
}

Надеюсь, это поможет.

1 голос
/ 15 октября 2008

Если вы используете ASP.NET AJAX, вам не нужно ничего этого делать. Существует четко определенный способ использования PageMethods, который намного менее сложен.

Codebehind

    [WebMethod]
    public static Whatever GetWhatever( int someParameter, string somethingElse )
    {
       ... make a Whatever ...

       return whatever;
    }

Page

...
<script type="text/javascript">
   function invokePageMethod(button)
   {
       var ctx = { control: button };
       var someParameter = ...get value from a control...
       var somethingElse = ...get another value from a control...
       PageMethods.GetWhatever( someParameter, somethingElse, success, failure, ctx );
   }

   function success(result,context) {
       ... rearrange some stuff on the page...
   }

   function failure(error,context) {
       ... show some error message ...
   }
</script>
...

<asp:ScriptManager runat="server" id="myScriptManager" EnablePageMethods="true">
</asp:ScriptManager>

...

<input type="button" onclick="invokePageMethod(this);" value="Do Something" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...