asp.net 로그인 동적으로 생성 된 사용자 컨트롤이 포스트 백에서 이벤트를 처리 할 수 ​​없습니다.




httpresponseexception (8)

시도하지 않고도 알 수는 없지만 버튼의 이벤트 핸들러를 프로그래밍 방식으로 연결하면 어떨까요? 예를 들어, 사용자 컨트롤 자체에 대한 코드 숨김에서 Init 또는 Load (확실하지 않음) :

AddHandler Button1.Click, AddressOf Button1_Click

그렇게하지 않으면 효율성이 떨어지는 것을 알 수 있습니다. 그러나 Session에 User Control 인스턴스를 저장하지 않고 항상 Page_Init에서 항상 다시 생성하면 어떻게됩니까?

페이지의 Init에서 다음 코드를 사용하여 페이지에 동적으로로드되는 사용자 정의 컨트롤이 있습니다.

Dim oCtl As Object
oCtl = LoadControl("~/Controls/UserControl1.ascx")

oCtl.Id = "UserControl11"
PlaceHolder1.Controls.Clear()
PlaceHolder1.Controls.Add(oCtl)

사용자 정의 컨트롤에는 버튼이 포함되어 있으며 사용자 정의 컨트롤 내에서 버튼 클릭을 캡처 할 수 없습니다.


당신이 물어봤을 때, 나는 이렇게 init 이벤트를 씁니다. Load 이벤트를 연습으로 남겨 두겠습니다.

Protected Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Init
    If IsPostBack AndAlso Session("ctl") IsNot Nothing Then
        Dim MyControl As Control = Session("ctl")
        PlaceHolder1.Controls.Add(MyControl)
    End If
End Sub

나는 또한 'mycontrol'보다는 더 나은 이름을 생각해 낼 것이지만, 컨트롤이 무엇을해야하는지 모르겠다.


isPostBack이 아닌 경우에만 컨트롤을로드하려고합니다.


.NET이 페이지 수명주기의 "다시 게시 이벤트 처리"단계로 들어가기 전에 컨트롤이 페이지에 존재하는지 확인해야합니다. 컨트롤이 동적으로 추가되므로 모든 포스트 백에서 해당 컨트롤을 다시 만들어 이벤트를 발생시키는 컨트롤을 찾을 수 있도록해야합니다.


모든 포스트 백에 컨트롤을로드해야합니다. 페이지가 다시 게시 될 때 컨트롤이 컨트롤 트리에 없으면 ASP.NET에서 버튼 클릭 이벤트를 발생시키지 않습니다.


몇 가지 질문 :

  1. 페이지 라이프 사이클의 어느 시점에서 컨트롤을로드합니까?
  2. 이벤트 처리기 코드는 어디에 있습니까? 컨트롤 자체에서 또는 페이지에 연결하려고합니까?
  3. 지금까지 이벤트를 마무리하기 위해 무엇을 했습니까?

마지막으로 .Net의 스타일 지침은 oCtl에서 o와 같은 접두사 사자 사용하지 말 것을 권장하며 객체가 아닌 Control로 입력해야합니다.


당신이하고있는 두 가지 일들은 필요하지 않으며 아마도 당신의 문제를 유발할 수 있습니다.

이것들은:

  1. 세션에 컨트롤 개체를 저장할 필요가 없습니다. 컨트롤 자체는 ViewState 및 세션 상태를 사용하여 전체 인스턴스가 아닌 필요한 정보를 저장해야합니다.
  2. 컨트롤을 만들 때 포스트 백을 확인하지 않아야합니다. ViewState가 작동하고 이벤트가 유선이 될 수 있도록 매번 생성해야합니다.
  3. ViewState가로드 된 후에로드 된 컨트롤은 종종 제대로 작동하지 않으므로 가능하면 페이지로드 이벤트 중에로드되지 않도록하십시오.

이 코드는 나를 위해 작동합니다.

Default.aspx

<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="Default.aspx.vb" Inherits="Test_User_Control._Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server"><title></title></head>
<body>
    <form id="form1" runat="server">
        <asp:PlaceHolder ID="PlaceHolder1" runat="server" />
    </form>
</body>
</html>

Default.aspx.vb

Partial Public Class _Default
    Inherits System.Web.UI.Page

    Private Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Init

        Dim control As Control = LoadControl("~/UserControl1.ascx")
        PlaceHolder1.Controls.Add(control)

    End Sub
End Class

UserControl1.ascx

<%@ Control Language="vb" AutoEventWireup="false" CodeBehind="UserControl1.ascx.vb" Inherits="Test_User_Control.UserControl1" %>
<asp:Label ID="Label1" Text="Before Button Press" runat="server" />
<asp:Button ID="Button1" Text="Push me" runat="server" />

UserControl1.ascx.vb

Public Partial Class UserControl1
    Inherits System.Web.UI.UserControl

    Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
        Label1.Text = "The button has been pressed!"
    End Sub

End Class

페이지의 전체 코드는 다음과 같습니다.

Partial Class DynamicLoad
    Inherits System.Web.UI.Page

    Protected Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Init
        If IsPostBack Then
            If Not (Session("ctl") Is Nothing) Then
                Dim oCtl As Object
                oCtl = Session("ctl")
                PlaceHolder1.Controls.Add(oCtl)
            End If
        End If
    End Sub


    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        If Not IsPostBack Then
            Dim oCtl As Object
            oCtl = LoadControl("~/Controls/UserControl1.ascx")

            oCtl.Id = "UserControl11"
            PlaceHolder1.Controls.Clear()
            PlaceHolder1.Controls.Add(oCtl)

            Session("ctl") = oCtl
        End If
    End Sub
End Class

다음은 사용자 컨트롤에 대한 전체 코드입니다.

Partial Class UserControl1
    Inherits System.Web.UI.UserControl
    Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
        Label1.Text = "This is Text AFTER Post Back in User Control 1"
    End Sub
End Class






postback