【问题标题】:ASP.NET master page errorASP.NET 母版页错误
【发布时间】:2012-08-14 11:57:40
【问题描述】:

母版页被调用两次。呈现整个页面后一次。此时isPostback 值为false,SESSION 为null。

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        //SOME CODE

        try
        {
            strUserId = Session[USERID].ToString();
        }
        catch
        {
            Response.Redirect("error.aspx");
        }
    }
}

对于母版页的第一页加载(在页面呈现之前),一切都很好。再次渲染后调用母版页的 page_load。这次访问 SESSION 是一个异常:

HttpException(会话状态只能在 enableSessionState 设置为 true 时使用,无论是在配置文件中还是在 Page 指令中。还请确保 System.Web.SessionStateModule 或自定义会话状态模块包含在 @ 987654322@ 应用程序配置中的部分。)。

如果 page_load 被调用两次或三次,我没有任何问题。我只是不想在第二页加载时访问 SESSION。

编辑 2

由于我之前监督过的这段代码(当前 Global.asax 文件),正在加载第二个母版页

 void Application_Error(object sender, EventArgs e) 
    {         
       Server.Transfer("~/ErrorMessage.aspx");
    }

ErrorMessage.aspx 页面是母版页的子页面:(

但仍然回答的问题是,为什么即使在成功呈现页面时也会生成 Application_Error()?我试图在 Application_Error() 处保留一个断点,并且每次事件 args 都是空的。

【问题讨论】:

  • “母版页被调用两次”是什么意思?你是怎么得出这个结论的?
  • 你需要的远不止这些。请发布您的 MasterPage 以及相关子页面的代码隐藏,以便我们更好地了解您在说什么。
  • @Andre Calil:我在母版页的页面加载时设置了一个断点。它在页面渲染之前被调用,然后在页面渲染之后被调用。
  • 子页面是否有任何启用 AJAX 的控制器?每个子页面都会发生这种情况吗?
  • error.aspx 是否也使用相同的 MasterPage?

标签: c# asp.net


【解决方案1】:

尝试将以下代码添加到您的 Web.config 文件中 - 您可能必须将其移植到其中,因为我不知道它目前的样子。您可以参考此post 以查看整个对话和条件。

<system.webServer>
    <modules>
         <!-- UrlRewriter code here -->
         <remove name="Session" />
         <add name="Session" type="System.Web.SessionState.SessionStateModule" preCondition="" />
    </modules>
</system.webServer>

编辑 1

问题很可能与您试图在母版页的ASPX 页面中连接事件处理程序有关。这总是会导致诸如访问Session 甚至Application 变量之类的问题。所以,请尝试以下方法:

  1. 从ASPX 文件中删除标记的事件处理程序。
  2. 在母版页的构造函数中放置以下代码。

构造函数代码

public MasterPage()
{
    this.Load += new EventHandler(Page_Load);
}

然后在同一个处理程序中运行你一直在运行的代码。

编辑 2

检查您的Web.config,看看它是否正确设置了以下部分。

<system.web>
    <pages enableSessionState="true" />
    ...
</system.web

【讨论】:

  • 添加了您的代码,但仍然发生同样的事情。您能否建议一种方法来检测第二次调用主页面加载。这样我就不会在第二次加载时访问 SESSION,这将有助于避免异常
  • @Rajneesh - 这个处理程序连接到哪个页面?编辑问题以显示事件处理程序添加以及它存在于哪个页面。
  • @ Mike - 事件处理程序存在于 MasterPage.aspx.cs 文件中。 AutoEventWireup="true" 在 MasterPage.aspx 中设置。我希望这能回答你的问题
  • @Rajneesh - 这可能是你的问题。我将编辑我的帖子,向您展示另一个代码块。
  • @Rajneesh - 看看我的编辑,让我知道你发现了什么。我知道它有时会起作用,但我只想涵盖所有基础。
【解决方案2】:

我想我已经找到了问题的原因,在检查了 firebug 中的请求之后。一些 ajax 请求是针对两个不存在的 .gif 文件。因此,调用了 Global.asax 中的 Application_Error()。那里产生的异常是“找不到文件”。然后在Application_Error()中有一个Server.Transfer("~/ErrorMessage.aspx")。不幸的是,ErrorMessage.aspx 是母版页的子页。因此,在每个页面上都发出 AJAX 请求,导致“找不到文件”异常,然后将其传输到 ErrorMessage.aspx,看起来母版页 page_load 被调用了两次。

【讨论】:

  • @Rajnessh - 很好的发现,我以前也经历过。根据我的经验,它在 IE 中最为普遍。
【解决方案3】:

错误描述告诉您检查使用Session 的设置。您是否检查过该设置 (enableSessionState)?

另外,请检查 error.aspx 是否不使用母版页,直到您知道它可以更好地工作,否则您可能会遇到一些奇怪的错误...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多