ViewState数据未保存

时间:2015-04-09 11:28:25

标签: c# asp.net viewstate

这是我在我的aspx页面上运行的Control:

%@ Control Language="C#" AutoEventWireup="true" CodeBehind="HostsControl.ascx.cs" Inherits="ClientFrontEnd.HostsControl" %>
<%@ Register Src="~/UserControls/DataGridView.ascx" TagPrefix="dtbl" TagName="DataGridView" %>
<dtbl:DataGridView runat="server" id="tbl" />

它使用另一个控件:

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="DataGridView.ascx.cs" Inherits="ClientFrontEnd.UserControls.DataGridView" %>
<asp:UpdatePanel UpdateMode="Conditional" runat="server" ID="updatePanel">
    <Triggers>
        <asp:AsyncPostBackTrigger ControlID="imgExportToExcel" EventName="Click" />
        <%--<asp:AsyncPostBackTrigger ControlID="imgExportToPDF" EventName="Click" />--%>
    </Triggers>
    <ContentTemplate>
        <asp:UpdateProgress runat="server" ID="upprogress" AssociatedUpdatePanelID="updatePanel" DisplayAfter="0">
            <ProgressTemplate>
                <div style="position: fixed; text-align: center; height: 100%; width: 100%; top: 0; right: 0; left: 0; z-index: 9999999; background-color: #000000; opacity: 0.7;">
                    <asp:Image ID="imgUpdateProgress" runat="server" ImageUrl="~/images/iguloader-yashar.gif" AlternateText="Loading ..." ToolTip="Loading ..." Style="padding: 10px; position: fixed; top: 45%; left: 50%;" />
                </div>
            </ProgressTemplate>
        </asp:UpdateProgress>
        <asp:PlaceHolder runat="server" ID="exportControls">
            <div id="div_export_images" style="text-align:right;">
                <asp:ImageButton ID="imgExportToExcel" ImageUrl="~/images/files/excel.png" ToolTip="Export to excel" AlternateText="Excel" OnClick="ExportToExcel" runat="server" />
                <asp:ImageButton ID="imgExportToPDF" ImageUrl="~/images/files/pdf.png" ToolTip="Export to pdf" AlternateText="PDF" OnClick="ExportToPDF" runat="server" />
            </div>
        </asp:PlaceHolder>
        <asp:Table runat="server" ID="table" CssClass="dataTable cell-border <%=CssClass%>" Width="100%" />
    </ContentTemplate>
</asp:UpdatePanel>

在HostControl的Page_Load上设置:

ViewState["searchParams"] = "test";

用户点击ExportToExcel后,它会从HostControl调用方法GetDataToExport

private DataTable GetDataToExport(out int[] columnsIndexes)
    {
        ViewState["searchParams"] -> null
    }

我不明白为什么它是null而且我怎么能这样做呢?当我把Session的insted放入它时它起作用,但它不是逻辑正确的。

3 个答案:

答案 0 :(得分:0)

DataTable dt = new DataTable();
ViewState["searchParams"] = dt;
DataTable dt2 = (DataTable)ViewState["searchParams"];

您可以先存储,然后再进行访问。同样在IsPostBack中,您应该调用它。

protected void Page_Load(object sender, EventArgs e)  
    {  
        if (!IsPostBack)  
        {  
            GetDataToExport(out int[] columnsIndexes); 
        }  
    }  

答案 1 :(得分:0)

它是null,因为ViewState对于每个控件都是唯一的,所以一旦在一个控件中初始化ViewState变量,就不能在另一个控件中访问它(甚至在内部它具有受保护的访问修饰符)。要在控件之间共享数据,您可以像使用的那样使用会话变量。但这样做你将它定义为一个全局变量,这不是很好。所以为了做到这一点,“面向对象的方式”,您可以在DataGridView控件中创建公共方法,在其中初始化ViewState["searchParams"]变量:

public void SetSearchParameters(string searchParams)
{
   ViewState["searchParams"] = searchParams;
}

然后在HostsControl中的主机控件(在Page_Load方法中)中调用:

dtbl.SetSearchParameters(mySearchParam);

答案 2 :(得分:0)

继承后,添加EnableViewState="true"并尝试。

例如

Control Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="...." EnableViewState="true"