我在showModalDialog中打开一个超链接,target="_blank"
在新弹出的页面中会发生Session丢失的现象,我监测SessionID发现新页面中SessionID和父页面不一致了.说明新窗口中又重新建了一个回话.另外,这种现象不是每次都有,但是偶尔会发生.
但是我在Web.config中配置了如果SESSION为空就会跳到登录页.所以我在点开这个超链接的时候会打开一个登陆页-_-!
请教高人指点一下怎么改,谢谢了.
PS:网上有一种在打开模态对话框时将父页的window作为参数传递进来,然后通过dialogWindowArgs.open弹出新界面的方法,但是我们公司大多数人(特别是领导)的IE7都设置成了"遇到新窗口时直接在新选项卡中打开",所以如果是超链接设置为target="_blank"时会弹出新页面;而以window.open方式打开的话会以新选项卡方式打开,就必须先关闭模态对话框才能点开那个新选项卡-_-!项目是给公司自己用的OA,所以要照顾大多数人(特别是领导)的习惯...

解决方案 »

  1.   

    或者把session用StateServer模式 而不是默认的InProc模式看看
      

  2.   


    现在不可能改成用cookie了,这东西都用好几年了.只不过刚新加一个功能.
    session用StateServer模式的话运行起来会有问题,这个就更麻烦了.
    我想找一种在showModalDialog下不丢失SESSION的方法.
      

  3.   

    晕了,刚换成showModelessDialog后,SessionID相同的情况下还会跳到登陆页-_-!
      

  4.   

    丢失session是不是因为.Timeout了   
      设置session.timeout=一个更大的值 
      

  5.   

    请确定 !你页面开启的循序!! open 代表 window.open 
    modal 代表 window.showModalDialog 
    Y session 不会丢失 
    N session 会丢失 open/open/open Y /Y/Y modal/modal/modal Y/Y/Y open/modal/open Y/Y/N modal/open/modal Y/N/N Open/modal/modal Y/Y/Y Modal/open/open Y/N/N 你看看 你的页面打开模式 属於那种!!是否是丢失数据去情况 补充: 你这种 情况是 open 一个页面 再modal 
    在modal 里面提交 
    modal 里面是不允许提交的 
    提交就丢失数据 
    你可以 将 modal 处理后的 值 放到 父窗体 里面去 然后再提交,,, 
    由父窗体 去提交 
      

  6.   

    从 HTML 模式或无模式对话框可能没有打开同一进程中 InternetExplorer 窗口中打开,因此模式窗口中调用 window.open()方法打开具体页面,可能造成session 丢失.例如:主窗体a.aspx,点击按钮时采用window.showModalDialog,打开弹出窗体b.aspx,b.aspx为模式窗体,然后在b.aspx窗体中再用window.open方式打开窗体c.aspx时,session会丢失。   解决方法:
          思路: 调用 a.aspx window 的 open 方法打开      a.aspx 中window.showModalDialog 调用方法传递 dialogArguments属性为 window 对象
          window.showModalDialog("b.aspx",window,"....") ;      b.aspx 中
          var openobj = window;
    if(typeof(window.dialogArguments) == "object")
    {
        openobj =  window.dialogArguments;
    }
     openobj.open("c.aspx");   这样处理 c.aspx中 Session就不会丢失了。 
    文章出处:http://www.diybl.com/course/4_webprogram/asp.net/netjs/2007112/82071.html
      

  7.   


    所有的页面(除了模态对话框以外)都被加上了脚本(js文件),一但运行就最大化了-_-!
    所以这个模态对话框尽量还是不要去掉.否则就没有这个效果了.也想过以DIV的形式代替模态框...但,改动量还是有点大了.
      

  8.   

    是有这种问题.可以这样解决
    <a href="Default2.aspx?session=<%=Session["a"]%>" target="_blank">test</a>
      

  9.   


    我遇到的是最后一种Modal/open/open Y/N/N 
    你说的这个方法我在问题里已经描述过了啊.当IE7设置为"遇到弹出窗口时以新选项卡方式打开",就会造成用户体验的问题了,我必须关闭模态对话框才可以去打开那个页面.
      

  10.   

    如果你用 "_blank",  session肯定会是新的session的.
    你要非这样做就用url传参过去.
      

  11.   

    我是这样写的,您看下对不对?HyperLink hl = (HyperLink)e.Row.FindControl("hlTitle");
                hl.NavigateUrl = "DEV_form.aspx?InstanceID="+GVW_Dev.DataKeys[e.Row.RowIndex].Value.ToString()+
                    "&PackageID=" + ((DataRowView)e.Row.DataItem)["PackageID"].ToString() +
                    "&CurrentStep=DisplayMode&Session="+GetCurrentLoginUserName();模态框里放的是GridView,用了模板列.最后一个参数将当前登陆的用户名传递过去了.
    可是还是不行啊.
      

  12.   

    有个朋友告诉我用这种方式hl.NavigateUrl = "DEV_form.aspx?InstanceID="+GVW_Dev.DataKeys[e.Row.RowIndex].Value.ToString()+
                    "&PackageID=" + ((DataRowView)e.Row.DataItem)["PackageID"].ToString() +
                    "&CurrentStep=DisplayMode&ASP.NET_SessionID="+Session.SessionID;但也不行,跳转到登陆页面后,SessionID和我父页的SessionID是相同的,这说明Session没有对啊,但为什么会跳到登录页呢...想不通.
      

  13.   

    你传sessionid有什么用?
    如果你要跳转到的那个页面对session做了验证.比如说判断session是否为null,为null就跳到登录页.如果你做了这样的判断那肯定会跳到登录页的.因为你"_blank"后弹出的页面是个新页面.session也是新的.
      

  14.   


    传过去后要用Request[""]去取.
    session的值传过去了.但是新开页面的session还是新的.
      

  15.   


    HyperLink hl = (HyperLink)e.Row.FindControl("hlTitle");
    hl.NavigateUrl = "DEV_form.aspx?InstanceID="+GVW_Dev.DataKeys[e.Row.RowIndex].Value.ToString()+
                    "&PackageID=" + ((DataRowView)e.Row.DataItem)["PackageID"].ToString() +
                    "&CurrentStep=DisplayMode&Session="+GetCurrentLoginUserName();
    那我按您说的是这么写的,对吗?
    Session还是会丢
      

  16.   

    应该对吧.你看一下url上对吗.url对就是对了.
    先把你DEV_form.aspx页中对session判断为null就跳到登录页面的语句注释了看一下url
      

  17.   

    我没有判断SESSION为空啊.这个功能是在Web.Config里:<!--下面的配置将指定ASP.NET使用FormsAuthenticationModule类-->
    <authentication mode="Forms">
    <forms loginUrl="Login.aspx" protection="All"/>
    </authentication>
    <!--站点所有页面都拒绝所有匿名用户-->
    <authorization>
    <deny users="?"/>
    </authorization>
      

  18.   


    哦.用的forms验证啊.
    登录的时候把 FormsAuthentication.SetAuthCookie(userName, true);第二个参数改成true
      

  19.   

    把你登录里边这两行代码都改成true,我测试了一下.可以了.
    FormsAuthentication.SetAuthCookie(userName, true);
    FormsAuthentication.RedirectFromLoginPage(userName, true);
      

  20.   

    不好意思,又试了一下.只要改这一个就行了.另一个语句不用改,如果你不想存永久cookie的话
    FormsAuthentication.RedirectFromLoginPage(userName, true);这个改语第二个参数改成true后,就再链到那个新页面就不会反回登录界面了.
      

  21.   

    net下导致Session失效的一种情况:js教本中使用window.open和window.showModalDialog时需要注意   
                      在项目中碰到过一种情况先用window.open打开1.aspx,1.aspx中用window.showModalDialog打开2.aspx,2.aspx中用window.open打开3.aspx,那么在3.aspx中取不到Session中的值。     
                    于是我先做了一个default.aspx页面,向Session中存入值,在后面的三个页面中,分别去取Session中的值。三个页面的打开方式不一样,共6钟情况,测试结果如下:     
        
                    打开顺序     
        第一个页面     
        第二个页面     
        第三个页面     
          
      open/open/open     
        Y     
        Y     
        Y     
          
      modal/modal/modal     
        Y     
        Y     
        Y     
          
      open/modal/open     
        Y     
        Y     
        N     
      modal/open/modal     
        Y     
        N   N     
      Open/modal/modal     
        Y     
        Y     
        Y     
          
      Modal/open/open     
        Y     
        N   N     
        
                    Open/modal/open指页面1,2,3的打开方式,用open打开页面1,页面1用modal打开页面2,页面2用open打开页面3。     
        
      “Y”表示可以取到Session中存入的值;“N”表示不能取到Session中存入的值。     
        
      测试环境win2000,ie6.0+sp1,多数情况下会出现;win2003,ie6.0+sp2,总是出现。     
        
                    modal打开页面后,在打开的页面再open打开新页面时,在新开的页面总会出现Session丢失的问题,所以,在脚本中使用window.showModalDialog打开页面后慎用window.open打开页面,会导致Session取不到。大家可以测试一下。     
        
                    深入考虑,是不是modal打开的页面再用open打开另一个页面时,ie认为这是新开了一个线程?总而言之,这是ie的一个bug吧。
      

  22.   


    hl.NavigateUrl = "DEV_form.aspx?InstanceID="+GVW_Dev.DataKeys[e.Row.RowIndex].Value.ToString()+
                    "&PackageID=" + ((DataRowView)e.Row.DataItem)["PackageID"].ToString() +
                    "&CurrentStep=DisplayMode&Session="+GetCurrentLoginUserName();
    那这句还用写吗?
    项目是用的MemberShip,我不知道里面写没写您那两句话,如果我在登录页写了会对项目造成影响么?
      

  23.   

    那这句还用写吗? 
    项目是用的MemberShip,我不知道里面写没写您那两句话,如果我在登录页写了会对项目造成影响么?MemberShip应该也会有FormsAuthentication.RedirectFromLoginPage这样的语句.你查一下你的项目里,应该有的
    那个语句你要是传就写吧.你用的forms验证,直接HttpContext.Current.User.Identity.Name就能取到用户的.
      

  24.   


    非感谢您!我不是用Session传东西,只是因为Form验证的原因导致一丢Session就跳登陆页.很让人头疼.
    因为这个问题不是每次都出现的,所以我需要反复登录然后测试一下,如果没有问题的话下午就结帖~
      

  25.   

    非感谢您!我不是用Session传东西,只是因为Form验证的原因导致一丢Session就跳登陆页.很让人头疼. 
    因为这个问题不是每次都出现的,所以我需要反复登录然后测试一下,如果没有问题的话下午就结帖~
    ============
    把这个改成true就好了.
    FormsAuthentication.RedirectFromLoginPage(userName, true);第二个参数的意思是
    若要创建持久 Cookie(跨浏览器会话保存的 Cookie),则为 true;否则为 false。 如果你不是持久cookie,那么cookie是基于浏览器进程的.所以你"_blank"新开页面会跳到登录页面.把RedirectFromLoginPage方法的第二个参数改为true可解决这个问题
      

  26.   

    我发现加了那句话以后就会将登录的信息记录到cookie里了吧?
    也就是原始的Form验证+cookie的机制了.
      

  27.   

    如果楼上各位的回答还不能解决你的问题的话,可以考虑用window.showModalDialog()打开页面传参数方法,或者直接用弹出层的方法来解决问题
      

  28.   

    把SESSION的值一起当作参数传过去行不?
      

  29.   

    把Session的值做参数传过去吧,模态窗口是有这个问题。
      

  30.   

    false:cookie是基于当前浏览器进程的.
    true:持久 Cookie(跨浏览器会话保存的 Cookie)你通过"_blank"打开的新页面就相当于跨浏览器会话了.所以要把参数改为true
      

  31.   


    设置为true的时候我想最后关闭主界面的时候把这个Cookie清掉,因为我不想下次访问页面的时候不登录而直接访问了...
    这个该怎么搞呢?参数为true时的这个Cookie时间限制可以改吗?
      

  32.   

    设置为true的时候我想最后关闭主界面的时候把这个Cookie清掉,因为我不想下次访问页面的时候不登录而直接访问了... 
    这个该怎么搞呢?参数为true时的这个Cookie时间限制可以改吗?
    ====
    要执行                
    FormsAuthentication.SignOut(); 进行注销
      

  33.   

    设置为true的时候我想最后关闭主界面的时候把这个Cookie清掉,因为我不想下次访问页面的时候不登录而直接访问了... 
    这个该怎么搞呢?参数为true时的这个Cookie时间限制可以改吗? 
    =======
    你自己试一下.设置true的时候,关闭你的ie.然后再打开.应该还是要重新登录的.FormsAuthentication.RedirectFromLoginPage(userName, true); //只改这一句的为true就好了.其它的不用改.