【问题标题】:ASP.NET Hidden Field Value Not Persisting After Postback回发后 ASP.NET 隐藏字段值不保留
【发布时间】:2014-02-06 22:12:37
【问题描述】:

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

我正在使用 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 hiddenfield特别相关。

有人能解开这个谜吗?为什么回发后隐藏字段值不保留?

【问题讨论】:

  • 现在,我正在通过在保存(单击)事件之后再次绑定我的数据来解决这个问题。但是,如果隐藏字段值在回发后仍然存在,则根本没有必要。

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


【解决方案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; }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-16
    • 2011-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多