背景: 我正在开发一个现有的 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);
}
如果您需要更多详细信息,或者我的问题不够清楚,请告诉我!