回发后ASP.NET隐藏字段值不会保留

时间:2014-02-06 22:12:37

标签: c# asp.net data-binding viewstate hidden-field

我在这里和那里读了几个隐藏的字段相关的问题/答案,但没有一个能真正解决我的怀疑。我不认为问题与viewstate直接相关或者没有足够早地绑定我的数据,因为我的其他控件保留了我的值,我和hiddenfield值同时绑定了它们。

我正在使用asp转发器生成一个表,并使用服务器端标签绑定表值,如下所示: 请注意,我正在绑定<%#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>

首次加载页面时,我的所有值(包括隐藏字段值)都已正确绑定。但是,在页面回发之后(通过单击保存按钮,我通过从隐藏字段获取值来保存已选中的复选框),所有隐藏字段值都消失了。尽管如此,我使用服务器端标签绑定的其他数据在回发后仍然可用。 (公司名称,计划均可提供。)

我通过将ProgramID绑定到asp标签的文本字段来进行测试。事实证明,与隐藏字段ProgramID不同,此ProgramID在回发后仍然存在。这证明问题与绑定数据无关。也可能与viewstate无关,但我不确定。我认为特别是与asp hiddenfield相关的东西。

有人可以解开这个谜吗?回发后为什么隐藏字段值不会持续存在?

1 个答案:

答案 0 :(得分:-1)

我尝试了你的代码,但我似乎无法获得相同的行为。对我来说,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; }
    }
}