跨请求持久化变量

本文关键字:变量 持久化 请求 | 更新日期: 2023-09-27 18:20:57

我意识到这可能是一个简单的问题,但我是ASP.net(C#)的新手,并且在一个方法上遇到了问题,在该方法中,我通过LINQ to entities语句传递从sql数据库获得的"Ride"对象。我尝试将另一个全局变量设置为Ride.identity属性的值(这是一个长值),但在下一个方法中,当我尝试使用此值时,新值尚未持久化。有什么想法吗?如果我缺少一些重新初始化该变量的帖子,有没有办法保存它?谢谢

private void displayRide(Ride ride, int carNum)
{
    if (ride != null) 
    {
        ride.AssignedCar = carNum;
        ride.Status = "EnRoute";
        id_ridePendingConfirm = ride.identity; //<----THE PROBLEM IS HERE!
        myEntities.SaveChanges();
        RideToAssignDV.DataSource = new List<Ride> {ride};
        RideToAssignDV.DataBind();                    
    } 
    else 
    {
        //TODO: Redirect to error.aspx
        RideToAssignDV.DataSource = null;
        RideToAssignDV.DataBind(); 
    }
}

跨请求持久化变量

将值存储在ViewState中。例如:

ViewState["RideId"] = ride.identity;

当你去代码中的行中使用它时,你需要这样做:

id_ridePendingConfirm = (long)ViewState["RideId"];

但是要小心。由于ViewState[key]返回一个对象,您需要确保它不是null引用,否则您将收到InvalidCastException。

我通常会告诉经验较少的同行创建一个受保护的属性,该属性将存储该值并将其持久化到ViewState中,如下所示:

protected const string RideIdViewStateKey = "CurrentRideId";
protected long CurrentRideId
{
    get
    {
        object o = ViewState[RideIdViewStateKey];
        return (null == o)? -1 : (long)o;
    }
    set
    {
        ViewState[RideIdViewStateKey] = value;
    }
} 

然后在你的代码中,这样做:

// Assignment before postback so that you can preserve the state:
CurrentRideId = ride.identity;
// After postback in the method you have above:
id_ridePendingConfirm = CurrentRideId;

现在,由于我不知道当没有Ride身份可用时,您的代码应该做什么,我决定使用-1,但这取决于您的代码实际需要什么。

我不建议将会话状态用于您的场景,因为这显然需要在页面回发之间持续,而不是在用户会话的整个持续时间内。还要注意在ViewState中存储的信息量,因为它很容易被滥用。

有关ViewState和Session State的更多信息,请参阅:

  • Unstanding View State(2004)
  • ViewState属性(.NET 4.0)
  • ASP.NET状态管理建议
  • ASP.NET会话状态概述

变量和字段不会在回发中持久存在。

您需要使用会话状态。

请参阅这个问题和我的答案,了解在页面执行之间存储数据的多种方法。简而言之,您需要将值存储在回发之间的某个位置。ASP.NET(以及一般的.NET)提供了各种工具,但在请求之间不会自动执行任何操作。每个请求都会创建、执行和销毁页面。