背景: 我在現有的Web表單現場工作,我們正在轉換爲MVC 4,我們還更新了UI都制定了新的MVC佈局頁,以取代舊的WebForms母版頁面。我們無法將所有aspx頁面一次升級到mvc,因此爲了保持網站的一致外觀,尚未轉換的現有aspx將在MVC佈局內呈現。我們使用MVC路由將〜/ pageName.aspx之類的URL發送給一個MVC控制器(具有相應的視圖),該MVC控制器使用Server.Execute獲取要呈現到MVC布局中的aspx主體。到目前爲止它工作正常。會話狀態的混合Web表單/ 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路由時必須有一些清除會話。
的完整性這裏是有關路由映射
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);
}
如果您需要了解更多信息或我沒有足夠清楚我的問題, 請告訴我!
噢,是的,忘了提及我想盡量保留原始代碼 - 我希望能通過設置MVC(或者在控制器等)來解決這個問題,而不是改變它aspx和相關代碼如何工作。 – Bindi