0

背景: 我正在开发一个现有的 Webforms 站点,我们正在将其转换为 MVC 4。我们也在更新 UI,因此正在制作新的 MVC 布局页面来替换旧的 Webforms 母版页。我们不能一次将所有 aspx 页面升级到 mvc,因此为了保持网站外观一致,尚未转换的现有 aspx 将呈现在 MVC 布局中。我们使用 MVC 路由将 ~/pageName.aspx 等 url 发送到 MVC 控制器(带有相应的视图),该控制器使用 Server.Execute 获取 aspx 的主体以呈现到 MVC 布局中。到目前为止,它工作正常。

问题: 在现有 aspx 代码后面的几个地方设置了一些 SessionState 项。由于某种原因,当页面被重定向(即它再次通过 MVC 控制器)时,我无法发现 sessionState 是空的。什么会导致这个/我在哪里可以解决我的问题?设置会话变量的示例如下。

.aspx

<asp:UpdatePanel ID="SignaturesUpdatePanel" runat="server">
    <ContentTemplate>
        <div>
            Signatures for your login are <asp:Literal ID="SignaturesStatusLiteral" runat="server" />.<br />
            <asp:LinkButton ID="SignaturesButton" Text="Turn signatures off temporarily" runat="server" OnClick="SignaturesButton_Click" />
        </div>
    </ContentTemplate>
</asp:UpdatePanel>

.aspx.cs

protected void SignaturesButton_Click(object sender, EventArgs e)
{
    var signaturesDisabled = Session["SignaturesDisabled"];
    bool disabled = signaturesDisabled == null || !bool.Parse(signaturesDisabled.ToString());
    Session["SignaturesDisabled"] = disabled;

    if (disabled)
    {
        SignaturesButton.Text = "Turn signatures on";
        SignaturesStatusLiteral.Text = "off";
    }
    else
    {
        SignaturesButton.Text = "Turn signatures off temporarily";
        SignaturesStatusLiteral.Text = "on";
    }
}

显然,在我使用 MVC 控制器之前,这一切都很好(即,当它只是作为原始 WebForms 应用程序运行而没有 MVC 参与时)。此外,作为一个测试,我尝试在控制器操作方法中设置一个会话变量,然后在 .aspx.cs 文件中检索它,它工作正常,所以我想当它通过 MVC 路由时,一定有一些东西可以清除会话。

为了完整起见,这里是相关的路线映射

routes.MapRoute(
    name: "Project File Pages",
    url: "{page}.aspx",
    defaults: new { controller = "Legacy", action = "ProjectFileLayout" }, 
    constraints: new { file = new QueryStringConstraint() }
);

和(精简)MVC 控制器动作方法

public ActionResult ProjectFileLayout(int file)
{
    var url = GetCurrentPageUrl();
    var sw = new StringWriter();
    Server.Execute(url, sw, true);

    ...

    var model = new LegacyViewModel
    {
        Body = sw.ToString(),
        ...
    };
    return View(model);
}

如果您需要更多详细信息,或者我的问题不够清楚,请告诉我!

4

1 回答 1

0

通过调查我遇到的另一个问题,我现在发现应该归咎于 UpdatePanel。由于 updatePanel 和路由,页面被重新加载,MVC 控制器操作将其拾取。然后,这会导致整个页面被重新呈现,而不是像在本机 Web 表单中那样只重新呈现 updatePanel。

为了解决这个问题,我将制作另一个路由映射来收集具有相应标题详细信息的内容,然后发送要呈现的 updatePanel 字符串....希望对我的两个问题都产生奇迹!

于 2013-10-25T02:59:28.687 回答