Вручную выполняющие вызовы Ajax в ASP.NET и C#

Я хочу записать свой собственный Ajax в ASP.NET и не использовать ASP.NET ScriptManager, и т.д.

ПОЧЕМУ? Мне нравится делать материал вручную и знать, как материал работает с внутренней части, таким образом, я просто хочу сделать это для меня.

Таким образом, мой вопрос, после того, как я выполню вызов Ajax:

var ajaxCall = new XMLHttpRequest();
....
ajaxCall.send(null)

Как может я, в C#, добавлять в Page_Load (или не) так, чтобы он прислушался к этому и возвратил Строку, например.

9
задан Tomasz Iniewicz 16 February 2010 в 15:44
поделиться

5 ответов

+1 за то, что вы делаете что-то сами - мне нравится знать, что я могу делать что-то сам, прежде чем использовать фреймворки, которые делают это за меня, так что если это пойдет вверх, я примерно знаю, как это исправить.

В любом случае, перейдем к вашему вопросу. Просто выведите данные, как правило, с помощью ASP.NET или Response.Write. Если вы выполняете запрос POST, вы можете проверить это в Page_Load, используя if (Page.IsPostBack.) Помните, что обычно вы отправляете данные только для части страницы, а не для всей страницы, поэтому вы не потребуются теги , или .

Когда я видел это раньше на веб-сайтах ASP.NET, для вызовов AJAX использовались отдельные страницы (например, index.aspx = обычный сайт, index-ajax.aspx = компонент ajaxified страницы).

if (Page.IsPostBack)
{
    Response.Write("Hello, world!  From AJAX.");
}

Вы не обязательно использовать Page.IsPostBack, большинство запросов AJAX - это просто GET, поэтому, если вы вставите свой Page_Load:

Response.Write("Hello, world!  From AJAX.");

Затем выполните вызов AJAX для этой страницы, вы получите «Привет, мир! From AJAX». вернулся из вызова AJAX.

4
ответ дан 4 December 2019 в 19:33
поделиться

Поставьте лайк этому ответу , +1 за то, что сделал это сам.

Однако я должен настоятельно посоветовать вам использовать библиотеку наподобие jQuery на стороне клиента, чтобы учесть различия между браузерами (и в этом конкретном случае различия есть) . Он (или другие библиотеки) предоставит абстракцию, которую вы можете использовать во всех веб-браузерах для нормализации кода.

При этом в ASP.NET вы можете проверить, является ли вызов обратной связью, и если это так, просто записать содержимое в выходной поток.

Однако я настоятельно не рекомендую этого делать. Скорее, вызов ajax должен быть полностью на другой странице, поскольку он обеспечивает другую цель, другой тип ответа и, следовательно, заслуживает своего собственного URL-адреса.

Также имейте в виду, что при возврате контента в форме XML или JSON (что типично для вызовов Ajax, при этом JSON сейчас довольно доминирует), важно изменить свойство ContentType ответа на соответствующий тип mime. («text / xml» для XML, «application / json» для JSON).

Обратите внимание, что ASP.NET MVC делает все это намного, намного проще, и вы, возможно, захотите изучить его использование вместо модели WebForms, поскольку MVC построен с нуля, чтобы обрабатывать многие из этих сценариев намного проще.Он позволяет четко отделить методы, обрабатывающие отрисовку страницы, от методов, которые предоставляют функциональные возможности в виде вызовов Ajax (и это лишь одно из многих преимуществ).

6
ответ дан 4 December 2019 в 19:33
поделиться

Лучше всего создать файл-обработчик (* .ashx), который будет обрабатывать входящий запрос и возвращать правильно отформатированный json / xml в JavaScript. . ScriptManager используется для предоставления этого материала, встроенного непосредственно в фактическую страницу, но (если вы не собираетесь полностью перестраивать ScriptManager) вам будет проще сделать это через обработчик и обойти обработку стандартного запроса IIS.

1
ответ дан 4 December 2019 в 19:33
поделиться

Одна из функций ASP.Net - это возможность вызывать серверный код из клиентского кода без обратной передачи, используя так называемый клиентский обратный вызов. Тем не менее, я обнаружил пару незначительных замечаний: -

  • он использует XmlHttp, который на данный момент является IE. У Firefox и других браузеров есть альтернатива, но обратные вызовы используют только ее.
  • единственный тип, который вы можете вернуть с сервера, - это строка (но мы можем обойти это путем сериализации, если необходимо)

В примере, который я использовал, у меня есть два связанных текстовых поля, которые необходимо синхронизировать . Если поле ClientID изменено, в поле ClientName должно отображаться имя клиента, имеющего этот идентификатор, и наоборот.

Чтобы начать использовать эту функциональность, убедитесь, что ваш код программной части реализует интерфейс ICallbackEventHandler: -

public partial class WebForm1 : System.Web.UI.Page, ICallbackEventHandler

Затем я регистрирую свои методы обратного вызова в методе Page_Load в моем aspx.cs: -

// Set up client callbacks. These allow client-side scripts to call
// server-side functions and retrieve the results. Its a string-only
// return I'm afraid, limited by the ICallbackEventHandler method signatures

txtClientID.Attributes.Add("onchange", "GetClientNameById('id|' + this.value, 'id');");

string callBackClientID = Page.ClientScript.GetCallbackEventReference(this, "arg", "ClientNameCallback", "context", "ClientNameCallbackError", true);

string clientIDfunction = "function GetClientNameById(arg,context) { " + callBackClientID + "; }";

Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "GetClientNameById", clientIDfunction, true);

txtClientName.Attributes.Add("onchange", "GetClientIdByName('name|' + this.value, 'name');");

string callBackClientName = Page.ClientScript.GetCallbackEventReference(this, "arg", "ClientIdCallback", "context", "ClientIdCallbackError", true);

string clientNamefunction = "function GetClientIdByName(arg, context) { " + callBackClientName + "; }";

Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "GetClientIdByName", clientNamefunction, true);

Это регистрирует функции сервера с помощью страницу и подключает их к методам обратного вызова клиента - эти методы обратного вызова являются базовыми заполнителями, которые ничего не делают, кроме как дают серверу место, куда он может вернуть свою строку. Итак, на самой странице aspx: -

<script type="text/javascript">

function ClientNameCallback(result, context)

{

//sorry about the hardcoded element name...

if(result != "")

document.getElementById('ctl00_ContentPlaceHolder1_txtClientName').setAttribute('value',result);

}

function ClientIdCallback(result,context)

{

//sorry about the hardcoded element name...

if(result != "")

document.getElementById('ctl00_ContentPlaceHolder1_txtClientID').setAttribute('value',result);

}

function ClientNameCallbackError(result, context)

{

//Not sure what error is likely to arise at this point, but...

alert('Error in client name callback function - please say that to eSolutions!');

}

function ClientIdCallbackError(result, context)

{

//Not sure what error is likely to arise at this point, but...

alert('Error in client id callback function - please say that to eSolutions!');

}

</script>

Наконец, мы реализуем требуемый ICallbackEventHandler, который содержит обработку на стороне сервера, которую мы хотим выполнить: -

string ICallbackEventHandler.GetCallbackResult()
{
     return callbackReturnValue;
}

void ICallbackEventHandler.RaiseCallbackEvent(string eventArgument)
{

// eventArgument should be in format field|value,
// e.g., "id|30102" or "name|test client" 
// This is because of the "single string" limitations
// of the callback interface

if(eventArgument.StartsWith("name"))
{
    //....do lookup to get the id based on the name, from an array or database, or whatever
    callbackReturnValue = <string we want to pass back to client-side
}

else if(eventArgument.StartsWith("id"))

и т. Д. и т. Д.

0
ответ дан 4 December 2019 в 19:33
поделиться

Если я правильно рассуждаю, вы можете отличить обычный HTTP-запрос от AJAX-вызова, изучив заголовок X-Requested-With.

Итак, в вашем игрушечном примере, если бы вы хотели по-другому реагировать на AJAX запрос:

public void Page_Load(object sender, EventArgs e)
{
    if (Request.Headers["X-Requested-With"] == "XMLHttpRequest")
    {
       Response.Clear(); // dont want <html>.... etc stuff
       Response.Write("Hi from AJAX!");
    }
    else
    {
        // normal page stuff
    }
}

то в вашем js, что-то вроде этого (простите любые синтаксические ошибки пожалуйста)

var req = new XmlHttpRequest();
req.open("GET","default.aspx",false);
req.send("");
document.getElementById('some_div').innerHTML = req.responseXML;
1
ответ дан 4 December 2019 в 19:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: