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


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

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

}

спасибо

8 57

8 ответов:

Я вижу, что уже есть некоторые отличные советы и методы, предлагающие, как получить пост обратно контроль. Однако я нашел другую веб-страницу (блог Махеш) С помощью метода для получения идентификатора управления post back.

я опубликую его здесь с небольшой модификацией, включая создание класса расширения. Надеюсь, это более полезно в этом случае.

/// <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;
}

обновление (2016-07-22): тип проверки для Button и ImageButton изменен для поиска IButtonControl разрешить распознавание обратной связи от сторонних элементов управления.

вот некоторый код, который может сделать трюк для вас (взято из блог Райана Фарли)

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;
}

либо непосредственно в параметрах формы, либо

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

Edit: чтобы проверить, вызвал ли элемент управления обратную передачу (вручную):

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

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

Если вам нужно проверить, какой элемент управления вызвал обратную передачу, то вы можете просто напрямую сравнить ["__EVENTTARGET"] к интересующему вас элементу управления:

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

Это предполагает, что вы просто сравниваете результат с любой GetPostBackControl(...) метод расширения в любом случае. Он может не справиться с каждой ситуацией, но если он работает, это проще. Кроме того, вы не будете рыскать по странице в поисках элемента управления, о котором вы не заботились с самого начала.

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

предполагая, что это серверный элемент управления, вы можете использовать Request["ButtonName"]

чтобы увидеть, была ли нажата определенная кнопка:if (Request["ButtonName"] != null)

В дополнение к предыдущим ответам, чтобы использовать Request.Params["__EVENTTARGET"] вы должны установить опцию:

buttonName.UseSubmitBehavior = false;

чтобы получить точное имя элемента управления, используйте:

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