HiddenField 컨트롤은 이름에서 알 수 있듯이 입력 상자를 숨기는 서버 컨트롤로, 페이지에 표시할 필요가 없고 높은 보안이 필요하지 않은 데이터를 저장할 수 있습니다. 아마도 이 시점에서 질문이 있어야 할 것입니다. ViewState, Session 및 Cookie와 같은 상태 저장 메커니즘이 있는데 왜 여전히 HiddenField를 사용해야 합니까?
HiddenField를 추가하는 목적은 전체 상태 관리 메커니즘의 적용을 더욱 포괄적으로 만드는 것입니다. ViewState, Cookie 또는 Session이든 만료되는 시간이 있기 때문입니다. 예를 들어 사용자는 특정 요구 사항으로 인해 ViewState를 false로 설정해야 하거나 환경 조건으로 인해 쿠키 사용이 제한되거나 사용자가 비활성화되었습니다. 오랫동안 세션이 만료되는 등의 현상이 발생합니다. 현재로서는 의심할 여지 없이 HiddenField가 최선의 선택입니다.
HiddenField 컨트롤의 기능은 단순히 서버로 전송하는 사이에 유지해야 하는 값을 저장하는 것입니다. 이는 <input type="hidden"/> 요소로 렌더링되며 runat="server"를 추가하여 표준 HTML 서버 컨트롤로 만들 수 있습니다. 아래에는 ASP.NET HiddenField 웹 서버 컨트롤에 사용할 수 있는 속성과 이벤트가 나열되어 있습니다.
<asp:숨겨진 필드
EnableTheming="참|거짓"
EnableViewState="참|거짓"
아이디="문자열"
OnDataBinding="DataBinding 이벤트 핸들러"
OnDisposed="처리된 이벤트 핸들러"
OnInit="초기화 이벤트 핸들러"
OnLoad="이벤트 핸들러 로드"
OnPreRender="PreRender 이벤트 핸들러"
OnUnload="언로드 이벤트 핸들러"
OnValueChanged="ValueChanged 이벤트 핸들러"
runat="서버"
스킨ID="문자열"
값="문자열"
표시="참|거짓"
/>
HiddenField의 값은 클라이언트 브라우저에 렌더링되므로 보안에 민감한 값을 저장하는 데 적합하지 않습니다. HiddenField 컨트롤의 값을 지정하려면 Value 속성을 사용하고 Text가 아닙니다. 실제로 HiddenField에는 DropDownList 및 CheckBoxList와 같은 표준 버튼의 속성 이름 지정과 일치하는 Text 속성이 없습니다. 표준 속성 명명 방법에서는 Text 값이 사용자에게 표시되고 Value 값은 코드를 통해 제어됩니다. 예를 들어 DropDownList의 Text 속성에 사용자 이름이 표시되고 해당 값에 사용자 번호가 저장되도록 할 수 있습니다.
아래 코드는 컨트롤의 기본 사용법을 보여줍니다.
<html>
<머리>
<스크립트 언어="C#" runat="서버">
void Button1_Click(객체 전송자, EventArgs e)
{
if(HiddenField1.Value == String.Empty)
HiddenField1.Value = "0";
HiddenField1.Value = (Convert.ToInt32(HiddenField1.Value)+1).ToString();
Label1.Text = HiddenField1.Value;
}
</script>
</head>
<본문>
<h3><fontface="Verdana">HiddenField</font></h3>
<형식 runat=서버>
<asp:HiddenField id=HiddenField1 runat=서버 />
<asp:Button id=Button1 Text="버튼 클릭" onclick="Button1_Click" runat="서버" />
<asp:Label id=Label1 Text="0" runat=server />번 클릭함
</form>
</body>
</html>
위 코드에서 <asp:HiddenField id=HiddenField1 runat=Server />는 버튼 클릭 이벤트에서 사용자 클릭 횟수를 계산하는 숨겨진 컨트롤을 정의하고 변경 횟수를 Label1에 할당합니다.
위
코드의 <asp:HiddenField id=HiddenField1 runat=Server />를 <input type=hidden id=HiddenField1 runat=Server>로 변경하면 됩니다.
브라우저 코드는 다음 정보를 얻습니다.
<form name="Form1" method="post" action="Default.aspx" id="Form1">
HiddenField는 HTTP 프로토콜을 통해 데이터를 전송하기 때문에 "method="get"이나 링크를 통해 새 양식 페이지를 열면 HiddenField를 사용할 수 없습니다.
또한 HiddenField는 상태를 유지하기 위해 Session을 대체하지 않습니다. 위의 예에서 버튼을 한 번 클릭하여 클릭 수를 표시한다고 해서 상태 정보를 기록할 수 있는 것은 아닙니다. 브라우저를 다시 열면 여기에 3 대신 0이 계속 표시됩니다.
HiddenField 이벤트
더 일반적으로 사용되는 HiddenField는 값이 변경될 때 트리거되는 ValueChanged 이벤트입니다. 그러나 실제 사용시에는 페이지 기록 순서를 알아야 합니다. 페이지 포스트백 과정 중, 다음 웹사이트에서 특정 페이지 주기를 확인할 수 있습니다.
http://msdn2.microsoft.com/zh-cn/library/ms178472.aspx
다음 예에서는 이 문제를 보여줍니다
.
<script runat="서버" 언어="c#">
protected void Page_Load(개체 전송자, EventArgs e)
{ Response.Write("<p>페이지의 Page_Load 이벤트가 트리거되고 트리거 시간은 다음과 같습니다. " + DateTime.Now.ToString());
if(HiddenField1.Value == String.Empty)
HiddenField1.Value = "0"; }
protected void Button1_Click(object sender, EventArgs e)
{ Response.Write("<p>Button1_Click은 Hidden 값을 변경하기 전에 트리거되는 이벤트입니다. 트리거 시간은 " + DateTime.Now입니다. .ToString( ));
HiddenField1.Value = (Convert.ToInt32(HiddenField1.Value) + 1).ToString();
Label1.Text = HiddenField1.Value;
}
protected void HiddenField1_ValueChanged(object sender, EventArgs e)
{ Response.Write("<p>HiddenField의 ValueChanged 이벤트가 트리거되고 트리거 시간은 " + DateTime.Now.ToString()) ; }
</script>
</head>
<body>
<form id="form1" runat="server">
<div> <asp:HiddenField ID="HiddenField1" runat="server" OnValueChanged="HiddenField1_ValueChanged" />
</div> <asp :Label ID="Label1" runat="server" Text="Label"></asp:Label>
<br /> <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text=" 버튼" />
</form></body>
</html>
이 예에서 우리가 원하는 결과는 사용자가 버튼을 클릭하면 버튼의 Button1_Click 이벤트를 통해 HiddenField1의 값이 변경된 다음 HiddenField1의 HiddenField1_ValueChanged 이벤트가 트리거되는 것입니다.
위 코드를 실행하고 결과를 얻으십시오. 보시다시피 Button은 클릭할 때마다 HiddenField의 값을 변경하지만 HiddenField1_ValueChanged에 정의한 출력은 실행되지 않습니다. ValueChanged 이벤트. 이 문제를 이해하려면 페이지의 선언 주기도 이해해야 합니다. 페이지 주기 동안 Page_Init에서 컨트롤 속성을 읽거나 초기화한 다음 Control 이벤트를 수행하는 것을 볼 수 있습니다.
여기서 이벤트는 다음을 의미합니다. Page_Init 이벤트에서 웹 페이지는 사용자가 반환한 데이터를 수락합니다. 예를 들어 <span id="Label1">Label</span>을 ID Label1을 사용하여 Text 속성에 할당하고 <input type ="hidden" name="HiddenField1" id="HiddenField1" value="0" /> 값이 HiddenField1의 Value 속성에 할당됩니다. 모든 초기화가 완료되면 페이지는 컨트롤 이벤트인 Button1_Click을 실행하기 시작하고 Button 이벤트에서 HiddenField의 값을 변경합니다. 그러면 여기서 Value가 변경되었는데 왜 ValueChanged 이벤트가 실행되지 않습니까?
이때, 여기서 Value 값이 변경되었음에도 불구하고 Page_Init에 저장됩니다. 이는 Button 버튼을 클릭하면 HiddenField가 변경되더라도 페이지의 응답도 다시 발생하기 때문입니다. 이전 HiddenValue 값이 0인데 이번에는 1로 변경됩니다. 그러나 페이지가 포스트백된 후 ViewState가 마지막 설치(여기서는 1)를 저장하므로 Page_Init에서는 HiddenField의 초기 값을 고려합니다. 1이 되고 이번에는 시간이 여전히 1이므로 데이터가 변경되지 않은 것처럼 느껴지므로 ValueChanged 이벤트가 여전히 트리거되지 않습니다.
물론 처리를 위해 HiddenField를 비활성화하고 ValueChanged를 실행할 수 있습니다
.이벤트이지만 실제로 ViewState를 비활성화하면 페이지는 더 이상 ViewState 값을 저장하지 않으므로 페이지는 다음 코드와 같이 HiddenField에 대한 각 요청이 새로운 것으로 간주합니다.
Hiddenfield 값을 변경하지 않았지만 여전히 매번 실행됩니다.
<%@ 페이지 EnableViewState="false" %>
<머리>
<script runat="server" 언어="c#">
protected void Page_Load(개체 전송자, EventArgs e)
{
if (HiddenField1.Value == String.Empty)
HiddenField1.Value = "111"
}
;
protected void Button1_Click(객체 전송자, EventArgs e)
{ // HiddenField1.Value = (Convert.ToInt32(HiddenField1.Value) + 1).ToString();
Label1.Text = TextBox1.Text; }
protected void HiddenField1_ValueChanged(개체 전송자, EventArgs e)
{ Response.Write("Changed." + DateTime.Now.ToString());
Response.Write(HiddenField1.Value);
Response.Write(TextBox1.Text) }
</script>
</head>
<body>
<form id="form1" runat="server"> <div>
<asp:HiddenField ID="HiddenField1" runat="server" OnValueChanged="HiddenField1_ValueChanged" />
</div>
<asp:Label ID= "Label1" runat="server" Text="Label"></asp:Label>
<br />
<asp:TextBox runat=server ID=TextBox1></asp:TextBox>
<asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Button" />
</form>
</body >
</html>
ASP.NET2.0에서 제공하는 "크로스 페이지" 페이지와 결합된 HiddenFile을 사용하면 페이지 데이터 전송을 실현할 수 있습니다.
등록 페이지에서는 사용자가 데이터를 입력해야 합니다. 비고란에 많은 양의 데이터가 있을 수 있으므로 새 창에서 FreeTextBox와 유사한 컨트롤을 사용하여 사용자가 텍스트 형식을 지정할 수 있도록 하고 입력 후에 사용할 수 있습니다. 완료되면 원래 등록 페이지로 돌아갑니다. 이 상황에 대해서는 나중에 소개하겠습니다.