asp.net - 로그인 - httpresponseexception




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

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

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

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

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


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


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


몇 가지 질문 :

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

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


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


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

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

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

이것들은:

  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




postback