Картинка блога

Есть много способов вызова методов ASP.NET (вызов WebService или статический Page метод). Но в этом посте речь подет об интерфейсе IPostBackEventHandler

Вот что говорит MSDN об IPostBackEventHandler«Определяет метод, который должен быть реализован ASP.NET серверными элементами управления для обработки событий обратной передачи.», не буду тут сильно разжевывать теорию. Обработчик, без проверки входящих параметров, может например выглядеть так:

public virtual void RaisePostBackEvent(string eventArgument)
{
string[] argArr = eventArgument.Split('$');
string[] argArr2 = null;
if(argArr.Length>1) {
argArr2 = new string[argArr.Length-1];
Array.Copy(argArr, 1, argArr2, 0, argArr2.Length);
}
HandlePostBackEvent(argArr[0], argArr2);
}
protected virtual void HandlePostBackEvent(string request, params string[] args)
{
log.Debug(request + ": " + args);
}

Теперь посмотрим, как это можно использовать в унаследованном классе:

protected override void HandlePostBackEvent(string request, params string[] args)
{
if (request == "ShowVersionDetail")
{
int id = 0;
Int32.TryParse(args[0], out id);
SetResult("ShowVersionDetailLink", new SystemVersionDetailResultContext(matrixSystem.ID, id));
}
}

В этом проекте использовался ResultMapping от Spring.NET. Но это не тема для этой статьи.

И так, у нас есть обработчик событий, который разбирает агрументы на запрос и аргументы. Теперь, его нужно вызвать из JavaScript. Для этого нам нужно вызвать метод вида: javascript:__doPostBack(‘[control.ClientID|»__Page»]‘,’[передаваемые параметры]‘);

Форматтер для YUI может выглядеть примерно так:

YAHOO.project.formatPostback = function(elCell, oRecord, oColumn, oData) {
if(!oColumn.postback) alert("formatPostback - postback is missing");
var str = oColumn.postback.str?oColumn.postback.str:"{0}";
var key = oColumn.postback.key?oColumn.postback.key:oColumn.name;
var ctl = oColumn.postback.control?oColumn.postback.control:'__Page';
elCell.innerHTML =
''+oData+"";
}

Бывает так, что метод __doPostBack отсутствует на странице. Это из за того что Script Manager не инициализирован на странице. Самый простой способ его инициализировать, для этого на странице должен быть как минимум один контрол с autopostback=true. Можно просто добавить на страницу контол:

Метки: