2010-03-16 50 views
0

所以这是该方案:如何使用Response.AddHeader(“refresh”,“seconds”)创建server.transfer()并且不会收到404错误?

我对所有的登录控制页面的基类:

public class SessionControlledPage : Page 
{ 
    protected virtual void Page_Load(Object sender, EventArgs e) 
    { 
     Response.AddHeader("Refresh", Convert.ToString(Session.Timeout * 60 + 5)); 
     if (Session.IsNewSession) 
     { 
      Response.Redirect("~/login.aspx"); 
     } 
    } 
} 

而一个regularpage.aspx页,从基类inherints:

public partial class RegularPage : SessionControlledPage 
{ 
    override protected void Page_Load(Object sender, EventArgs e) 
    { 
     base.Page_Load(sender, e); 

     Server.Transfer("~/otherpage.aspx"); 
    } 
} 

现在我们假设原始网址为http://localhost/regularpage.aspx,而Session.Timeout = 5。传输发生后刷新发生时会出现问题。我收到一个404 Not Found错误,并且URL更改为http://localhost/305。请注意,5 * 60 + 5 = 305

您知道为什么会发生这种情况?得到了解决方案?

PD:我使用转移,因为我需要访问otherpage.aspx上的regularpage.aspx的一些属性,也许您可​​以为此提供另一个解决方案。

回答

1

如果你打算做的是调用Server.Transfer,那么调用base.Page_Load的理由很少。你究竟想要完成什么?如果您只是访问某些属性,则需要将其抽象为一些不依赖于Page对象的业务逻辑。

这也是导致404问题的原因......要发生这种情况,问题必须出现在页面的呈现输出中(检查出来)。好像你在meta-refresh标签之后立即删除了一个页面,然后开始一个新页面,而ASP.NET只是把它全部转储到同一个响应流中。总之,你做错了。 :)你也许可以通过一个良好的Response.Clear()来解决这个问题,但这不是真正的问题......而且你会失去刷新标记。

+0

感谢Bryan,实际上server.transfer()不在page_load中是另一个方法(这是一个例子),并且在页面上执行搜索并且单击一个结果后调用该方法,我使用与链接相关联的信息将其传递给其他页面。我调用base.Page_Load()是因为我重写了基类的Page_Load方法,并且由于页生命周期中的执行顺序,子页Page_Load中的代码将在父类的Page_Load之前执行,我需要在父页Page_Load代码之前执行而不是之后执行。 – Unlimited071 2010-03-18 13:36:26

+0

@Bryan您能否告诉我更多关于抽象业务逻辑的知识,以及如何使用它?我只需要从'普通页面'基本上3个整数代码的一些简单的信息。谢谢。 – Unlimited071 2010-03-18 13:39:18

+0

无法告诉你如何在不知道你想要做什么的情况下做到这一点。但总的来说,任何精心设计的ASP.NET应用程序都会在表示层代码中尽可能少地执行任务,并将任务卸载到业务逻辑层中。 265个字符不足以解释这一点!你解决了原来的问题吗?你没有回应... – Bryan 2010-03-18 18:02:24

相关问题