将数据从一个ASP.NET页面传递到另一个ASP.NET页面

时间:2011-01-31 19:09:22

标签: asp.net global-variables

好的,这是web dev中非常常见的场景,有一个非常常见的解决方案。所以我正在寻找的是任何替代解决方案。

我在PageA中有一些数据,我正在重定向到需要此信息的PageB。我可以将它存储在查询字符串中,但让我们假装它太复杂了,或者我只是不想在查询字符串中。

所以我把它放在Session中。然后当我到达PageB时,我将其从会话中删除。这就是我们一直在做的事情。

问题是,Session是一包全局变量。全球变量不好的所有教科书原因都不好。我们将在应用程序的其他部分中检查该变量并根据其值来做一些事情。然后我们想要改变它,所以我们必须找出它的设置位置,只有它被设置在任何地方。现在,我们需要深入了解用户如何到达PageZ以了解该变量的设置方式。

所以,如果我真的讨厌全局变量和意大利面条代码,那还有其他选择吗?

3 个答案:

答案 0 :(得分:2)

使用

 Page.PreviousPage

Property(获取将控件转移到当前页面的页面。)

  

在某些情况下,你可能会   想要将一个页面发布到另一个页面。   例如,您可能正在创建一个   收集的多页表单   每页上的不同信息。在   那种情况下,你可以配置一定的   控件(实现控件的那些)   IButtonControl接口,如   按钮控件)在页面上发布到   一个不同的目标页面。这是   称为 cross-page posting 。   跨页发布提供了一些   使用Transfer的优势   重定向到另一个页面的方法。

假设您从PageA跳到_PageB:

public partial class _PageB : System.Web.UI.Page
{
    public void Page_Load(object sender, EventArgs e)
    {
        Page PageA = Page.PreviousPage;

        //............... etc

答案 1 :(得分:1)

我不确定为什么你需要知道变量能够使用它的人和设置者。但是,如果我理解正确,你可能只是不喜欢使用Session []要求你依赖的神奇字符串。在这种情况下,为什么不将Session对象包装在辅助类中呢?也许是这样的:

class SessionHelper{
  const string FAVORITE_COLOR_KEY = "favcolor"
  public static string FavoriteColor {
    get { return Session[FAVORITE_COLOR_KEY]; }
    set { Session[FAVORITE_COLOR_KEY] = value; }
  }
}

这样你就可以随时将魔法字符串“favcolor”更改为你想要的任何内容而不会破坏任何代码。

答案 2 :(得分:1)

最简单的解决方案,我认为(仍然使用会话):创建一个拥有你想要的所有东西的对象。将该对象存储在会话中,其名称为GUID(不可重用)。重定向只在查询字符串上传递一个GUID。然后,您知道如何访问所需的数据。在对象上设置您想要的生命周期。

它仍然是kludgy。但是它有效,并且不会在查询字符串上公开所有内容,而且应用程序中的其他内容也不会查找特定的会话密钥名称。他们必须枚举会话变量才能得到它。