【问题标题】:UserControl loses ViewState after postbackUserControl 在回发后失去 ViewState
【发布时间】:2013-01-28 08:36:30
【问题描述】:

我正在尝试创建一个简单的寻呼机用户控件,该控件将用于 ASP.NET 中继器的页脚。

每次用户单击“下一步”时,我都希望将 PageCounter 增加 10 并将值保存在 ViewState 中。 它在我第一次点击 lbNext 时有效,但之后它不断重置为 10 并且 ViewState["PageCounter"] 为空

我试过用[PersistenceMode(PersistenceMode.Attribute)] 装饰我的房子,但还是没有成功。为什么值没有被持久化到 ViewState?

ASCX:

<%@ Control Language="C#" EnableViewState="true" AutoEventWireup="true" CodeBehind="Pager.ascx.cs" Inherits="WebApplication6.Pager" %>
<asp:LinkButton ID="lbPrevious" runat="server" OnCommand="SetPage" CommandArgument="Previous">Previous</asp:LinkButton>
<asp:TextBox ID="txtPage" runat="server" EnableViewState="true" Enabled="false"></asp:TextBox>
<asp:LinkButton ID="lbNext" runat="server" OnCommand="SetPage" CommandArgument="Next">Next</asp:LinkButton>

背后的代码:

public partial class Pager : System.Web.UI.UserControl
{
    [PersistenceMode(PersistenceMode.Attribute)]
    public int PageCounter
    {
        get
        {
            var counter = ViewState["PageCounter"];
            return ((counter == null) ? 0 : (int)counter);
        }
        set
        {
            ViewState["PageCounter"] = value;
            txtPage.Text = value.ToString();
        }
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
            PageCounter = 0;
    }

    protected void SetPage(object sender, CommandEventArgs e)
    {
        switch (e.CommandArgument.ToString())
        {
            case "Previous":
                PageCounter -= 10;
                break;
            case "Next":
                PageCounter = PageCounter + 10;
                break;
        }
    }
}

编辑:

这是我将 Pager 用户控件添加到中继器的代码:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Repeater.aspx.cs" Inherits="WebApplication6.Repeater" %>
<%@ Register Src="Pager.ascx" TagName="Pager" TagPrefix="asp" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Repeater control</title>
</head>
<body>
    <form id="form1" runat="server">
    <asp:Repeater ID="booksRepeater" runat="server">
        <ItemTemplate>
            <table>
                <tr>
                    <td>
                        Name:&nbsp;<asp:Label ID="lblName" runat="server" Text='<%# Bind("FirstName") %>' />
                    </td>
                </tr>
                <tr>
                    <td>
                        Surname:&nbsp;<asp:Label ID="lblSurname" runat="server" Text='<%# Bind("LastName") %>' />
                    </td>
                </tr>
            </table>
            </div>
        </ItemTemplate>
        <FooterTemplate>
            <asp:Pager ID="pager" runat="server" />
        </FooterTemplate>
    </asp:Repeater>
    </form>
</body>
</html>

【问题讨论】:

  • 您能否发布在哪里/如何将Pager 添加到转发器/页面的代码?
  • 好的,请看编辑
  • 我以前在 ASP.NET 中开发时,不记得使用过PersistenceMode。从一些谷歌搜索来看,它似乎习惯于让控件在没有视图状态的情况下自动保存其数据(或在幕后利用视图状态/会话状态)。当 ASP.NET 在回发时重建控件时,可能会自动保留旧值并用 0 覆盖 Viewstate 的值。如果你放弃 PersistenceMode 属性会发生什么?另外,尝试运行调试器并查看setter 是否触发了旧数据而不是您预期的数据,或者出现了乱序。
  • 我最初在没有 PersistenceMode 的情况下尝试过,它不起作用。setter 很好,问题是 ViewState 在 getter 中被重置。如果你重新创建控件,你会明白我在说什么

标签: c# asp.net user-controls viewstate


【解决方案1】:

当您的数据绑定到您的中继器(“booksRepeater”)时,您的代码不会显示。确保及时绑定数据。 听起来像这个问题:Maintaining viewstate of a repeater

【讨论】:

  • 非常感谢它实际上解决了我的问题。我意识到我在每次回帖时都重新绑定了转发器,呵呵!
  • 并非所有问题都很大。 ;-) 很高兴你找到它!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多