Class 级变量未保持设置
Class-level variable doesn't stay set
我有一个正在使用的 .net 网站,该网站使用中继器构建多个表格。作为 Databind 的一部分,我将键添加到 class 级字典对象,以便稍后我可以调用它们并检查它们是否已更改。下面是我的代码:
public partial class pointsEdit : System.Web.UI.Page
{
public Dictionary<Int32, TextBox[]> PointsValues;
protected void Page_Load(object sender, EventArgs e)
{
Int32 clientID = 0;
if (Request.QueryString["id"] != null)
{
if (Int32.TryParse(Request.QueryString["id"], out clientID) == true) {
//try
//{
if (!IsPostBack)
{
btnReturn.HRef = "clientEdit.aspx?id=" + clientID;
PointsValues = new Dictionary<int, TextBox[]>();
using (var db = new db())
{
var ev = db.activityPoints.Where(x => x.ClientID == clientID).ToArray();
tblEvent.DataSource = ev;
tblEvent.DataBind();
}
}
//}
//catch
//{
//}
}
}
}
protected void tblEvent_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
using (var db = new db())
{
Int32 TypeKey;
Int32 ActivityID;
Int32.TryParse(DataBinder.Eval(e.Item.DataItem,"TypeKey").ToString(),out TypeKey);
Int32.TryParse(DataBinder.Eval(e.Item.DataItem, "ActivityID").ToString(), out ActivityID);
var ev = db.events.Where(x => x.ID == TypeKey).First();
((Label)e.Item.FindControl("lblEvent")).Text = ev.name.ToString();
((TextBox)e.Item.FindControl("tbPointValue")).Text = DataBinder.Eval(e.Item.DataItem, "MaxPointsEach").ToString();
((TextBox)e.Item.FindControl("tbMaxScored")).Text = DataBinder.Eval(e.Item.DataItem, "MaxAttempts").ToString();
PointsValues.Add(ActivityID, new TextBox[] { ((TextBox)e.Item.FindControl("tbPointValue")), ((TextBox)e.Item.FindControl("tbMaxScored")) });
}
}
protected void btnSubmit_Click(object sender, EventArgs e)
{
Int32 ActivityID;
TextBox[] TextBoxes;
Int32 clientID = 0;
Int32 ParseResult = 0;
Int32 MaxPoints = 0;
Int32 MaxAttempts = 0;
Boolean NeedsUpdate = false;
if (Request.QueryString["id"] != null)
{
if (Int32.TryParse(Request.QueryString["id"], out clientID) == true)
{
//try
//{
using (var db = new db())
{
var s = db.activityPoints.Where(x => x.ClientID == clientID).ToArray();
for (int i = 0; i < s.Length; i++)
{
ActivityID = s[i].ActivityID;
TextBoxes = PointsValues[ActivityID];
}
}
//} catch {
//}
}
}
}
}
块中有更多代码实际更新值,但我的循环只到此为止,所以为了简单起见,我删除了它。当它到达提交方法的 "TextBoxes = PointsValues[ActivityID];" 行时,似乎不再填充 Dictionary 对象。
我已验证添加到字典时有一个 activity ID,并且计数对于应该添加的对象数是正确的。但是,在文本框行,它告诉我 "The given key was not present in the dictionary" 并且当我尝试获取计数时,它给出了 "object reference not set to an instance of an object" 错误。如果我在该行之前将字典对象设置为一个新的字典对象,它允许我得到一个计数(0)。似乎该对象在设置后以某种方式被重置。有什么想法吗?
您正在使用 ASP.NET Web,这意味着一旦请求被处理,您将失去您的对象上下文。这意味着你的字典会丢失。您应该将其保存在某种会话中以跨请求维护它。
您可以找到有关如何实现会话的详细信息@https://msdn.microsoft.com/en-us/library/ms972429.aspx?f=255&MSPPError=-2147217396
我有一个正在使用的 .net 网站,该网站使用中继器构建多个表格。作为 Databind 的一部分,我将键添加到 class 级字典对象,以便稍后我可以调用它们并检查它们是否已更改。下面是我的代码:
public partial class pointsEdit : System.Web.UI.Page
{
public Dictionary<Int32, TextBox[]> PointsValues;
protected void Page_Load(object sender, EventArgs e)
{
Int32 clientID = 0;
if (Request.QueryString["id"] != null)
{
if (Int32.TryParse(Request.QueryString["id"], out clientID) == true) {
//try
//{
if (!IsPostBack)
{
btnReturn.HRef = "clientEdit.aspx?id=" + clientID;
PointsValues = new Dictionary<int, TextBox[]>();
using (var db = new db())
{
var ev = db.activityPoints.Where(x => x.ClientID == clientID).ToArray();
tblEvent.DataSource = ev;
tblEvent.DataBind();
}
}
//}
//catch
//{
//}
}
}
}
protected void tblEvent_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
using (var db = new db())
{
Int32 TypeKey;
Int32 ActivityID;
Int32.TryParse(DataBinder.Eval(e.Item.DataItem,"TypeKey").ToString(),out TypeKey);
Int32.TryParse(DataBinder.Eval(e.Item.DataItem, "ActivityID").ToString(), out ActivityID);
var ev = db.events.Where(x => x.ID == TypeKey).First();
((Label)e.Item.FindControl("lblEvent")).Text = ev.name.ToString();
((TextBox)e.Item.FindControl("tbPointValue")).Text = DataBinder.Eval(e.Item.DataItem, "MaxPointsEach").ToString();
((TextBox)e.Item.FindControl("tbMaxScored")).Text = DataBinder.Eval(e.Item.DataItem, "MaxAttempts").ToString();
PointsValues.Add(ActivityID, new TextBox[] { ((TextBox)e.Item.FindControl("tbPointValue")), ((TextBox)e.Item.FindControl("tbMaxScored")) });
}
}
protected void btnSubmit_Click(object sender, EventArgs e)
{
Int32 ActivityID;
TextBox[] TextBoxes;
Int32 clientID = 0;
Int32 ParseResult = 0;
Int32 MaxPoints = 0;
Int32 MaxAttempts = 0;
Boolean NeedsUpdate = false;
if (Request.QueryString["id"] != null)
{
if (Int32.TryParse(Request.QueryString["id"], out clientID) == true)
{
//try
//{
using (var db = new db())
{
var s = db.activityPoints.Where(x => x.ClientID == clientID).ToArray();
for (int i = 0; i < s.Length; i++)
{
ActivityID = s[i].ActivityID;
TextBoxes = PointsValues[ActivityID];
}
}
//} catch {
//}
}
}
}
}
块中有更多代码实际更新值,但我的循环只到此为止,所以为了简单起见,我删除了它。当它到达提交方法的 "TextBoxes = PointsValues[ActivityID];" 行时,似乎不再填充 Dictionary 对象。
我已验证添加到字典时有一个 activity ID,并且计数对于应该添加的对象数是正确的。但是,在文本框行,它告诉我 "The given key was not present in the dictionary" 并且当我尝试获取计数时,它给出了 "object reference not set to an instance of an object" 错误。如果我在该行之前将字典对象设置为一个新的字典对象,它允许我得到一个计数(0)。似乎该对象在设置后以某种方式被重置。有什么想法吗?
您正在使用 ASP.NET Web,这意味着一旦请求被处理,您将失去您的对象上下文。这意味着你的字典会丢失。您应该将其保存在某种会话中以跨请求维护它。
您可以找到有关如何实现会话的详细信息@https://msdn.microsoft.com/en-us/library/ms972429.aspx?f=255&MSPPError=-2147217396