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