【问题标题】:Persisting a Variable across Requests跨请求持久化变量
【发布时间】:2012-01-22 11:53:35
【问题描述】:

我意识到这可能是一个简单的问题,但我是 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(); 
    }
}

【问题讨论】:

  • 您需要了解 ASP.NET 页面生命周期。每次请求都会创建一个页面类的新实例,并在每次请求结束时销毁。

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


【解决方案1】:

将值存储在 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 的更多信息,请参阅:

【讨论】:

  • 感谢您的精彩描述,我认为它正在被回发破坏,但不知道如何保存它。 ( :
【解决方案2】:

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

你需要使用会话状态。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-28
      • 1970-01-01
      • 2011-11-02
      • 2017-01-08
      相关资源
      最近更新 更多