【问题标题】:ViewState data not savedViewState 数据未保存
【发布时间】:2015-04-09 11:28:25
【问题描述】:

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

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

我不明白为什么它为空,否则我该怎么做/当我将 Session 设置为 ViewState 时它可以工作,但它在逻辑上不正确。

【问题讨论】:

    标签: c# asp.net viewstate


    【解决方案1】:
    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); 
            }  
        }  
    

    【讨论】:

      【解决方案2】:

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

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

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

      dtbl.SetSearchParameters(mySearchParam);
      

      【讨论】:

        【解决方案3】:

        在 Inherits 之后,添加 EnableViewState="true" 并尝试。

        例如

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-07-29
          • 1970-01-01
          • 1970-01-01
          • 2017-10-31
          • 1970-01-01
          相关资源
          最近更新 更多