В обратном порядке, как я могу проверить, какой элемент управления вызывает обратную передачу в событии Page_Init.
protected void Page_Init(object sender, EventArgs e)
{
//need to check here which control cause postback?
}
Спасибо
В обратном порядке, как я могу проверить, какой элемент управления вызывает обратную передачу в событии Page_Init.
protected void Page_Init(object sender, EventArgs e)
{
//need to check here which control cause postback?
}
Спасибо
Я вижу, что уже есть некоторые замечательные советы и методы, предлагающие, как получить пост-контроль. Однако я нашел другую веб-страницу (блог Mahesh) с помощью метода получения идентификатора обратной связи после обратной связи.
Я разместил его здесь с небольшой модификацией, включая создание класса расширения. Надеюсь, что это более полезно.
/// <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");
Изменить. Чтобы проверить, вызвал ли элемент обратный вызов (вручную):
// 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
Вы также можете перебирать все элементы управления и проверять, вызвал ли один из них postBack указанный выше код.
Если вам нужно проверить, какой элемент управления вызвал обратную передачу, вы можете просто сравнить ["__EVENTTARGET"] с элементом управления, который вас интересует:
if (specialControl.UniqueID == Page.Request.Params["__EVENTTARGET"])
{
/*do special stuff*/
}
Предполагается, что вы все равно будете сравнивать результат с любым методом расширения GetPostBackControl(...). Он может не обрабатывать КАЖДОЙ ситуации, но если он работает, он проще. Кроме того, вы не будете прочесывать страницу, которая ищет элемент управления, о котором вы не хотели начинать.
Предполагая, что это серверный элемент управления, вы можете использовать Request["ButtonName"]
Чтобы узнать, была ли нажата конкретная кнопка: if (Request["ButtonName"] != null)
if (Request.Params["__EVENTTARGET"] != null)
{
if (Request.Params["__EVENTTARGET"].ToString().Contains("myControlID"))
{
DoWhateverYouWant();
}
}
В дополнение к предыдущим ответам, чтобы использовать Request.Params["__EVENTTARGET"], вы должны установить этот параметр:
buttonName.UseSubmitBehavior = false;
Чтобы получить точное имя элемента управления, используйте:
string controlName = Page.FindControl(Page.Request.Params["__EVENTTARGET"]).ID;