我意识到这可能是一个简单的问题,但是我是ASP.net(C#)的新手,并且对通过LINQ-to-从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]返回一个对象,因此您需要确保它不是空引用,否则将收到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的更多信息,请参见:


Undestanding View State (2004)
ViewState Property (.NET 4.0)
ASP.NET State Management Recommendations
ASP.NET Session State Overview

关于c# - 在请求中保留变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8958648/

10-12 07:35