我的项目有像
这样的结构的Login.aspx
//oracle_connection'
pasrsing data from Oracle
private string ResultPassport = string.Empty;
public string PassportResult
{
get
{
return ResultPassport;
}
set
{
ResultPassport = value;
}
}
Login obj = new Login();
obj.PassportResult = dr.GetString(0);
Info.aspx
protected void Page_Load(object sender, EventArgs e)
{
Login obj = new Login();
TextBox3.Text = obj.PassportResult;
}
问题是,我无法在Info.aspx中看到结果
我的错误在哪里?
答案 0 :(得分:3)
你为什么期望?
您正在创建一个新的Login
对象:
Login obj = new Login();
然后您访问该新对象的属性:
obj.PassportResult
该财产是什么?:
private string ResultPassport = string.Empty;
public string PassportResult
{
get
{
return ResultPassport;
}
set
{
ResultPassport = value;
}
}
默认情况下,该值为string.Empty
。所以你按预期得到了string.Empty
。
(旁注:该属性和支持变量的命名只是乞讨这些天的StackOverflowException
。您可能想要选择更清晰的名称来区分属性与变量。)
您确实在上一个对象上设置了一个值:
Login obj = new Login();
obj.PassportResult = dr.GetString(0);
但那不是同一个对象。如果要从该对象获取值,则需要访问该对象。除非值为static
(可能不是您想要在Web应用程序中执行的操作),否则您需要维护对同一实例的引用,或者在某处保留并检索它。
这与ASP.NET无关。这就是C#(以及任何语言,真正)的工作原理。在一个对象上设置值不会影响其他对象。
有许多选项可以将该对象的状态从一个页面传递到另一个页面。你在这里做的最直接的可能就是使用会话状态。像这样:
Login obj = new Login();
obj.PassportResult = dr.GetString(0);
Session["PassportResult"] = obj;
然后在后面的页面中:
Login obj = (Login)Session["PassportResult"];
这有一些缺点,特别是在可扩展性方面。当然,在尝试检索和转换对象之前,您还需要进行一些错误检查以确保对象存在。但在大多数情况下,这应该可以完成工作。
这里的真正令人困惑的是你为什么要创建Page
个对象的实例并为它们设置值。如果你退后一步并描述你实际上想要在这里完成的性质,那么可能有一种更简单的方法。例如,在URL或表单元素中传递值将非常简单,并且如果它只是一个字符串值,则可以更有效地扩展。 (虽然缺点是用户可以编辑它,所以这可能是一个问题。)
答案 1 :(得分:1)
事情不会那样奏效。首先,在Info.aspx中,创建另一个对象Login,这意味着它是Heap内存中的新对象,并且您的字段为空。要在页面之间传递信息,您可以使用:
或者您可以使用PreviousPage
属性,如下所示:
if (PreviousPage != null)
{
TextBox SourceTextBox =
(TextBox) PreviousPage.FindControl("TextBox1");
if (SourceTextBox != null)
{
Label1.Text = SourceTextBox.Text;
}
}