У меня есть кнопка управления. При нажатии этой кнопки мне нужно добавить кнопку ссылки динамически. Кнопка Link требует обработчика событий. Следовательно, динамическая кнопка Link сначала добавляется в Page_Load и очищается и добавляется снова в обработчик щелчка кнопки. Пожалуйста, прочитайте Обработчики событий динамических элементов управления для понимания бизнес-требований для этого.
Я прочитал В ответ на вопрос, как я могу проверить, какой элемент управления вызывает обратную передачу в событии Page_Init для идентификации элемента управления, вызвавшего обратную передачу (внутри Page_Load). Но он не работает для моего сценария.
Что нужно сделать, чтобы подтвердить, была ли обратная связь вызвана кнопкой ссылки (внутри Page_Load)?
Примечание. Обратитесь к следующему сценарию, где это неизбежно. https://codereview.stackexchange.com/info/20510/custom-paging-in-asp-net-web-application
Примечание 1: Мне нужно получить идентификатор управления обратной связью в качестве первого шага внутри if (Page.IsPostBack)
. Мне нужно добавить кнопки управления динамическими ссылками, только если это обратная передача от кнопки или кнопки ссылки. Там будут другие элементы управления, которые вызывают обратную передачу. Для таких postbacks мы не должны выполнять этот код.
Примечание 2: я получаю пустую строку для Request["__EVENTARGUMENT"]
в Page_Load
Связанный вопрос. По какому event
динамические элементы управления будут доступны на странице (для использования в FindControl). @Tung говорит: "Ваш метод GetPostBackControlId правильно получает имя элемента управления, вызвавшего обратную передачу, но он не может найти элемент управления с этим идентификатором через страницу. FindControl, потому что ссылка еще не создана, и поэтому страница не знать о его существовании".
ASPX
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="PostbackTest.aspx.cs" Inherits="PostbackTest"
MasterPageFile="~/TestMasterPage.master" %>
<asp:Content ID="myContent" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
<div id="holder" runat="server">
</div>
<asp:Button ID="Button1" runat="server" Text="Button" OnClick="TestClick" />
</asp:Content>
CODE BEHIND
public partial class PostbackTest : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if(Page.IsPostBack)
{
string IDValue = GetPostBackControlId(this.Page);
int x = 0;
holder.Controls.Clear();
LinkButton lnkDynamic = new LinkButton();
lnkDynamic.Click += new EventHandler(LinkClick);
lnkDynamic.ID = "lnkDynamic123";
lnkDynamic.Text = "lnkDynamic123";
holder.Controls.Add(lnkDynamic);
}
}
protected void TestClick(object sender, EventArgs e)
{
holder.Controls.Clear();
LinkButton lnkDynamic = new LinkButton();
lnkDynamic.Click += new EventHandler(LinkClick);
lnkDynamic.ID = "lnkDynamic123";
lnkDynamic.Text = "lnkDynamic123";
holder.Controls.Add(lnkDynamic);
}
protected void LinkClick(object sender, EventArgs e)
{
}
public static string GetPostBackControlId(Page page)
{
if (!page.IsPostBack)
{
return string.Empty;
}
Control control = null;
// First check the "__EVENTTARGET" for controls with "_doPostBack" function
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
string controlId;
Control foundControl;
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 Button || foundControl is ImageButton)) continue;
control = foundControl;
break;
}
}
return control == null ? String.Empty : control.ID;
}
}
ССЫЛКА
- На обратной стороне, как я могу проверить, какой элемент управления вызывает обратную передачу в событии Page_Init
- Обработчики обработчиков динамических элементов управления
- Общие сведения о функции JavaScript __doPostBack
- Доступ к переменным JavaScript в PostBack с использованием кода ASP.NET
- Как ASP.NET знает, какое событие будет срабатывать во время обратной передачи?
- как удалить атрибут name из элементов управления сервера?
- Как использовать __doPostBack()