Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用户控件在回发后丢失ViewState_C#_Asp.net_User Controls_Viewstate - Fatal编程技术网

C# 用户控件在回发后丢失ViewState

C# 用户控件在回发后丢失ViewState,c#,asp.net,user-controls,viewstate,C#,Asp.net,User Controls,Viewstate,我正在尝试创建一个简单的寻呼机用户控件,该控件将用于ASP.NET转发器的页脚 每次用户单击“下一步”,我都希望将PageCounter增加10,并将值保存在ViewState中。 它在我第一次单击lbNext时起作用,但之后它一直被重置为10,并且ViewState[“PageCounter”]为空 我尝试过用[PersistenceMode(PersistenceMode.Attribute)]装饰我的属性,但仍然没有成功。为什么该值没有持久化到ViewState ASCX: <%@

我正在尝试创建一个简单的寻呼机用户控件,该控件将用于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;
        }
    }
}
编辑:

<%@ 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;
        }
    }
}
下面是我将寻呼机用户控件添加到中继器的代码:

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

中继器控制
姓名:
姓:

当数据绑定到中继器(“booksRepeater”)时,代码不会显示。确保及时绑定数据。
听起来像是这样的问题:

当数据绑定到中继器(“booksRepeater”)时,代码不会显示。确保及时绑定数据。
听起来像是这样的问题:

你能把
Pager
添加到转发器/页面的位置/方式的代码贴出来吗?当然,请看编辑当我在ASP.NET中开发时,我不记得使用
持久模式了。通过谷歌搜索,它似乎是用来让控件自动持久化其数据,而无需查看状态(或在幕后利用viewstate/session状态)。当ASP.NET重新构建回发控件时,旧值可能会自动保留并用
0
覆盖Viewstate的值。如果放弃
PersistenceMode
属性,会发生什么?另外,试着运行调试器,看看
setter
是否使用了超出预期的旧数据触发,或者是否出现了错误。我最初尝试过它,但没有使用PersistenceMode,它不起作用。setter很好,问题是getter中的ViewState正在重置。如果你重新创建控件,你会看到我在说什么,你能把
Pager
添加到repeater/page的位置/方式的代码贴出来吗?当然,请看编辑当我在ASP.NET中开发时,我不记得使用了
PersistenceMode
。通过谷歌搜索,它似乎是用来让控件自动持久化其数据,而无需查看状态(或在幕后利用viewstate/session状态)。当ASP.NET重新构建回发控件时,旧值可能会自动保留并用
0
覆盖Viewstate的值。如果放弃
PersistenceMode
属性,会发生什么?另外,试着运行调试器,看看
setter
是否使用了超出预期的旧数据触发,或者是否出现了错误。我最初尝试过它,但没有使用PersistenceMode,它不起作用。setter很好,问题是getter中的ViewState正在重置。如果你重新创建控件,你会看到我在说什么。谢谢,这实际上解决了我的问题。我意识到我正在重新绑定每个帖子上的中继器,呸!并不是所有的问题都是大问题很高兴你找到了!非常感谢,这实际上解决了我的问题。我意识到我在每一篇文章上都重新绑定了转发器,呸!并不是所有的问题都是大问题很高兴你找到了!