3

我在 SharePoint 项目中添加了一个简单的 ASP 应用程序页面,仅用于演示目的,因此它的 ASP Web 表单页面托管在 SharePoint 中。

HTML:

</asp:Content>
<asp:Content ID="Main" ContentPlaceHolderID="PlaceHolderMain" runat="server">
    <asp:Label runat="server">Number 1:</asp:Label>
    <asp:TextBox ID="num1" runat="server"></asp:TextBox>
    <asp:Label runat="server">Number 2:</asp:Label>
    <asp:TextBox ID="num2" runat="server"></asp:TextBox>
    <asp:Label runat="server">Result:</asp:Label>
    <asp:TextBox ID="res" runat="server"></asp:TextBox>
    <asp:Button Text="ADD Numbers" runat="server" OnClick="Unnamed_Click" />
    <asp:ListBox runat="server" ID="list" />
    <asp:Label runat="server" ID="previousListValue"></asp:Label>
    <asp:Label runat="server">Exception:</asp:Label>
    <asp:TextBox ID="exception" runat="server"></asp:TextBox>
</asp:Content>

这是后面的代码:

public partial class Default : LayoutsPageBase
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            list.DataSource = new List<ListItem>() { 
                new ListItem("value1", "1"),
                new ListItem("value2", "2"),
                new ListItem("value3", "3"),
            };
            list.DataBind();
        }
    }

    protected void Unnamed_Click(object sender, EventArgs e)
    {
        try
        {
            res.Text = Convert.ToString(int.Parse(num1.Text) + int.Parse(num2.Text));
            previousListValue.Text = "Previous list selected value is: " + list.SelectedItem.Value;
            exception.Text = string.Empty;
        }
        catch (Exception ex)
        {

            exception.Text = ex.GetType().ToString() + "\t" + ex.Message;
        }
    }
}

当您单击“添加数字”按钮时,文本框num1num2文本框的添加将被附加到res文本框,并且选定的值ListBox显示在其旁边的标签中。如果为数字输入正确的值并在ListBox.

如果页面离开(未交互)大约 10-15 分钟并单击“添加数字”按钮,NullReferenceException将被抛出list.SelectedItem.Value并且 textBoxes 将为空。发生的事情是应用程序处于 postBack 状态(Page.IsPostBack为 true),但视图状态未恢复。

我想这与从2013 版开始将 ViewState 移至分布式缓存有关,但有人可以为我澄清这一点,并建议我在不更改 AppFabric 配置的情况下最有效的解决方法,因为 ViewState 需要 10-15 分钟变态是不可接受的。

4

1 回答 1

0

由于 ViewState 保存在用户的会话中,如果页面未在会话到期时间内回发,则 ViewState 可能会到期。

您可以在 web.config 文件中配置会话超时(ASP.NET 中的会话超时):

<sessionState timeout="60"  />

(其中 50 和 60 是分钟)

您还可以使用 Master Page 的 Page_Load 方法中的示例代码检查您的会话是否过期:

if (Session.Contents.Count == 0)
{
    //Session dead!
}
else
{
    //Session alive!
}

或者保存登录的用户并测试它是否为空:

if (Session["userId"] == null)
{
    //Session dead!
}
else
{
    //Session alive!
}
于 2016-12-26T19:35:16.347 回答