__doPostBack вне href вызывает полную обратную передачу страницы - PullRequest
1 голос
/ 31 октября 2011

У меня есть пользовательский элемент управления (ascx), который реализует интерфейс IPostBackEventHandler для перехвата пользовательских событий, запускаемых пользовательскими отображаемыми ссылками HTML.

В этом элементе управления я использую панель обновления, а внутри панели обновления я использую буквальный элемент управления, в котором я отображаю пользовательские ссылки HTML.

Когда я отображаю HTML-ссылки внутри литерального элемента управления, я использую StringBuilder со следующим кодом:

sb.AppendFormat ("<a href=\"{0}\" id=\"custom_iterator_id\">Text</a>",
    this.Page.ClientScript.GetPostBackClientHyperlink(this, custom_string_param));

Гиперссылки отображаются нормально, и при нажатии на них запускается асинхронная обратная передача ичастичное обновление запускается (так как все ссылки отображаются на панели обновлений).

Проблема в том, что мне нужно сделать некоторый пользовательский Javascript перед запуском __doPostBack, который отображается с помощью приведенного выше кода.Итак, вот упрощенная версия измененного кода:

sb.AppendFormat ("<a href=\"javascript:JSFunc{0}\" id=\"custom_iterator_id\">Text</a>",
    custom_string_param);

Также в разметке ascx я использую следующий код (внутри или снаружи панели обновления):

<script language="javascript" type="text/javascript">
function JSFunc(param) {
// custom js code here .... 
__doPostBack('<%=this.ClientID%>', param);
}
</script>

Проблемаздесь, когда ссылка нажата, она выполняет полную обратную передачу, а не частичную.Я также протестировал более простые версии приведенного выше кода, и кажется, что если вы удалите __doPostBack из ссылки href или onclick из ссылки (тега) и переместите его в пользовательскую функцию js, которая, в свою очередь, вы предоставляете ссылке,полный постбэк срабатывает.

Обратите внимание, что на странице нет ошибок, и в обоих случаях код работает правильно.Страница корректно отображается в зависимости от параметров, возвращаемых из __doPostBack, но во втором случае запускается полная, а не частичная обратная передача.

Есть идеи?

Заранее спасибо,

George

1 Ответ

0 голосов
/ 11 декабря 2011

Я думаю, вы не можете вызвать __doPostBack с ClientID. На самом деле он использует UniqueIDWithDollars, но обычно с веб-формами ASP.NET я говорю: вы не хотите знать .

Поскольку вызов этого метода сводится к абстрагированию деталей того, как работает постбэк, вам лучше спросить структуру кода. К счастью, для этого есть специальный метод, который позаботится о деталях. В вашем коде это будет выглядеть примерно так:

<script language="javascript" type="text/javascript">
    function JSFunc(param) {
        // custom js code here .... 
        <%= Page.ClientScript.GetPostBackEventReference(this, custom_string_param) %>
    }
</script>

Это позволит менеджеру клиентских скриптов создать фрагмент кода JavaScript, используя ссылку на ваш пользовательский элемент управления (this) и любой пользовательский аргумент события (custom_string_param).

Хотя есть одна оговорка. При его вызове это добавит javascript: к началу строки.

Чтобы переопределить это поведение, вам нужно использовать перегрузку GetPostBackEventReference, которая принимает экземпляр PostBackOptions в качестве первого аргумента, экземпляр имеет RequiresJavaScriptProtocol свойство установлено в false.

PostBackOptions options = new PostBackOptions(this, custom_string_param)
options.RequiresJavaScriptProtocol = false;
Page.ClientScript.GetPostBackEventReference(options)
...