IPostBackEventHandler RaisePostBackEvent не запускается при асинхронной обратной передаче - PullRequest
1 голос
/ 08 мая 2009

Я разработал пользовательский элемент управления, в основном кнопку, которая реализует интерфейс IPostBackEventHandler и, очевидно, определяет метод RaisePostBackEvent(string eventArgument), где я выполняю некоторую обработку, в основном я запускаю другие события.

По умолчанию при нажатии мой элемент управления выполняет __doPostBack его идентификатор клиента для полного обновления страницы, и, конечно, срабатывает RaisePostBackEvent.

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

Проблема в том, что RaisePostBackEvent не срабатывает. Я знаю, что могу заглянуть в Page.Request.Params["__EVENTARGUMENT"] и сделать все, что мне нужно, но мне бы очень хотелось что-то столь же простое и элегантное, как IPostBackEventHandler, чтобы вся логика была под моим контролем.

Короче говоря, как я могу вызвать RaisePostBackEvent в случае асинхронной обратной передачи? Или есть другой интерфейс с аналогичной функциональностью?

Ответы [ 3 ]

6 голосов
/ 10 мая 2009

Дело в том (если я правильно понимаю ваш вопрос), что элемент управления, который вызывает __doPostBack, должен реализовывать интерфейс IPostBackEventHandler. Так, например, если у меня есть эта разметка в пользовательском контроле (который реализует IPostBackEventHander):

<asp:Button runat="server"
     UseSubmitBehavior="false" ID="Button"
     Text="Update"
     OnClientClick="myfunction();"/>

JavaScript функции myfunction должен выглядеть следующим образом:

<script type="text/javascript">
    function myfunction(param)   
    {
        __doPostBack("<%= this.UniqueID %>", "myargs");    
    }
</script>

Обратите внимание, что я отправляю this.UniqueID, а не Button.UniqueID, потому что кнопка не реализует IPostBackEventHander, а пользовательский контроль делает.

2 голосов
/ 14 августа 2012

У меня была та же проблема, и я нашел эту тему, когда искал решение. Я нашел это, поэтому я опубликую это, чтобы помочь разработчикам, которые могли иметь ту же самую проблему.

Реализация интерфейса IPostBackEventHandler в вашем UserControl:

Public Class UserControl_Rattachement
Inherits System.Web.UI.UserControl
Implements ICallbackEventHandler, IPostBackEventHandler

В функции RaisePostBackEvent вызовите метод Update () вашей UpdatePanel:

Public Sub RaisePostBackEvent(eventArgument As String) Implements System.Web.UI.IPostBackEventHandler.RaisePostBackEvent
    // Code executed during the PostBack
    UpdatePanel1.Update()
End Sub

В методе Page_Load вашего UserControl определите PostBack как асинхронный:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    ScriptManager.GetCurrent(Page).RegisterAsyncPostBackControl(Me)
End Sub

Теперь добавьте клиентский скрипт в метод Render:

Protected Overrides Sub Render(writer As System.Web.UI.HtmlTextWriter)
    MyBase.Render(writer)

    Dim postbackReference As String = Page.ClientScript.GetPostBackEventReference(Me, Nothing, True)
    Dim postbackScript As String = String.Format("function updateRattachement() {{ {0}; }}", postbackReference)

    writer.WriteLine("<script type=""text/javascript"">")
    writer.WriteLine(postbackScript)
    writer.WriteLine("</script>")
End Sub

Затем вызовите функцию на стороне клиента, когда она вам понадобится:

updateRattachement();

PostBack будет асинхронным, и это обновит панель обновления, которую вы указали.

Надеюсь, это поможет, и извините за мой английский.

0 голосов
/ 14 ноября 2014

this line is the key or the custom click event ignores updatepanel 
// ScriptManager.GetCurrent(Page).RegisterAsyncPostBackControl(this);</p>

<p>and note the IPostBackEventHandler part in page definition


<pre>
in this example ordinary button and a custom click event div work together inside an update panel

открытый частичный класс tmp2: System.Web.UI.Page, IPostBackEventHandler {

protected void Page_Load(object sender, EventArgs e) { ScriptManager.GetCurrent(Page).RegisterAsyncPostBackControl(this); if (!Page.IsPostBack) { div1.Attributes["onclick"] = ClientScript.GetPostBackEventReference(this, "ClickDiv"); } } protected void Button1_Click(object sender, EventArgs e) { Label1.Text += "1"; UpdatePanel1.Update(); } protected void Div1_Click() { div1.InnerHtml += "b"; UpdatePanel1.Update(); } public void RaisePostBackEvent(string eventArgument) { if (!string.IsNullOrEmpty(eventArgument)) { if (eventArgument == "ClickDiv") { Div1_Click(); } } }

}

...