lee23 Ответов: 4

__EVENTTARGET пусто?


Согласно некоторым сайтам, которые я читал, я должен был бы знать, какой элемент управления вызвал обратную передачу страницы. Я сбросил 2 кнопки на страницу (принял все свойства и поведение по умолчанию) и тестирую на странице загрузку того, что эта переменная дает мне, но возвращается null. Форма и обе кнопки runat="сервер". Помощь оценена по достоинству.

protected void Page_Load(object sender, EventArgs e)
{
    if (IsPostBack)
    {
        var target = Request.Form["__EVENTTARGET"];
        var arg = Request.Form["__EVENTARGUMENT"];
    }
}

4 Ответов

Рейтинг:
21

Brij

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


Для элементов управления button, если вы посмотрите на то, как серверные элементы управления отображаются в виде HTML, вы увидите, что кнопки не вызывают функцию JavaScript __doPostBack, поэтому __EVENTTARGET никогда не устанавливается. Вместо этого кнопки отображаются в виде простых тегов input type=“submit”.

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

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

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 mycontrol = page.FindControl(ctl);
            if (c is System.Web.UI.WebControls.Button)
            {
                control =mycontrol ;
                break;
            }
        }
    }
    return control;
}




Надеюсь, это решит вашу проблему.


Рейтинг:
2

lee23

Спасибо. Поймите ваше объяснение, но не поймите вставленное решение. Цикл For перебирает все элементы управления на странице и проверяет, является ли элемент управления кнопкой. Что произойдет, если кнопок будет больше одной?


m@dhu

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

Рейтинг:
1

m@dhu

Просто улучшение к ответу Бридж.

public 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 mycontrol = page.FindControl(ctl);
            if (mycontrol is System.Web.UI.WebControls.Button)
            {
                control =mycontrol ;
               // This gives you ID of which button caused postback
                Response.Write(mycontrol.ID);
                break;
            }
        }
    }
    return control;
}


lee23

Спасибо за исправление кода. И снова мой вопрос: что произойдет, если есть 2 кнопки, которые могут выполнять обратную связь?

m@dhu

Хотя у вас есть две кнопки, используемый цикл foreach получит только идентификатор кнопки, которая выполняет обратную передачу и выходит из цикла.

Рейтинг:
0

ashish47

Просто добавьте UseSubmitBehavior="False" к вашей кнопке. Это сработало для меня
c# - __EVENTTARGET пуст при обратной передаче кнопки click - Stack Overflow[^]


CHill60

Несмотря на то, что это очень старый вопрос, это хороший ответ - было бы лучше объяснить, почему, например,
Цитата:"Когда UseSubmitBehavior имеет значение False, серверный элемент управления button отображается в клиентском браузере как HTML - “button” (HTML-тег с типом=“button”) вместо HTML - “submit button” (HTML-тег с типом=”submit”), который является поведением по умолчанию. В результате клиентский JavaScript способен перехватывать процесс отправки при нажатии на кнопку."
От Отправить один раз с помощью ASP.NET кнопка управления сервером[^]

ashish47

Спасибо за объяснение @CHill60