2016-11-10 1 views
5

TextBox에 대한 ViewState가 비활성화되어 있어도 데이터가 손실되지 않는다는 것을 알고 있습니다. IPostBackDataHandler 인터페이스가 구현되어 있기 때문입니다.왜 라벨의 값이 변경 되었습니까?

<asp:TextBox ID="TextBox1" runat="server" EnableViewState="False"/> 

하지만 내 질문에 왜 이런 일이 발생합니까? 레이블에 IPostBackDataHandler 인터페이스가 구현되어 있지 않기 때문에 ViewState가 비활성화 되어도 label이 데이터를 잃지 않는 이유는 무엇입니까?

<asp:Label ID="Label1" runat="server" EnableViewState="False" ViewStateMode="Disabled"/> 

텍스트 상자의 정의 :

public class TextBox : WebControl, IPostBackDataHandler, 

라벨 정의 :

public class Label : WebControl, ITextControl 

내 코드 :

<form id="form1" runat="server"> 
<div> 
    <asp:Label ID="Label1" runat="server" EnableViewState="False" ViewStateMode="Disabled" Text="Before click"></asp:Label> 
    <asp:TextBox ID="TextBox1" runat="server" EnableViewState="False"></asp:TextBox> 
    <asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_OnClick"/> 
</div> 
</form> 

그리고 뒤에 코드 :

protected void Button1_OnClick(object sender, EventArgs e) 
{ 
    Label1.Text = "Changed."; 
} 

단추를 클릭 한 후에 내 레이블에서 "클릭하기 전에"볼 것으로 예상했지만 단추를 클릭 한 후 내 레이블에 "변경된"텍스트가 표시됩니다.

+1

"데이터"는 무엇이라고 부릅니까? 라벨과 텍스트 상자의 텍스트? 그렇다면이 텍스트는 마크 업에서 어떻게 설정됩니까? – Andrei

+0

@Andrei 버튼 클릭시 작성합니다. TextBox1.Text = "Changed"; Label1.Text = "변경됨."; viewstate를 비활성화하고 IPostBackDataHandler를 구현하지 않기 때문에 레이블에 데이터가 손실 될 것으로 예상됩니다. –

+0

좋아요, 데이터가 무슨 뜻인지는 분명하지만 "잃어버린"의미는 아닙니다. 클릭하면 텍스트가 바뀝니다. 이제는 무엇을 기대합니까? 페이지가로드되고 컨트롤에 '변경됨'이외의 값이 있습니까? 아니면 다음 포스트 백이 발생하고 컨트롤에 "Changed"이외의 값이 있습니까? – Andrei

답변

0

UPD :

나는 당신의 ViewState가 무엇인지 잘못 이해하고 생각합니다.

ViewState의 데이터는 요청마다 저장되지만 페이지 수명주기에는 저장되지 않습니다. BTW - ViewState 데이터는 SaveStateComplete 이벤트의 PreRenderComplete 이벤트 이후에 생성됩니다. 당신이 ViewState에 전원이 꺼져있는 경우

https://msdn.microsoft.com/en-us/library/ms178472.aspx

는 - 그냥 출력에 생성되지 않습니다 생각합니다.

페이지 수명주기 동안 컨트롤에 할당 된 모든 데이터 (페이지와 클래스뿐만 아니라 페이지 필드와 속성에도 해당)는 aspx에서 정의한대로 렌더링됩니다. ViewState에 저장하지 않는 한 후에 손실됩니다.

+0

답해 주셔서 감사합니다. 하지만 내 질문에 왜 EnableViewState = false 레이블에 대해 작동하지 않습니다. –

+0

@ user5032790 레이블이 예상대로 작동하고 있습니다. View-state가 무엇인지 정확하게 알고 있습니까? 비활성화하면 정확히 작동하지 않습니다. – Maarten

+0

@Maarten 클릭시 레이블의 텍스트를 변경하면 포스트 백이 트리거되고 레이블에 대한 viewstate가 비활성화되어 변경된 텍스트는 없어야합니다. 그것은 예상 된 행동이 아닌가? 또한 버튼 클릭이 포스트 백이 아닌지 알려주시겠습니까? –

0

좋아, 이전 대답을 삭제 했으므로 예를 들어 다시 설명하려고합니다.

첫 번째로, 다른 사람들이 말했듯이 ViewState는 단일 페이지로드 사이클이 아닌 포스트 백간에 상태를 유지하기 때문에 예상되는 동작입니다. btn1이 값을 설정

<asp:Label ID="Label1" runat="server" EnableViewState="False" Text="Before click"></asp:Label> 
<asp:Button ID="btn1" Text="Click" OnClick="btn1_Click" runat="server" /> 
<asp:Button ID="btnReset" Text="Reset" OnClick="btnReset_Click" runat="server" /> 

는 "변경"하고, btnReset 빈 핸들러가 :

이 예와의 차이를 확인하려면이 버튼을 사용하여 라벨을 추가하려고합니다.

하면 페이지가 다시 다시로드됩니다 btnReset을 클릭하면 사용자가 페이지를 다시로드는 btn1_Click가 실행되고, 페이지가 =이 "변경"레이블 값으로 렌더링되는 btn1을 클릭하면, False로 설정 EnableViewState와 지금

하지만 이후 뷰 상태가 비활성화, 레이블 "클릭하기 전에"원래 텍스트로 되돌아갑니다 당신이 lable가에 TrueEnableViewState을 설정 한 다음 btnResetbtn1을 클릭하면

상태이기 때문에, 레이블 값은, "변경"으로 남아있을 것입니다 다시 게시하는 동안 보관 됨

약간 명확하게하는 희망

+0

그래서 당신은 btn1을 클릭 한 후 라벨의 값을 설정하고 btn1_Click의 내부는 포스트 백이 발생한 후에 말하고 싶습니까? 권리? –

+0

그리고 또한 ** Response **라는 브라우저에서 렌더링 된 결과를 텍스트로 변경 했습니까? –

+0

버튼 처리기가 * 다시 게시하는 동안 실행됩니다. 브라우저에서 렌더링 한 내용은 서버에서 보낸 HTTP 응답의 일부입니다. 예. 여기에 대한 답변을 보려면 http://stackoverflow.com/questions를 참조하십시오./8457297/ASP.NET 페이지 수명주기에 익숙하지 않은 경우 asp-net-page-life-cycle-explanation – KMoussa

0

이것은 길고 상세한 것입니다.

이 마크 업부터 시작해 보겠습니다. 하나의 추가 버튼과 라벨로 당신과 거의 동일합니다. 나중에 왜 필요로하는지 설명하겠습니다.

<form id="form1" runat="server"> 
<div> 
    <asp:Label ID="Label1" runat="server" EnableViewState="False" ViewStateMode="Disabled" Text="Before click"></asp:Label> 
    <asp:TextBox ID="TextBox1" runat="server" EnableViewState="False"></asp:TextBox> 
    <asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_OnClick"/> 

    <asp:Label ID="Label2" runat="server" Text="Blah" /> 
    <asp:Button ID="Button2" runat="server" Text="Button" OnClick="Button2_OnClick"/> 
</div> 
</form> 

그리고이 코드를 사용합니다. 다시 말하지만, 나중에 두 번째 핸들러의 목적을 설명 할 것 :

protected void Button1_OnClick(object sender, EventArgs e) 
{ 
    Label1.Text = "Changed"; 
} 

protected void Button2_OnClick(object sender, EventArgs e) 
{ 
    Label2.Text = Label1.Text; 
} 

이의 우리가 처음 페이지를로드 할 때 어떻게되는지 보자. 첫 번째 ASP.NET은 모든 마크 업을 읽은 다음 모든 이벤트와 함께 페이지 수명주기를 거칩니다. 마크 업 구문 분석 단계에서 Label1은 할당 된 텍스트 Before click을 가져 오며 초기로드 중에는 나중에 변경되지 않습니다. 그래서 나중에 렌더링 단계를 duing하는 것이 HTML로 렌더링되어 브라우저로 보내집니다. 따라서 Before click이 화면에 표시됩니다. 멋지고 쉽습니다.

이제 Button1을 클릭하십시오. 포스트 백은 처음로드 된 후 해당 컨트롤 중 하나에서 동일한 페이지로 보낸 요청을 설명하는 용어입니다. 다시 말하지만, 모든 것은 ASP.NET이 마크 업을 파싱하는 것으로 시작하며, Label1은 할당 된 텍스트 Before click을 얻습니다. 그러나 제어 이벤트 핸들러를 포함하는 페이지 수명주기 이벤트가 발생합니다. Button1의 처리기에서 Label1이라는 텍스트가 Changed으로 변경되었습니다. 이제 여기서 주목할 중요한 것이 있습니다. Label1에 대한 ViewState가 활성화 된 경우이 새 값이 거기에 저장되므로 추적이라는 속성이 Label1.Text 인 경우 활성화됩니다. 그러나 ViewState는 비활성화되어 있으므로 Label1을 제외한 새 값은 아무 곳이나 저장되지 않습니다. 다음으로 렌더링 페이지가 나오고 Label1.Text 값이 여전히 Changed이므로 HTML로 렌더링되고 표시 할 브라우저로 전송됩니다. 그러나이 새로운 값은 ViewState 필드 내부로 전송되지 않습니다. 보시다시피 ViewState의 사용 가능 여부는이 포스트 백 이후에 표시되는 항목에 아무런 역할을하지 않습니다.

여기에서 Button2을 클릭하면 다른 다시 게시가 트리거됩니다. 다시 ASP.NET은 태그를 구문 분석합니다. 다시 Label1은 텍스트 Before click을 가져옵니다. 그런 다음 ViewState 로딩 파트가 제공됩니다. Label1.Text에 대한 ViewState가 활성화 된 경우 변경된 값이이 속성에로드됩니다. 그러나 ViewState는 비활성화되어 있으므로 value는 동일하게 유지됩니다. 따라서 Button2 클릭 핸들러에 도달하면 Label1.Text의 값은 Before click이고 여전히 Label2.Text입니다. 그러나 Label2에는 ViewState가 사용 가능하므로이 텍스트의 새 값은 ViewState에 저장되고 클라이언트로 전송됩니다 (ViewState는 클라이언트 측에서 숨겨진 필드로 구현됩니다). 모든 것이 브라우저에 도착하면 Label1Label2이 모두 Before click으로 표시됩니다.

그리고 다시 세 번째 포스트 백을 수행하고 이제 Button1을 다시 클릭합니다. 첫 번째 포스트 백과 마찬가지로 Label1Changed 텍스트로 끝납니다. 그러나 Label2은 어떨까요? 글쎄, 이것은 ViewState가 활성화되어 있으므로, 초기 마크 업 구문 분석에서 ASP.NET은 값 Blah을 할당하고 ViewState를로드하는 동안이 값을 Before click으로 바꿉니다. 페이지 수명주기 동안이 값에 영향을주는 것은 없습니다 (이번에는 Button2를 클릭하지 않았습니다). 따라서 브라우저에 ChangedBefore click이 표시됩니다.

바라지 만 그것은 ViewState의 용도와 사용하지 않는 기능을 명확하게 알려줍니다. ViewState가 어떻게 작동하는지 더 자세히 알고 싶다면이 기사를 크게 추천합니다. TRULY Understanding ViewState

관련 문제