2014-02-06 3 views
1

여기 몇 가지 숨겨진 필드와 관련된 질문/답변을 읽었지만 아무도 정말로 내 의심을 해결하지 못합니다. 나는 문제가 viewstate와 직접적으로 관련이 있다고 생각하지 않거나 내 데이터를 일찍 바인딩하지 않는다. 왜냐하면 다른 컨트롤이 숨겨진 필드 값과 동시에 바인딩하는 값을 유지하기 때문이다.ASP.NET 숨겨진 필드 값이 포스트 백 후에 지속되지 않음

asp repeater를 사용하여 테이블을 생성하고 다음과 같이 서버 측 태그를 사용하여 테이블 값을 바인딩합니다. < % # Eval ("ProgramID") %>를 숨김 값에 바인딩하고 텍스트 필드에 레이블을 지정합니다.

<asp:Repeater ID="RpPrograms" runat="server" EnableViewState="True"> 
    <HeaderTemplate> 
     <table id="tablePrograms" class="display"> 
      <thead> 
       <tr> 
        <th>Checkbox</th> 
        <th>Program</th> 
        <th>Company Name</th> 
       </tr> 
      </thead> 
    </HeaderTemplate> 
    <ItemTemplate> 
     <tr> 
      <td> 
       <div id='<%# "ProgramCbxCol_" + Eval("ProgramID").ToString()%>'> 
        <asp:checkbox runat="server" ID="cbxProgram" /> 
        <asp:HiddenField ID="hdnProgramID" runat="server" Value='<%# Eval("ProgramID")%>' /> 
        <asp:HiddenField ID="hdnProgramTagName" runat="server" Value='<%# Eval("Program") + "(" + Eval("CompanyName") + ")"%>'/> 
       </div> 
      </td> 
      <td><asp:label runat="server" ID="ProgramName" Text='<%# Eval("Program") + "(" + Eval("ProgramID").ToString() + ")"%>'></asp:label></td> 
      <td><%#Eval("CompanyName")%></td> 
     </tr> 
    </ItemTemplate> 
    <FooterTemplate> 
     </table> 
    </FooterTemplate> 
</asp:Repeater> 

페이지를 처음로드 할 때 hiddenfield 값을 포함한 모든 값이 올바르게 바인딩됩니다. 그러나 페이지를 다시 게시 한 후 (저장 버튼을 클릭하여 숨겨진 필드에서 값을 가져온 체크 된 확인란을 저장 함) 모든 숨김 값이 사라집니다. 그럼에도 불구하고 서버 측 태그를 사용하여 바인딩 한 다른 데이터는 포스트 백 이후에도 계속 사용할 수 있습니다. (회사 이름, 프로그램 모두 사용할 수 있습니다.)

나는 ASP 레이블의 텍스트 필드에 ProgramID를 바인딩하여 테스트를 수행했습니다. hiddenID ProgramID와는 달리이 ProgramID는 포스트 백 이후에도 계속 유지됩니다. 이것은 문제가 너무 늦게 데이터를 바인딩하는 것과 관련이 없음을 증명했습니다. viewstate와 관련이 없을 수도 있지만 확실하지 않습니다. 나는 특히 ASP 숨겨진 필드와 관련이 있다고 생각한다.

누군가가이 수수께끼를 해결할 수 있습니까? 왜 숨겨진 값은 포스트 백 후에도 지속되지 않습니까?

+0

, 나는이 문제를 해결하고 저장 (클릭) 이벤트 직후에 데이터를 다시 바인딩합니다. 그러나 이것은 히든 필드 값이 포스트 백 이후에도 지속된다면 전혀 필요하지 않습니다. – CYC0616

답변

0

나는 당신의 코드를 시도했지만 나는 똑같은 행동을하는 것처럼 보일 수 없다. 나를 위해 HiddenFields는 원하는대로 영구적입니다. 난 거기에 이상한 일이 있는지 알 수 있도록 코드 뒤에 코드를 포함시켜야한다고 생각한다.

당신이 모양을 가질 수 있도록 내 테스트 코드를 제공 할 수 있습니다

:

내보기 :

내 코드 숨김
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="Webtest.WebForm1" %> 
<!DOCTYPE html> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title></title> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    <div> 
    <asp:Repeater ID="RpPrograms" runat="server" EnableViewState="True"> 
     <HeaderTemplate> 
      <table id="tablePrograms" class="display"> 
       <thead> 
        <tr> 
         <th>Checkbox</th> 
         <th>Program</th> 
         <th>Company Name</th> 
        </tr> 
       </thead> 
     </HeaderTemplate> 
     <ItemTemplate> 
      <tr> 
       <td> 
        <div id='<%# "ProgramCbxCol_" + Eval("ProgramID").ToString()%>'> 
         <asp:checkbox runat="server" ID="cbxProgram" /> 
         <asp:HiddenField ID="hdnProgramID" runat="server" Value='<%# Eval("ProgramID")%>' /> 
         <asp:HiddenField ID="hdnProgramTagName" runat="server" Value='<%# Eval("Program") + "(" + Eval("CompanyName") + ")"%>'/> 
        </div> 
       </td> 
       <td><asp:label runat="server" ID="ProgramName" Text='<%# Eval("Program") + "(" + Eval("ProgramID").ToString() + ")"%>'></asp:label></td> 
       <td><%#Eval("CompanyName")%></td> 
      </tr> 
     </ItemTemplate> 
     <FooterTemplate> 
      </table> 
     </FooterTemplate> 
    </asp:Repeater> 
    <asp:Button runat="server" Text ="Save"/> 
    </div> 
    </form> 
</body> 
</html> 

: 지금은

using System; 
using System.Collections.Generic; 

namespace Webtest 
{ 
    public partial class WebForm1 : System.Web.UI.Page 
    { 
     private List<ProgramData> _programData = new List<ProgramData> 
     { 
      new ProgramData {ProgramID = 1, Program = "Program abc", CompanyName = "Company 3434"}, 
      new ProgramData {ProgramID = 2, Program = "Program def", CompanyName = "Company 3qa2434"}, 
     }; 

     protected void Page_Load(object sender, EventArgs e) 
     { 
      if (!IsPostBack) 
      { 
       RpPrograms.DataSource = _programData; 
       RpPrograms.DataBind(); 
      } 
     } 
    } 

    public class ProgramData 
    { 
     public int ProgramID { get; set; } 
     public string Program { get; set; } 
     public string CompanyName { get; set; } 
    } 
} 
관련 문제