2014-02-06 57 views
1

我在这里和那里阅读了一些与隐藏字段相关的问题/答案,但没有一个能够真正解决我的疑问。我认为这个问题并没有直接与viewstate相关,也没有及时绑定我的数据,因为我的其他控件保留了它们的值,这些值与我在隐藏域值时同时绑定的值相同。 请注意,我结合<%#的eval(“ProgramID”)%>到hiddenfield值和标记文本字段:ASP.NET隐藏字段值在回传后不会持续

我使用ASP的中继器,并使用服务器端的标签,如下面结合表中的值生成表格。

<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> 

页面第一次加载时,包括隐藏字段值在内的所有值都被正确绑定。然而,在页面回发后(通过点击一个保存按钮,我通过从隐藏域获取值来保存选中的复选框),所有的隐藏域值都消失了。尽管如此,在回发之后,我使用服务器端标记绑定的其他数据仍然可用。 (公司名称,程序都可用。)

我做了一个测试,将ProgramID绑定到asp标签的文本字段。事实证明,与隐藏字段ProgramID不同,此ProgramID在回发后保持不变。这证明这个问题与绑定数据太迟无关。也许不会与视图状态相关,但我不确定。我认为是特别与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; } 
    } 
}