wake-up-neo.com

Wie kann ich beim Postback überprüfen, welches Steuerelement das Postback im Ereignis PageInit verursacht?

Wie kann ich beim Postback überprüfen, welches Steuerelement das Postback im Ereignis PageInit verursacht?.

protected void Page_Init(object sender, EventArgs e)
{
//need to check here which control cause postback?

}

Vielen Dank

59
Muhammad Akhtar

Ich sehe, dass es bereits einige großartige Ratschläge und Methoden gibt, wie man die Post-Back-Kontrolle bekommt. Ich fand jedoch eine andere Webseite ( Mahesh-Blog ) mit einer Methode zum Abrufen der Post-Back-Control-ID.

Ich werde es hier mit einer kleinen Modifikation posten, einschließlich, dass es eine Erweiterungsklasse ist. Hoffentlich ist es auf diese Weise nützlicher.

/// <summary>
/// Gets the ID of the post back control.
/// 
/// See: http://geekswithblogs.net/mahesh/archive/2006/06/27/83264.aspx
/// </summary>
/// <param name = "page">The page.</param>
/// <returns></returns>
public static string GetPostBackControlId(this Page page)
{
    if (!page.IsPostBack)
        return string.Empty;

    Control control = null;
    // first we will check the "__EVENTTARGET" because if post back made by the controls
    // which used "_doPostBack" function also available in Request.Form collection.
    string controlName = page.Request.Params["__EVENTTARGET"];
    if (!String.IsNullOrEmpty(controlName))
    {
        control = page.FindControl(controlName);
    }
    else
    {
        // if __EVENTTARGET is null, the control is a button type and we need to
        // iterate over the form collection to find it

        // ReSharper disable TooWideLocalVariableScope
        string controlId;
        Control foundControl;
        // ReSharper restore TooWideLocalVariableScope

        foreach (string ctl in page.Request.Form)
        {
            // handle ImageButton they having an additional "quasi-property" 
            // in their Id which identifies mouse x and y coordinates
            if (ctl.EndsWith(".x") || ctl.EndsWith(".y"))
            {
                controlId = ctl.Substring(0, ctl.Length - 2);
                foundControl = page.FindControl(controlId);
            }
            else
            {
                foundControl = page.FindControl(ctl);
            }

            if (!(foundControl is IButtonControl)) continue;

            control = foundControl;
            break;
        }
    }

    return control == null ? String.Empty : control.ID;
}

Update (22.07.2016): Typprüfung für Button und ImageButton wurde geändert, um nach IButtonControl, um das Erkennen von Postbacks von Steuerelementen von Drittanbietern zu ermöglichen.

115
J Pollack

Hier ist ein Code, der den Trick für Sie tun könnte (entnommen aus Ryan Farleys Blog )

public static Control GetPostBackControl(Page page)
{
    Control control = null;

    string ctrlname = page.Request.Params.Get("__EVENTTARGET");
    if (ctrlname != null && ctrlname != string.Empty)
    {
        control = page.FindControl(ctrlname);
    }
    else
    {
        foreach (string ctl in page.Request.Form)
        {
            Control c = page.FindControl(ctl);
            if (c is System.Web.UI.WebControls.Button)
            {
                control = c;
                break;
            }
        }
    }
    return control;
}
16
silvo

Entweder direkt in Formularparametern oder

string controlName = this.Request.Params.Get("__EVENTTARGET");

Bearbeiten: So überprüfen Sie, ob ein Steuerelement ein Postback verursacht hat (manuell):

// input Image with name="imageName"
if (this.Request["imageName"+".x"] != null) ...;//caused postBack

// Other input with name="name"
if (this.Request["name"] != null) ...;//caused postBack

Sie können auch alle Steuerelemente durchlaufen und mithilfe des obigen Codes überprüfen, ob eines davon ein Postback verursacht hat.

10
Jaroslav Jandek

Wenn Sie überprüfen müssen, welches Steuerelement das Postback verursacht hat, können Sie ["__EVENTTARGET"] Direkt mit dem Steuerelement vergleichen, das Sie interessiert:

if (specialControl.UniqueID == Page.Request.Params["__EVENTTARGET"])
{
    /*do special stuff*/
}

Dies setzt voraus, dass Sie nur das Ergebnis einer GetPostBackControl(...) - Erweiterungsmethode vergleichen. Es kann nicht jede Situation behandeln, aber wenn es funktioniert, ist es einfacher. Außerdem durchsuchen Sie die Seite nicht nach einem Steuerelement, mit dem Sie anfangs nichts zu tun hatten.

9
tyriker
if (Request.Params["__EVENTTARGET"] != null)
{
  if (Request.Params["__EVENTTARGET"].ToString().Contains("myControlID"))
  {
    DoWhateverYouWant();
  }
}
4
Eduardo

Angenommen, es handelt sich um ein Serversteuerelement, können Sie Request["ButtonName"] Verwenden.

Um zu sehen, ob eine bestimmte Schaltfläche angeklickt wurde: if (Request["ButtonName"] != null)

3
DOK

Eine Ergänzung zu früheren Antworten, um Request.Params["__EVENTTARGET"] Sie müssen die Option einstellen:

buttonName.UseSubmitBehavior = false;
2
djmcghin

Um den genauen Namen der Kontrolle zu erhalten, verwenden Sie:

    string controlName = Page.FindControl(Page.Request.Params["__EVENTTARGET"]).ID;
1
Nuno Ribeiro