C# 用户控件不保留私有值,返回在页面加载中设置的值
我有一个控件,定义如下:C# 用户控件不保留私有值,返回在页面加载中设置的值,c#,asp.net,user-controls,C#,Asp.net,User Controls,我有一个控件,定义如下: public partial class MyControl: System.Web.UI.UserControl { static int ControlID; static DataTable table; protected void Page_Load(object sender, EventArgs e) { if (!Page.IsPostBack) { Control
public partial class MyControl: System.Web.UI.UserControl
{
static int ControlID;
static DataTable table;
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
ControlID = 0;
table= new DataTable();
}
}
public void Save()
{
//ControlID is 0
//table is empty DataTable
}
public void SetControlID(int id)
{
ControlID = id; //This DOES set id correctly
SqlConnection conn = new SqlConnection(ConnectionString);
SqlCommand command = new SqlCommand(SelectCommand, conn);
command.Parameters.AddWithValue("@ControlID ", ControlID);
SqlDataAdapter adapter = new SqlDataAdapter(command);
adapter.Fill(table);
//table is correctly filled with the correct data
}
}
此控件添加到我的aspx
页面,如下所示:
<uc:MyControl ID="myCont" runat="server" />
但是,页面上有一个“保存”按钮,可调用:
myCont.Save();
在该方法中,检查ControlID
和table
时,它们分别显示为0和空的DataTable
为什么ControlID
和table
不保留在SetControlID
方法中设置的值
编辑:删除2变量的静态属性没有任何区别
编辑#2:我只想指出,我在许多其他页面中使用过这种方法,一切都很好。在ASP.NET中,页面类的生命周期是处理请求的持续时间。也就是说,当请求进入时,页面的类被实例化,viewstate被反序列化为还原状态(如果是回发的话),一个事件被运行(比如按钮点击),响应被生成,然后对象被销毁。因此,任何未将其状态保存到viewstate(如int)中的成员都不会在激活过程中保留
另外,代码中的一个疑点是ControlID和tabe都声明为静态。这意味着这些值将在页面的所有调用者之间共享(并且每次请求新页面时,所有用户的表都将被覆盖)。这似乎不正确。静态变量不是页面级(实例级)。。每次为任何其他用户加载页面时,您的静态
表将重置为空表。非常糟糕的主意。为了保存数据,您必须使用
我写这封信是对你接受的答案的评论。但是,我没有足够的声望点来评论:-)
我接受了这一点,因为这是有效的。我不明白其他使用类似逻辑的页面在不使用ViewState的情况下是如何工作的。
当我说其他页面时,我指的是我构建的众多应用程序
以前,不仅仅是这个应用程序-另一灌木丛
我还建议在这种情况下使用viewstate,因为静态成员在所有web请求会话中共享,因此,您可能会看到不需要的行为
当您想知道为什么您的代码不起作用时,我将尝试给您一个理由:
请参阅ASP.NET页面生命周期。。。由此可以看出,用户控件的加载事件是在页面的加载事件之后处理的。因此,程序流程如下所示:
在页面的Page\u Load
中,您正在调用设置ControlID和table的myCont.SetControlID(1)
然后发生用户控件的页面加载
,您正在重置/初始化控件ID和表
稍后调用myCont.Save()
,您将看到ControlID和table的重置值
希望这有帮助 可能是因为静态属性。仔细检查一下。为什么这两个变量是静态的?它们被设置为静态的,因为我在其他页面上遇到了一些问题,变量根本没有初始化。将其设置为static
有效,因此我继续练习。但是正如上面的编辑所说,删除static
属性没有什么区别。我接受了这一点,因为它是有效的。我不明白其他使用类似逻辑的页面在不使用ViewState
的情况下是如何工作的。当我说其他页面时,我指的是我以前构建的众多应用程序,不仅仅是这个应用程序。我理解静态
变量的含义,但这不是问题所在。由于提供的代码,我接受了AVD在下面的帖子,但我对你的帖子投了赞成票。static
不是问题所在,ViewState
确实有效。我不明白的是,其他使用类似逻辑的页面在不使用ViewState
的情况下是如何工作的。当我说其他页面时,我指的是我以前构建的众多应用程序,不仅仅是这个应用程序。你说myCont.Save()
重置值,我可以看到这些值,我可以遵循这些逻辑,但是我在这里使用的相同逻辑已经在这个应用程序和其他应用程序的许多其他页面中使用,并且可以工作。我更想知道为什么其他的方法也能起作用,它们肯定也会受到影响?重置发生在用户控件的页面加载
中,当调用用户控件的保存
方法时,值已经被重置。在我有更多关于它们的信息之前,我无法评论为什么在其他地方使用相同的代码。可能是其他地方没有在用户控件的页面加载中重置ted值
myCont.Save();
public partial class MyControl: System.Web.UI.UserControl
{
public int ControlID
{
get
{
if(ViewState["ControlID"]==null)
return 0;
return int.Parse(ViewState["ControlID"].ToString());
}
set
{
ViewState["ControlID"] = value;
}
}
....
}