2011-10-31 3 views
1

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

В этом элементе управления я использую панель обновления, и внутри панели обновления я использую литеральный элемент управления, в котором я обрабатываю собственные 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 разметке я использую следующий код (внутри или снаружи панели Update):

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

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

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

Любые идеи?

Спасибо заранее,

Джордж

+0

Знаете ли вы, что вы можете отметить один ответ на вопрос как [принято] (http://meta.stackexchange.com/q/5234)? –

ответ

0

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

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

<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)