混合Webforms / MVC应用程序中的会话状态

时间:2013-10-25 02:11:10

标签: c# asp.net asp.net-mvc-4 webforms session-state

背景 我正在处理现有的Webforms站点,我们正在转换为MVC 4.我们也在更新UI,因此正在制作新的MVC Layout页面来替换旧的webforms母版页。我们无法一次将所有aspx页面升级到mvc,因此为了保持站点的一致外观,尚未转换的现有aspx将在MVC布局中呈现。我们使用MVC路由将诸如〜/ pageName.aspx的URL发送到MVC Controller(具有相应的视图),该MVC Controller使用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控制器之前,这一切都运行正常(即,它只是作为没有MVC参与的原始WebForms应用程序运行)。另外,作为测试,我尝试在控制器操作方法中设置会话变量,然后在.aspx.cs文件中检索它,该文件工作正常,所以我想必须有一些东西在通过MVC路由时清除会话。 / p>

完整性这里是相关的路线映射

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);
}

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

1 个答案:

答案 0 :(得分:0)

通过调查我遇到的另一个问题,我现在发现应该责备UpdatePanel。由于updatePanel而重新加载页面,并且由于路由,MVC控制器操作会将其选中。这会导致重新呈现整个页面,而不仅仅是原始webforms中发生的updatePanel。

修复我要进行另一个路由映射以收集具有相应标题详细信息的内容,然后只发送updatePanel字符串以进行渲染....希望能为我的两个问题创造奇迹!