在webconfig中<authentication mode="Forms">
      <forms loginUrl="LOGIN.aspx" defaultUrl="MAIN_MNU.aspx" name="Page1" timeout="60" path="/"/>
    </authentication>
    <authorization>
      <deny users="?"/>
    </authorization>
这样设置的。
在页面 a.aspx中,有一个hyperlink链接用来下载文件的。url="dl.aspx?id=1"文件下载时弹出来一个文件对话框。打开,保存,取消。
在a页面不做任何处理等待过了60分钟后,点文件下载的连接,这个时候转移到了LOGIN.aspx
输入用户名和密码,点登陆这个时候 文件下载对话框弹出来了。不论打开,取消,还是保存。以后再点登陆还是弹出来文件对话框。反复如此。ps LOGIN.aspx 登陆功能是用 login控件实现的。

解决方案 »

  1.   

    这不是在dl.aspx里做session判断吗?
      

  2.   

    可以这样吗? 60分钟后如果没有操作记下 链接地址放在session里
    这时候 再点会到login页面 用户再次登录之后 先判断一下session是否有值。  有值直接转向那页 应该会直接弹出下载框
     没有值正常转向
      

  3.   

    多谢。这里用session保存链接来判断,不大现实。
      

  4.   

    肯定的阿你用的这种方式在登录后是会自动跳转到最后浏览的页面。所以当Session失效后,你点下载的时候首先是进入 LOGIN.aspx页面做登录,登录成功后就直接返回到dl.aspx页面。你可以改写一下下载的按钮实现功能。
    hyperlink链接用来下载文件的。url="dl.aspx?id=1" 不要用直接用超级链的方式。
    用服务器端注册脚本的方式来做。这样应该可以解决这个问题。
      

  5.   

    如果dl.aspx这个文件里不需要取Session里的相关信息,你就干脆把dl.aspx里的验证给去掉,这样是最简单的。。
      

  6.   

    下载文件的地方,是hyperlink控件。gridview中的一列。请问怎么用服务器端注册脚本的方式。我不是很明白。
    dl.aspx 这个文件里面没有用到什么session ,dl.aspx里的验证是什么,没有什么验证呀。就是根据id取出来
    文件路径下载。
    能不能在详细说一下。谢谢
      

  7.   

    了解了。。根据楼主的描述,你的下载方式是刷新当前的页面,所以会造成这种问题。所以,将下载方式换成弹出页面下载,将dl.aspx里的验证去除就可以了。
    方法参考下面代码:
     protected void gv_List_RowDataBound(object sender, GridViewRowEventArgs e)
            {
                if (e.Row.RowIndex >= 0)
                {
                    LinkButton lkBtn = (LinkButton)e.Row.FindControl("lkbtn_Edit");
                    if (int.Parse(((DataRowView)e.Row.DataItem).Row["Data_State"].ToString()) == 0)
                    {
                        BtnDel.Enabled = true;
                        BtnDel.Attributes.Add("onClick", "return btnDel()");                    lkBtn.Text = "修改";
                        lkBtn.Attributes.Add("onClick", "return btnEdit(\"" + ((DataRowView)e.Row.DataItem).Row.ItemArray[0].ToString() + "\")");
                    }
                }
            }
    /// <summary>
            /// 显示操作信息,并关闭窗口
            /// </summary>
            /// <param name="strMsg"></param>
            private void ShowMsgCloseWindows(string strMsg)
            {
                ClientScript.RegisterStartupScript(this.GetType(), "Message", "<Script>alert(\"" + strMsg + "\");window.returnValue=\"ReLoad\";window.close();</Script>");
            }
      

  8.   

    你给出的例子是两种方法,用哪一个都可以吗?还有将dl.aspx里的验证去除  这句话什么意思,这个下载页没有什么验证呀
      

  9.   

    2种方法都可以用,是一样的东西,只不过一个是在页面上写js,一个在后台生成js.
    这里的dl.aspx的验证是指Session验证,如果你是用的现有的框架,页面不是继承System.Web.UI.Page,那么就把dl.aspx里的继承改成System.Web.UI.Page.
    通常会在一个基础类里加上/// <summary>
            /// 初始化
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            protected void Page_Init(object sender, EventArgs e)
            {
                if (Session["UserInfo"] == null)
                {
                    FormsAuthentication.SignOut();
                    FormsAuthentication.RedirectToLoginPage();
                    Response.End();
                }
            }所以当dl.aspx继承了这个基础类的时候,会在Page_Init里验证Session是否失效。