在请求中保留变量

时间:2012-01-22 03:13:03

标签: c# asp.net sql linq-to-entities global-variables

我意识到这可能是一个简单的问题,但我是ASP.net(C#)的新手,并且我遇到了一个问题,我在其中传递了一个通过LINQ从sql数据库获取的'Ride'对象到实体声明。我尝试将另一个全局变量设置为Ride.identity属性的值(这是一个long),但在下一个方法中,当我尝试使用此值时,新值不会保持不变。有什么想法吗?如果有一些我错过的后期重新初始化这个变量,有没有办法保存它?感谢。

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(); 
    }
}

3 个答案:

答案 0 :(得分:6)

将值存储在ViewState中。例如:

ViewState["RideId"] = ride.identity;

当您在代码中的行中使用它时,您需要执行此操作:

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

但要小心。由于ViewState [key]返回一个对象,因此您需要确保它不是空引用,否则您将收到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的更多信息,请参阅:

答案 1 :(得分:2)

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

您需要使用会话状态。

答案 2 :(得分:2)

有关在页面执行之间存储数据的多种方法,请参阅this question and my answer。简而言之,您需要将值存储在回发之间。 ASP.NET(以及一般的.NET)提供了各种工具,但请求之间不会自动完成任何操作。每次请求都会创建,执行和销毁页面。