每个浏览器选项卡的不同ASP.NET会话

时间:2018-01-24 16:36:28

标签: c# asp.net session

是否可以不在不同的浏览器标签之间共享会话变量?

我想在标签页之间保留一个登录会话,但不想在打开的标签页之间共享信息。

有可能吗?

2 个答案:

答案 0 :(得分:2)

没有。对于由您的浏览器控制的会话cookie,这是不可能的。如果cookie在其他标签中重复使用,你无法控制(通常他们会这样做,但浏览器供应商可能会偏离它)。

您可能正在寻找“视图状态”,隐藏的输入字段或类似的方法让状态随页面一起移动而不是会话。

答案 1 :(得分:1)

您可以实现自己的PageSession,它基本上会为您的会话变量添加前缀。一开始可能听起来很大,但这不是什么大问题。

创建一个基页

首先,让我们创建一个BasePage类。此类将是继承自Page

的普通类

我们将在那里创建一个名为PageInstanceUID

的属性
public string PageInstanceUID 
{
    get
    {
        ViewState["PageInstanceUID"];
    }
    set
    {
        ViewState["PageInstanceUID"] = value;
    } 
}

然后我们在加载时为该属性分配一个唯一值:

if(!IsPostBack)
{
    PageInstanceUID = new FileInfo(Request.PhysicalPath).Name + Guid.NewGuid().ToString();
}

创建PageSession类

PageSession类也非常简单:

public class PageSession
{
  readonly BasePage _parent;

  public PageSession(BasePage parent)
  {
    _parent = parent;
  }


  public object this[string name]
  {
    get
    {
      return _parent.Session[GetFullKey(name)];  
    }
    set
    {
      _parent.Session[GetFullKey(name)] = value;

    }
  }

  public string GetFullKey(string name)
  {
    return _parent.PageInstanceUID + name;
  }
}

在BasePage类中创建PageSession

现在您需要在BasePage中创建一个PageSession类。

 public PageSession PageSession
 {
   get
   {
     return _pageSesion;
   }
 }

连接点

最后,修改您的网页以继承BasePage而不是Page