Скажите, что у вас есть пользовательский элемент управления (ASCX):Упорство пользовательский элемент управления (ASCX) EventHandler объект Across постбэков
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="Test.ascx.cs"
Inherits="WebApplication1.Test" %>
<asp:Button ID="test" runat="server" OnClick="test_Click" Text="test" />
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace WebApplication1
{
public partial class Test : System.Web.UI.UserControl
{
public event EventHandler Method1;
public EventHandler Method2
{
get { return (EventHandler)Session[this.ClientID + "|Method2"]; }
set { Session[this.ClientID + "|Method2"] = value; }
}
public EventHandler Method3
{
get { return (EventHandler)ViewState["Method3"]; }
set { ViewState["Method3"] = value; }
}
protected void test_Click(object sender, EventArgs e)
{
if (Method1 != null)
Method1(this, e);
if (Method2 != null)
Method2(this, e);
if (Method3 != null)
Method3(this, e);
}
}
}
И у вас есть страницы, которые вы размещаете, что UserControl на:
<%@ Page Title="Home Page" Language="C#" MasterPageFile="~/Site.Master"
AutoEventWireup="true" CodeBehind="Default.aspx.cs"
Inherits="WebApplication1._Default" %>
<%@ Register Src="~/Test.ascx" TagName="Test" TagPrefix="uc1" %>
<asp:Content runat="server" ID="BodyContent" ContentPlaceHolderID="MainContent">
<uc1:Test ID="TestControl" runat="server" />
<asp:Label ID="Result" runat="server" Text="Test" />
</asp:Content>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace WebApplication1
{
public partial class _Default : Page
{
protected void Page_Load(object sender, EventArgs e)
{
//Uncomment each one to observe their behavior
//Will never trigger(unless reset on each postback)
//if (!IsPostBack) TestControl.Method1 += new EventHandler(Test);
//Will trigger(the code will run) but makes no change to the parent page
//if (!IsPostBack) TestControl.Method2 += new EventHandler(Test);
/*
Will fail because it can't serialize the "EventHandler" object
You can play around by changing this to a delegate type
and making that serializable, but that fails as well
*/
//if (!IsPostBack) TestControl.Method3 += new EventHandler(Test);
}
protected void Test(object sender, EventArgs e)
{
Result.Text = Guid.NewGuid().ToString();
}
}
}
Но для этого данного User Control мы хотим определить событие, чтобы зафиксировать щелчок кнопки и вызвать этот триггер для выбора родительского элемента User Control. Также из-за требований, выходящих за рамки этого примера, скажем, что мы хотели бы только когда-либо установить значение «MethodX» EventHandler один раз, т. Е. Не воссоздавать элемент управления/свойство для каждого Postback (в этом примере я демонстрирую эту концепцию только установка события один раз на загрузку страницы).
Как это можно сделать? Все три метода, к которым я попытался провалиться, имеют свои уникальные способы ... Я до сих пор не нашел аналогичного вопроса, связанного с сохранением событий, большинство сообщений посвящено переносу переменных/объектов («Использовать ViewState» или различные другие способы сохранения объектов, не связанных с событиями, см. link) или просто направить пользователя на «воссоздание элемента управления при каждом обратном вызове (включая связанные свойства)», см. link.
Любая обратная связь или проницательность были бы полезны, особенно смущает меня поведение «Method2», я думаю, что у меня недостаточно полно понимание жизненного цикла страницы, чтобы понять, почему это происходит.
Элемент управления создается во время инициализации и уничтожается после рендеринга - я бы не рекомендовал его продолжать. Тем не менее, вы можете сохранить состояние элемента управления с помощью ViewState ["State"] = "SOMETHING TO RELOAD TESTCONTROL METHOD", и эта переменная состояния может использоваться для повторного подключения обработчика событий по вашему выбору. –
@BrianMains Интересно, поэтому я говорю, что я могу использовать свойство «State» Viewstate на родительской странице для хранения всего User Control, и это позволит мне сохранить свойство EventHandler, установленное в этом состоянии, или «State», свойство, используемое внутри самого элемента управления, чтобы сохранить свое собственное состояние или состояние EventHandler? Знаете ли вы о каких-либо примерах того, где это было сделано (может быть, пример этого прояснит это предложение)? –
Нет, ViewState не может сохранить элемент управления; поставьте элемент управления на странице, а затем используйте viewstate, чтобы сохранить некоторые флаги, чтобы контролировать, показывает ли UC/скрывает и какие обработчики событий должны быть привязаны и т. д. Он управляет значениями true/false, которые говорят, показывать или скрывать элемент управления , но не сохраняет контроль напрямую. У UC также есть viewstate, поэтому вы можете хранить настройки в UC в своем собственном контейнере viewstate. –