Я хочу записать свой собственный Ajax в ASP.NET и не использовать ASP.NET ScriptManager, и т.д.
ПОЧЕМУ? Мне нравится делать материал вручную и знать, как материал работает с внутренней части, таким образом, я просто хочу сделать это для меня.
Таким образом, мой вопрос, после того, как я выполню вызов Ajax:
var ajaxCall = new XMLHttpRequest();
....
ajaxCall.send(null)
Как может я, в C#, добавлять в Page_Load (или не) так, чтобы он прислушался к этому и возвратил Строку, например.
+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.
Поставьте лайк этому ответу , +1 за то, что сделал это сам.
Однако я должен настоятельно посоветовать вам использовать библиотеку наподобие jQuery на стороне клиента, чтобы учесть различия между браузерами (и в этом конкретном случае различия есть) . Он (или другие библиотеки) предоставит абстракцию, которую вы можете использовать во всех веб-браузерах для нормализации кода.
При этом в ASP.NET вы можете проверить, является ли вызов обратной связью, и если это так, просто записать содержимое в выходной поток.
Однако я настоятельно не рекомендую этого делать. Скорее, вызов ajax должен быть полностью на другой странице, поскольку он обеспечивает другую цель, другой тип ответа и, следовательно, заслуживает своего собственного URL-адреса.
Также имейте в виду, что при возврате контента в форме XML или JSON (что типично для вызовов Ajax, при этом JSON сейчас довольно доминирует), важно изменить свойство ContentType ответа на соответствующий тип mime. («text / xml» для XML, «application / json» для JSON).
Обратите внимание, что ASP.NET MVC делает все это намного, намного проще, и вы, возможно, захотите изучить его использование вместо модели WebForms, поскольку MVC построен с нуля, чтобы обрабатывать многие из этих сценариев намного проще.Он позволяет четко отделить методы, обрабатывающие отрисовку страницы, от методов, которые предоставляют функциональные возможности в виде вызовов Ajax (и это лишь одно из многих преимуществ).
Лучше всего создать файл-обработчик (* .ashx), который будет обрабатывать входящий запрос и возвращать правильно отформатированный json / xml в JavaScript. . ScriptManager используется для предоставления этого материала, встроенного непосредственно в фактическую страницу, но (если вы не собираетесь полностью перестраивать ScriptManager) вам будет проще сделать это через обработчик и обойти обработку стандартного запроса IIS.
Одна из функций ASP.Net - это возможность вызывать серверный код из клиентского кода без обратной передачи, используя так называемый клиентский обратный вызов. Тем не менее, я обнаружил пару незначительных замечаний: -
В примере, который я использовал, у меня есть два связанных текстовых поля, которые необходимо синхронизировать . Если поле 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"))
и т. Д. и т. Д.
Если я правильно рассуждаю, вы можете отличить обычный 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;