Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.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_Webforms - Fatal编程技术网

C# 回发时Viewstate为空

C# 回发时Viewstate为空,c#,asp.net,webforms,C#,Asp.net,Webforms,好吧,我这里发生了一件非常奇怪的事 具有以下属性的ASP.NET 4页: protected QuickShopBag QuickShopBagInstance { get { return (QuickShopBag)ViewState["QuickShopBag"]; } set { ViewState["QuickShopBag"] = value; } } 在(!Page.IsPostBack)中的初始页面加载()期间,QuickShopBagInstance被填充并保

好吧,我这里发生了一件非常奇怪的事

具有以下属性的ASP.NET 4页:

protected QuickShopBag QuickShopBagInstance
{
    get { return (QuickShopBag)ViewState["QuickShopBag"]; }
    set { ViewState["QuickShopBag"] = value; }
}
在(
!Page.IsPostBack
)中的初始
页面加载()期间,
QuickShopBagInstance
被填充并保存
视图状态

但是,当您在页面上执行回发时,从回发
按钮\u OnClick()
事件访问时,ViewState为空

我已经检查了Request.Form,确信
\u Viewstate
值已经存在并已填充。我还通过解析器运行了这个值,它确实包含了预期的数据,页面有
viewstatenabled=“true”
和新的.NET 4
ViewStateMode=“Enabled”

我已经开始重写LoadViewState方法,检查它是否正在启动,它似乎没有启动

protected override void LoadViewState(object savedState)
{
    base.LoadViewState(savedState);
}

我真的不知道可能是什么问题。有什么想法吗?

到目前为止,您似乎已经排除了大多数建议,因此我创建了一个基本页面,其中只包含您提供的上述信息:

阶级

代码隐藏

namespace SO_Questions
{
    public partial class TestPage : System.Web.UI.Page
    {
        protected QuickShopBag QuickShopBagInstance
        {
            get { return (QuickShopBag)ViewState["QuickShopBag"]; }
            set { ViewState["QuickShopBag"] = value; }
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                this.QuickShopBagInstance = new QuickShopBag() { MyProperty = "Test String" };
            }
            Message.Text = "Value is: " + this.QuickShopBagInstance.MyProperty.ToString();
        }

        protected override void LoadViewState(object savedState)
        {
            base.LoadViewState(savedState);
        }

        protected void btnSubmit_Click(object sender, EventArgs e)
        {
            btnSubmit.Text += QuickShopBagInstance.MyProperty;
        }
    }
}
标记:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="TestPage.aspx.cs" Inherits="SO_Questions.TestPage" ViewStateMode="Enabled" %>

<!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></title></head>
<body>
    <form id="form1" runat="server"><div>
        <asp:Label ID="Message" runat="server"></asp:Label>
        <asp:Button runat="server" ID="btnSubmit" Text="Submit" OnClick="btnSubmit_Click" />
    </div></form>
</body></html>

正如预期的那样,它运行正常;点击覆盖的LoadViewState方法(viewstate正确包含2项),并更新按钮的文本


合乎逻辑的解释是,在其他地方发生了其他事情,或者你没有提供额外的重要信息。

过去让我绊倒的事情是

  • 在页面的ViewState中设置某些内容
  • 然后尝试在用户控件中检索它。找不到它-它去哪儿了
  • 似乎每个页面都应该有一个ViewState,但每个usercontrol都保留自己的版本

    可能是这样的吗


    这提供了一个更好的解释,我刚刚做了

    首先我错了,所讨论的代码不在Page_Load中,而是在Page_Init中,尽管我没有读到任何说明不能在Init分配给ViewState的内容

    所以我做了一个非常基本的测试,重复了我遇到的问题

    <form id="form1" runat="server">
    <div>
        <asp:ListView id="QuickshopListView" runat="server">
            <LayoutTemplate>
                <asp:PlaceHolder ID="itemPlaceHolder" runat="server" />
            </LayoutTemplate>
            <ItemTemplate>
                <asp:TextBox ID="txtItem" runat="server" Text='<%# Container.DataItem %>' />
                <asp:Button ID="btnDelete" runat="server" Text="Delete" OnClick="btnDelete_Click" />
                <br />
            </ItemTemplate>
        </asp:ListView>
        <asp:Button ID="btnAdd" runat="server" Text="Add" OnClick="btnAdd_Click" />
    </div>
    </form>
    
    public partial class Quickshop : System.Web.UI.Page
    {
        protected QuickShopBag QuickShopBagInstance
        {
            get { return (QuickShopBag)ViewState["QuickShopBag"]; }
            set { ViewState["QuickShopBag"] = value; }
        }
    
        protected void Page_Init(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                if (QuickShopBagInstance == null)
                    QuickShopBagInstance = new QuickShopBag();
    
                if (!String.IsNullOrEmpty(Request.QueryString.ToString()))
                {
                    string[] items = Server.UrlDecode(Request.QueryString.ToString()).Split(',');
                    if (items.Length > 0)
                    {
                        foreach (string item in items)
                        {
                            QuickShopBagInstance.QuickShopItems.Add(item);
                        }
                    }
                }
            }
        }
    
        protected void Page_LoadComplete(object sender, EventArgs e)
        {
            QuickshopListView.DataSource = QuickShopBagInstance.QuickShopItems;
            QuickshopListView.DataBind();
        }
    
        protected void btnAdd_Click(object sender, EventArgs e)
        {
            if (QuickShopBagInstance == null)
                QuickShopBagInstance = new QuickShopBag();
    
            QuickShopBagInstance.QuickShopItems.Add("add1");
            QuickShopBagInstance.QuickShopItems.Add("add2");
            QuickShopBagInstance.QuickShopItems.Add("add3");
        }
    
        protected void btnDelete_Click(object sender, EventArgs e)
        {
            Button DeleteButton = (Button)sender;
            ListViewDataItem item = (ListViewDataItem)DeleteButton.NamingContainer;
            QuickShopBagInstance.QuickShopItems.RemoveAt(item.DisplayIndex);
        }
    }
    
    [Serializable]
    public class QuickShopBag
    {
        public List<string> QuickShopItems { get; set; }
    
        public QuickShopBag()
        {
            this.QuickShopItems = new List<string>();
        }
    }
    
    
    
    公共部分类Quickshop:System.Web.UI.Page { 受保护的QuickShopBag QuickShopBag实例 { 获取{return(QuickShopBag)视图状态[“QuickShopBag”];} 设置{ViewState[“QuickShopBag”]=value;} } 受保护的无效页_Init(对象发送方,事件参数e) { 如果(!Page.IsPostBack) { 如果(QuickShopBagInstance==null) QuickShopBagInstance=新的QuickShopBag(); 如果(!String.IsNullOrEmpty(Request.QueryString.ToString())) { string[]items=Server.UrlDecode(Request.QueryString.ToString()).Split(','); 如果(items.Length>0) { foreach(项中的字符串项) { QuickShopBagInstance.QuickShopItems.Add(项); } } } } } 受保护的无效页面加载完成(对象发送方,事件参数e) { QuickshopListView.DataSource=QuickShopBagInstance.QuickShopItems; QuickshopListView.DataBind(); } 受保护的无效btnAdd_单击(对象发送者,事件参数e) { 如果(QuickShopBagInstance==null) QuickShopBagInstance=新的QuickShopBag(); QuickShopBagInstance.QuickShopItems.Add(“add1”); QuickShopBagInstance.QuickShopItems.Add(“add2”); QuickShopBagInstance.QuickShopItems.Add(“add3”); } 受保护的无效BTN删除\单击(对象发送者,事件参数e) { 按钮删除按钮=(按钮)发送器; ListViewDataItem=(ListViewDataItem)DeleteButton.NamingContainer; QuickShopBagInstance.QuickShopItems.RemoveAt(item.DisplayIndex); } } [可序列化] 公共级快速购物袋 { 公共列表QuickShopItems{get;set;} 公共快闪包() { this.QuickShopItems=新列表(); } }
    如果请求说“/quickshop.aspx?add1、add2、add3”,则ListView将正确填充qs中的数据,但是,当单击“删除”按钮时,会引发NullReferenceException,因为ViewState尚未持久化QuickShopBag对象

    但是,如果您单击“添加”按钮(如您所见,该按钮会将相同的值添加到QuickShopBagInstance(和ViewState)中),则ListView将正确填充,当您单击“删除”按钮时,它将在ViewState已持久化的情况下完美工作

    现在,如果您将读取querystring位更改为Page_InitComplete,而不是Page_Init,它将非常有效。所以结论是

    在初始化完成之前,您不能添加到VIEWSTATE


    我真傻,至少是谁写的

    只是一个简短的提示。如果要在page_load上设置ViewState值,请确保使用包装方式进行设置

    if (!IsPostBack)
    {
    
    ViewState["MyValue"] = MyValue // set dynamically with appropriate code
    
    }
    
    如果不执行此操作并执行回发…但是您的代码在中设置此ViewState值是而不是!IsPostBack括号中,无论在页面上的何处启用ViewState,每次回发时都会将ViewState值重置为null

    这可能看起来很明显,但如果有大量代码在运行,则很容易错过


    或者我猜你不能用!如果希望在每次回发时运行代码,请使用IsPostBack。但是如果在回发时无法将值设置为null,请仔细检查上述内容。

    您没有显示用于填充将内容放入viewstate的属性的逻辑。可能它在回发过程中出错了,只需在初始加载时假设这个。QuickShopBagInstance=new QuickShopBag()。我还说过,我已经验证了在回发时传递的viewstate数据,并且该数据是co
    if (!IsPostBack)
    {
    
    ViewState["MyValue"] = MyValue // set dynamically with appropriate code
    
    }