背景: MVC 4 に変換している既存の Webforms サイトに取り組んでいます。UI も更新しているため、古い Webforms マスター ページを置き換える新しい MVC レイアウト ページを作成しています。すべての aspx ページを一度に mvc にアップグレードすることはできないため、サイトの一貫した外観を維持するために、まだ変換されていない既存の aspx が MVC レイアウト内にレンダリングされます。MVC ルーティングを使用して ~/pageName.aspx などの URL を MVC コントローラー (対応するビューを含む) に送信します。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 コントローラーを使用して作業する前に、これはすべて正常に機能します (つまり、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);
}
詳細が必要な場合、または質問で十分に明確でない場合は、お知らせください。